3 * This program is free software; you can redistribute it and/or modify it
4 * under the terms of the GNU General Public License as published by the
5 * Free Software Foundation; either version 2, or (at your option) any
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 675 Mass Ave, Cambridge, MA 02139, USA.
17 #include <linux/jiffies.h>
18 #include <linux/errno.h>
19 #include <linux/module.h>
20 #include <linux/slab.h>
22 #include <scsi/scsi.h>
23 #include <scsi/scsi_cmnd.h>
25 #include <linux/firmware.h>
28 #include "transport.h"
33 #define SD_INIT1_FIRMWARE "/*(DEBLOBBED)*/"
34 #define SD_INIT2_FIRMWARE "/*(DEBLOBBED)*/"
35 #define SD_RW_FIRMWARE "/*(DEBLOBBED)*/"
36 #define MS_INIT_FIRMWARE "/*(DEBLOBBED)*/"
37 #define MSP_RW_FIRMWARE "/*(DEBLOBBED)*/"
38 #define MS_RW_FIRMWARE "/*(DEBLOBBED)*/"
40 #define DRV_NAME "ums_eneub6250"
42 MODULE_DESCRIPTION("Driver for ENE UB6250 reader");
43 MODULE_LICENSE("GPL");
47 * The table of devices
49 #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
50 vendorName, productName, useProtocol, useTransport, \
51 initFunction, flags) \
52 { USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
53 .driver_info = (flags)}
55 static struct usb_device_id ene_ub6250_usb_ids[] = {
56 # include "unusual_ene_ub6250.h"
57 { } /* Terminating entry */
59 MODULE_DEVICE_TABLE(usb, ene_ub6250_usb_ids);
66 #define UNUSUAL_DEV(idVendor, idProduct, bcdDeviceMin, bcdDeviceMax, \
67 vendor_name, product_name, use_protocol, use_transport, \
68 init_function, Flags) \
70 .vendorName = vendor_name, \
71 .productName = product_name, \
72 .useProtocol = use_protocol, \
73 .useTransport = use_transport, \
74 .initFunction = init_function, \
77 static struct us_unusual_dev ene_ub6250_unusual_dev_list[] = {
78 # include "unusual_ene_ub6250.h"
79 { } /* Terminating entry */
86 /* ENE bin code len */
87 #define ENE_BIN_CODE_LEN 0x800
89 #define REG_CARD_STATUS 0xFF83
90 #define REG_HW_TRAP1 0xFF89
93 #define SS_SUCCESS 0x00 /* No Sense */
94 #define SS_NOT_READY 0x02
95 #define SS_MEDIUM_ERR 0x03
96 #define SS_HW_ERR 0x04
97 #define SS_ILLEGAL_REQUEST 0x05
98 #define SS_UNIT_ATTENTION 0x06
100 /* ENE Load FW Pattern */
101 #define SD_INIT1_PATTERN 1
102 #define SD_INIT2_PATTERN 2
103 #define SD_RW_PATTERN 3
104 #define MS_INIT_PATTERN 4
105 #define MSP_RW_PATTERN 5
106 #define MS_RW_PATTERN 6
107 #define SM_INIT_PATTERN 7
108 #define SM_RW_PATTERN 8
115 /* Status Register 1 */
116 #define MS_REG_ST1_MB 0x80 /* media busy */
117 #define MS_REG_ST1_FB1 0x40 /* flush busy 1 */
118 #define MS_REG_ST1_DTER 0x20 /* error on data(corrected) */
119 #define MS_REG_ST1_UCDT 0x10 /* unable to correct data */
120 #define MS_REG_ST1_EXER 0x08 /* error on extra(corrected) */
121 #define MS_REG_ST1_UCEX 0x04 /* unable to correct extra */
122 #define MS_REG_ST1_FGER 0x02 /* error on overwrite flag(corrected) */
123 #define MS_REG_ST1_UCFG 0x01 /* unable to correct overwrite flag */
124 #define MS_REG_ST1_DEFAULT (MS_REG_ST1_MB | MS_REG_ST1_FB1 | MS_REG_ST1_DTER | MS_REG_ST1_UCDT | MS_REG_ST1_EXER | MS_REG_ST1_UCEX | MS_REG_ST1_FGER | MS_REG_ST1_UCFG)
127 #define MS_REG_OVR_BKST 0x80 /* block status */
128 #define MS_REG_OVR_BKST_OK MS_REG_OVR_BKST /* OK */
129 #define MS_REG_OVR_BKST_NG 0x00 /* NG */
130 #define MS_REG_OVR_PGST0 0x40 /* page status */
131 #define MS_REG_OVR_PGST1 0x20
132 #define MS_REG_OVR_PGST_MASK (MS_REG_OVR_PGST0 | MS_REG_OVR_PGST1)
133 #define MS_REG_OVR_PGST_OK (MS_REG_OVR_PGST0 | MS_REG_OVR_PGST1) /* OK */
134 #define MS_REG_OVR_PGST_NG MS_REG_OVR_PGST1 /* NG */
135 #define MS_REG_OVR_PGST_DATA_ERROR 0x00 /* data error */
136 #define MS_REG_OVR_UDST 0x10 /* update status */
137 #define MS_REG_OVR_UDST_UPDATING 0x00 /* updating */
138 #define MS_REG_OVR_UDST_NO_UPDATE MS_REG_OVR_UDST
139 #define MS_REG_OVR_RESERVED 0x08
140 #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)
142 /* Management Flag */
143 #define MS_REG_MNG_SCMS0 0x20 /* serial copy management system */
144 #define MS_REG_MNG_SCMS1 0x10
145 #define MS_REG_MNG_SCMS_MASK (MS_REG_MNG_SCMS0 | MS_REG_MNG_SCMS1)
146 #define MS_REG_MNG_SCMS_COPY_OK (MS_REG_MNG_SCMS0 | MS_REG_MNG_SCMS1)
147 #define MS_REG_MNG_SCMS_ONE_COPY MS_REG_MNG_SCMS1
148 #define MS_REG_MNG_SCMS_NO_COPY 0x00
149 #define MS_REG_MNG_ATFLG 0x08 /* address transfer table flag */
150 #define MS_REG_MNG_ATFLG_OTHER MS_REG_MNG_ATFLG /* other */
151 #define MS_REG_MNG_ATFLG_ATTBL 0x00 /* address transfer table */
152 #define MS_REG_MNG_SYSFLG 0x04 /* system flag */
153 #define MS_REG_MNG_SYSFLG_USER MS_REG_MNG_SYSFLG /* user block */
154 #define MS_REG_MNG_SYSFLG_BOOT 0x00 /* system block */
155 #define MS_REG_MNG_RESERVED 0xc3
156 #define MS_REG_MNG_DEFAULT (MS_REG_MNG_SCMS_COPY_OK | MS_REG_MNG_ATFLG_OTHER | MS_REG_MNG_SYSFLG_USER | MS_REG_MNG_RESERVED)
159 #define MS_MAX_PAGES_PER_BLOCK 32
160 #define MS_MAX_INITIAL_ERROR_BLOCKS 10
161 #define MS_LIB_BITS_PER_BYTE 8
163 #define MS_SYSINF_FORMAT_FAT 1
164 #define MS_SYSINF_USAGE_GENERAL 0
166 #define MS_SYSINF_MSCLASS_TYPE_1 1
167 #define MS_SYSINF_PAGE_SIZE MS_BYTES_PER_PAGE /* fixed */
169 #define MS_SYSINF_CARDTYPE_RDONLY 1
170 #define MS_SYSINF_CARDTYPE_RDWR 2
171 #define MS_SYSINF_CARDTYPE_HYBRID 3
172 #define MS_SYSINF_SECURITY 0x01
173 #define MS_SYSINF_SECURITY_NO_SUPPORT MS_SYSINF_SECURITY
174 #define MS_SYSINF_SECURITY_SUPPORT 0
176 #define MS_SYSINF_RESERVED1 1
177 #define MS_SYSINF_RESERVED2 1
179 #define MS_SYSENT_TYPE_INVALID_BLOCK 0x01
180 #define MS_SYSENT_TYPE_CIS_IDI 0x0a /* CIS/IDI */
182 #define SIZE_OF_KIRO 1024
183 #define BYTE_MASK 0xff
186 #define MS_STATUS_WRITE_PROTECT 0x0106
187 #define MS_STATUS_SUCCESS 0x0000
188 #define MS_ERROR_FLASH_READ 0x8003
189 #define MS_ERROR_FLASH_ERASE 0x8005
190 #define MS_LB_ERROR 0xfff0
191 #define MS_LB_BOOT_BLOCK 0xfff1
192 #define MS_LB_INITIAL_ERROR 0xfff2
193 #define MS_STATUS_SUCCESS_WITH_ECC 0xfff3
194 #define MS_LB_ACQUIRED_ERROR 0xfff4
195 #define MS_LB_NOT_USED_ERASED 0xfff5
196 #define MS_NOCARD_ERROR 0xfff8
197 #define MS_NO_MEMORY_ERROR 0xfff9
198 #define MS_STATUS_INT_ERROR 0xfffa
199 #define MS_STATUS_ERROR 0xfffe
200 #define MS_LB_NOT_USED 0xffff
202 #define MS_REG_MNG_SYSFLG 0x04 /* system flag */
203 #define MS_REG_MNG_SYSFLG_USER MS_REG_MNG_SYSFLG /* user block */
205 #define MS_BOOT_BLOCK_ID 0x0001
206 #define MS_BOOT_BLOCK_FORMAT_VERSION 0x0100
207 #define MS_BOOT_BLOCK_DATA_ENTRIES 2
209 #define MS_NUMBER_OF_SYSTEM_ENTRY 4
210 #define MS_NUMBER_OF_BOOT_BLOCK 2
211 #define MS_BYTES_PER_PAGE 512
212 #define MS_LOGICAL_BLOCKS_PER_SEGMENT 496
213 #define MS_LOGICAL_BLOCKS_IN_1ST_SEGMENT 494
215 #define MS_PHYSICAL_BLOCKS_PER_SEGMENT 0x200 /* 512 */
216 #define MS_PHYSICAL_BLOCKS_PER_SEGMENT_MASK 0x1ff
219 #define MS_REG_OVR_BKST 0x80 /* block status */
220 #define MS_REG_OVR_BKST_OK MS_REG_OVR_BKST /* OK */
221 #define MS_REG_OVR_BKST_NG 0x00 /* NG */
223 /* Status Register 1 */
224 #define MS_REG_ST1_DTER 0x20 /* error on data(corrected) */
225 #define MS_REG_ST1_EXER 0x08 /* error on extra(corrected) */
226 #define MS_REG_ST1_FGER 0x02 /* error on overwrite flag(corrected) */
228 /* MemoryStick Register */
229 /* Status Register 0 */
230 #define MS_REG_ST0_WP 0x01 /* write protected */
231 #define MS_REG_ST0_WP_ON MS_REG_ST0_WP
233 #define MS_LIB_CTRL_RDONLY 0
234 #define MS_LIB_CTRL_WRPROTECT 1
237 #define ms_libconv_to_logical(pdx, PhyBlock) (((PhyBlock) >= (pdx)->MS_Lib.NumberOfPhyBlock) ? MS_STATUS_ERROR : (pdx)->MS_Lib.Phy2LogMap[PhyBlock])
238 #define ms_libconv_to_physical(pdx, LogBlock) (((LogBlock) >= (pdx)->MS_Lib.NumberOfLogBlock) ? MS_STATUS_ERROR : (pdx)->MS_Lib.Log2PhyMap[LogBlock])
240 #define ms_lib_ctrl_set(pdx, Flag) ((pdx)->MS_Lib.flags |= (1 << (Flag)))
241 #define ms_lib_ctrl_reset(pdx, Flag) ((pdx)->MS_Lib.flags &= ~(1 << (Flag)))
242 #define ms_lib_ctrl_check(pdx, Flag) ((pdx)->MS_Lib.flags & (1 << (Flag)))
244 #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))
245 #define ms_lib_clear_pagemap(pdx) memset((pdx)->MS_Lib.pagemap, 0, sizeof((pdx)->MS_Lib.pagemap))
246 #define memstick_logaddr(logadr1, logadr0) ((((u16)(logadr1)) << 8) | (logadr0))
280 struct ms_bootblock_cis {
281 u8 bCistplDEVICE[6]; /* 0 */
282 u8 bCistplDEVICE0C[6]; /* 6 */
283 u8 bCistplJEDECC[4]; /* 12 */
284 u8 bCistplMANFID[6]; /* 16 */
285 u8 bCistplVER1[32]; /* 22 */
286 u8 bCistplFUNCID[4]; /* 54 */
287 u8 bCistplFUNCE0[4]; /* 58 */
288 u8 bCistplFUNCE1[5]; /* 62 */
289 u8 bCistplCONF[7]; /* 67 */
290 u8 bCistplCFTBLENT0[10];/* 74 */
291 u8 bCistplCFTBLENT1[8]; /* 84 */
292 u8 bCistplCFTBLENT2[12];/* 92 */
293 u8 bCistplCFTBLENT3[8]; /* 104 */
294 u8 bCistplCFTBLENT4[17];/* 112 */
295 u8 bCistplCFTBLENT5[8]; /* 129 */
296 u8 bCistplCFTBLENT6[17];/* 137 */
297 u8 bCistplCFTBLENT7[8]; /* 154 */
298 u8 bCistplNOLINK[3]; /* 162 */
301 struct ms_bootblock_idi {
302 #define MS_IDI_GENERAL_CONF 0x848A
303 u16 wIDIgeneralConfiguration; /* 0 */
304 u16 wIDInumberOfCylinder; /* 1 */
305 u16 wIDIreserved0; /* 2 */
306 u16 wIDInumberOfHead; /* 3 */
307 u16 wIDIbytesPerTrack; /* 4 */
308 u16 wIDIbytesPerSector; /* 5 */
309 u16 wIDIsectorsPerTrack; /* 6 */
310 u16 wIDItotalSectors[2]; /* 7-8 high,low */
311 u16 wIDIreserved1[11]; /* 9-19 */
312 u16 wIDIbufferType; /* 20 */
313 u16 wIDIbufferSize; /* 21 */
314 u16 wIDIlongCmdECC; /* 22 */
315 u16 wIDIfirmVersion[4]; /* 23-26 */
316 u16 wIDImodelName[20]; /* 27-46 */
317 u16 wIDIreserved2; /* 47 */
318 u16 wIDIlongWordSupported; /* 48 */
319 u16 wIDIdmaSupported; /* 49 */
320 u16 wIDIreserved3; /* 50 */
321 u16 wIDIpioTiming; /* 51 */
322 u16 wIDIdmaTiming; /* 52 */
323 u16 wIDItransferParameter; /* 53 */
324 u16 wIDIformattedCylinder; /* 54 */
325 u16 wIDIformattedHead; /* 55 */
326 u16 wIDIformattedSectorsPerTrack;/* 56 */
327 u16 wIDIformattedTotalSectors[2];/* 57-58 */
328 u16 wIDImultiSector; /* 59 */
329 u16 wIDIlbaSectors[2]; /* 60-61 */
330 u16 wIDIsingleWordDMA; /* 62 */
331 u16 wIDImultiWordDMA; /* 63 */
332 u16 wIDIreserved4[192]; /* 64-255 */
335 struct ms_bootblock_sysent_rec {
342 struct ms_bootblock_sysent {
343 struct ms_bootblock_sysent_rec entry[MS_NUMBER_OF_SYSTEM_ENTRY];
346 struct ms_bootblock_sysinf {
347 u8 bMsClass; /* must be 1 */
348 u8 bCardType; /* see below */
349 u16 wBlockSize; /* n KB */
350 u16 wBlockNumber; /* number of physical block */
351 u16 wTotalBlockNumber; /* number of logical block */
352 u16 wPageSize; /* must be 0x200 */
353 u8 bExtraSize; /* 0x10 */
357 u8 bAssemblyMakerCode;
358 u8 bAssemblyMachineCode[3];
359 u16 wMemoryMakerCode;
360 u16 wMemoryDeviceCode;
366 u16 wControllerChipNumber;
367 u16 wControllerFunction; /* New MS */
368 u8 bReserved3[9]; /* New MS */
369 u8 bParallelSupport; /* New MS */
370 u16 wFormatValue; /* New MS */
380 struct ms_bootblock_header {
384 u8 bNumberOfDataEntry;
388 struct ms_bootblock_page0 {
389 struct ms_bootblock_header header;
390 struct ms_bootblock_sysent sysent;
391 struct ms_bootblock_sysinf sysinf;
394 struct ms_bootblock_cis_idi {
396 struct ms_bootblock_cis cis;
401 struct ms_bootblock_idi idi;
407 /* ENE MS Lib struct */
408 struct ms_lib_type_extdat {
421 u32 NumberOfCylinder;
422 u32 SectorsPerCylinder;
423 u16 cardType; /* R/W, RO, Hybrid */
426 u16 NumberOfPhyBlock;
427 u16 NumberOfLogBlock;
429 u16 *Phy2LogMap; /* phy2log table */
430 u16 *Log2PhyMap; /* log2phy table */
432 unsigned char *pagemap[(MS_MAX_PAGES_PER_BLOCK + (MS_LIB_BITS_PER_BYTE-1)) / MS_LIB_BITS_PER_BYTE];
433 unsigned char *blkpag;
434 struct ms_lib_type_extdat *blkext;
435 unsigned char copybuf[512];
439 /* SD Block Length */
440 /* 2^9 = 512 Bytes, The HW maximum read/write data length */
441 #define SD_BLOCK_LEN 9
443 struct ene_ub6250_info {
445 /* I/O bounce buffer */
449 struct SD_STATUS SD_Status;
450 struct MS_STATUS MS_Status;
451 struct SM_STATUS SM_Status;
453 /* ----- SD Control Data ---------------- */
454 /*SD_REGISTER SD_Regs; */
460 /* SD/MMC New spec. */
463 u8 SD20_HIGH_CAPACITY;
467 u8 MMC_HIGH_CAPACITY;
469 /*----- MS Control Data ---------------- */
472 struct ms_lib_ctrl MS_Lib;
476 /*----- SM Control Data ---------------- */
480 unsigned char *testbuf;
485 /*------Power Managerment ---------------*/
489 static int ene_sd_init(struct us_data *us);
490 static int ene_ms_init(struct us_data *us);
491 static int ene_load_bincode(struct us_data *us, unsigned char flag);
493 static void ene_ub6250_info_destructor(void *extra)
495 struct ene_ub6250_info *info = (struct ene_ub6250_info *) extra;
502 static int ene_send_scsi_cmd(struct us_data *us, u8 fDir, void *buf, int use_sg)
504 struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
505 struct bulk_cs_wrap *bcs = (struct bulk_cs_wrap *) us->iobuf;
508 unsigned int residue;
509 unsigned int cswlen = 0, partial = 0;
510 unsigned int transfer_length = bcb->DataTransferLength;
512 /* usb_stor_dbg(us, "transport --- ene_send_scsi_cmd\n"); */
513 /* send cmd to out endpoint */
514 result = usb_stor_bulk_transfer_buf(us, us->send_bulk_pipe,
515 bcb, US_BULK_CB_WRAP_LEN, NULL);
516 if (result != USB_STOR_XFER_GOOD) {
517 usb_stor_dbg(us, "send cmd to out endpoint fail ---\n");
518 return USB_STOR_TRANSPORT_ERROR;
522 unsigned int pipe = fDir;
524 if (fDir == FDIR_READ)
525 pipe = us->recv_bulk_pipe;
527 pipe = us->send_bulk_pipe;
531 result = usb_stor_bulk_srb(us, pipe, us->srb);
533 result = usb_stor_bulk_transfer_sg(us, pipe, buf,
534 transfer_length, 0, &partial);
536 if (result != USB_STOR_XFER_GOOD) {
537 usb_stor_dbg(us, "data transfer fail ---\n");
538 return USB_STOR_TRANSPORT_ERROR;
542 /* Get CSW for device status */
543 result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe, bcs,
544 US_BULK_CS_WRAP_LEN, &cswlen);
546 if (result == USB_STOR_XFER_SHORT && cswlen == 0) {
547 usb_stor_dbg(us, "Received 0-length CSW; retrying...\n");
548 result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
549 bcs, US_BULK_CS_WRAP_LEN, &cswlen);
552 if (result == USB_STOR_XFER_STALLED) {
553 /* get the status again */
554 usb_stor_dbg(us, "Attempting to get CSW (2nd try)...\n");
555 result = usb_stor_bulk_transfer_buf(us, us->recv_bulk_pipe,
556 bcs, US_BULK_CS_WRAP_LEN, NULL);
559 if (result != USB_STOR_XFER_GOOD)
560 return USB_STOR_TRANSPORT_ERROR;
562 /* check bulk status */
563 residue = le32_to_cpu(bcs->Residue);
566 * try to compute the actual residue, based on how much data
567 * was really transferred and what the device tells us
569 if (residue && !(us->fflags & US_FL_IGNORE_RESIDUE)) {
570 residue = min(residue, transfer_length);
572 scsi_set_resid(us->srb, max(scsi_get_resid(us->srb),
576 if (bcs->Status != US_BULK_STAT_OK)
577 return USB_STOR_TRANSPORT_ERROR;
579 return USB_STOR_TRANSPORT_GOOD;
582 static int sd_scsi_test_unit_ready(struct us_data *us, struct scsi_cmnd *srb)
584 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
586 if (info->SD_Status.Insert && info->SD_Status.Ready)
587 return USB_STOR_TRANSPORT_GOOD;
590 return USB_STOR_TRANSPORT_GOOD;
593 return USB_STOR_TRANSPORT_GOOD;
596 static int sd_scsi_inquiry(struct us_data *us, struct scsi_cmnd *srb)
598 unsigned char data_ptr[36] = {
599 0x00, 0x80, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x55,
600 0x53, 0x42, 0x32, 0x2E, 0x30, 0x20, 0x20, 0x43, 0x61,
601 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20,
602 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x31, 0x30, 0x30 };
604 usb_stor_set_xfer_buf(data_ptr, 36, srb);
605 return USB_STOR_TRANSPORT_GOOD;
608 static int sd_scsi_mode_sense(struct us_data *us, struct scsi_cmnd *srb)
610 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
611 unsigned char mediaNoWP[12] = {
612 0x0b, 0x00, 0x00, 0x08, 0x00, 0x00,
613 0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
614 unsigned char mediaWP[12] = {
615 0x0b, 0x00, 0x80, 0x08, 0x00, 0x00,
616 0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
618 if (info->SD_Status.WtP)
619 usb_stor_set_xfer_buf(mediaWP, 12, srb);
621 usb_stor_set_xfer_buf(mediaNoWP, 12, srb);
624 return USB_STOR_TRANSPORT_GOOD;
627 static int sd_scsi_read_capacity(struct us_data *us, struct scsi_cmnd *srb)
631 unsigned int offset = 0;
632 unsigned char buf[8];
633 struct scatterlist *sg = NULL;
634 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
636 usb_stor_dbg(us, "sd_scsi_read_capacity\n");
637 if (info->SD_Status.HiCapacity) {
639 if (info->SD_Status.IsMMC)
640 bl_num = info->HC_C_SIZE-1;
642 bl_num = (info->HC_C_SIZE + 1) * 1024 - 1;
644 bl_len = 1 << (info->SD_READ_BL_LEN);
645 bl_num = info->SD_Block_Mult * (info->SD_C_SIZE + 1)
646 * (1 << (info->SD_C_SIZE_MULT + 2)) - 1;
648 info->bl_num = bl_num;
649 usb_stor_dbg(us, "bl_len = %x\n", bl_len);
650 usb_stor_dbg(us, "bl_num = %x\n", bl_num);
652 /*srb->request_bufflen = 8; */
653 buf[0] = (bl_num >> 24) & 0xff;
654 buf[1] = (bl_num >> 16) & 0xff;
655 buf[2] = (bl_num >> 8) & 0xff;
656 buf[3] = (bl_num >> 0) & 0xff;
657 buf[4] = (bl_len >> 24) & 0xff;
658 buf[5] = (bl_len >> 16) & 0xff;
659 buf[6] = (bl_len >> 8) & 0xff;
660 buf[7] = (bl_len >> 0) & 0xff;
662 usb_stor_access_xfer_buf(buf, 8, srb, &sg, &offset, TO_XFER_BUF);
664 return USB_STOR_TRANSPORT_GOOD;
667 static int sd_scsi_read(struct us_data *us, struct scsi_cmnd *srb)
670 unsigned char *cdb = srb->cmnd;
671 struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
672 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
674 u32 bn = ((cdb[2] << 24) & 0xff000000) | ((cdb[3] << 16) & 0x00ff0000) |
675 ((cdb[4] << 8) & 0x0000ff00) | ((cdb[5] << 0) & 0x000000ff);
676 u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
677 u32 bnByte = bn * 0x200;
678 u32 blenByte = blen * 0x200;
680 if (bn > info->bl_num)
681 return USB_STOR_TRANSPORT_ERROR;
683 result = ene_load_bincode(us, SD_RW_PATTERN);
684 if (result != USB_STOR_XFER_GOOD) {
685 usb_stor_dbg(us, "Load SD RW pattern Fail !!\n");
686 return USB_STOR_TRANSPORT_ERROR;
689 if (info->SD_Status.HiCapacity)
692 /* set up the command wrapper */
693 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
694 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
695 bcb->DataTransferLength = blenByte;
696 bcb->Flags = US_BULK_FLAG_IN;
698 bcb->CDB[5] = (unsigned char)(bnByte);
699 bcb->CDB[4] = (unsigned char)(bnByte>>8);
700 bcb->CDB[3] = (unsigned char)(bnByte>>16);
701 bcb->CDB[2] = (unsigned char)(bnByte>>24);
703 result = ene_send_scsi_cmd(us, FDIR_READ, scsi_sglist(srb), 1);
707 static int sd_scsi_write(struct us_data *us, struct scsi_cmnd *srb)
710 unsigned char *cdb = srb->cmnd;
711 struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
712 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
714 u32 bn = ((cdb[2] << 24) & 0xff000000) | ((cdb[3] << 16) & 0x00ff0000) |
715 ((cdb[4] << 8) & 0x0000ff00) | ((cdb[5] << 0) & 0x000000ff);
716 u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
717 u32 bnByte = bn * 0x200;
718 u32 blenByte = blen * 0x200;
720 if (bn > info->bl_num)
721 return USB_STOR_TRANSPORT_ERROR;
723 result = ene_load_bincode(us, SD_RW_PATTERN);
724 if (result != USB_STOR_XFER_GOOD) {
725 usb_stor_dbg(us, "Load SD RW pattern Fail !!\n");
726 return USB_STOR_TRANSPORT_ERROR;
729 if (info->SD_Status.HiCapacity)
732 /* set up the command wrapper */
733 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
734 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
735 bcb->DataTransferLength = blenByte;
738 bcb->CDB[5] = (unsigned char)(bnByte);
739 bcb->CDB[4] = (unsigned char)(bnByte>>8);
740 bcb->CDB[3] = (unsigned char)(bnByte>>16);
741 bcb->CDB[2] = (unsigned char)(bnByte>>24);
743 result = ene_send_scsi_cmd(us, FDIR_WRITE, scsi_sglist(srb), 1);
751 static int ms_lib_set_logicalpair(struct us_data *us, u16 logblk, u16 phyblk)
753 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
755 if ((logblk >= info->MS_Lib.NumberOfLogBlock) || (phyblk >= info->MS_Lib.NumberOfPhyBlock))
758 info->MS_Lib.Phy2LogMap[phyblk] = logblk;
759 info->MS_Lib.Log2PhyMap[logblk] = phyblk;
764 static int ms_lib_set_logicalblockmark(struct us_data *us, u16 phyblk, u16 mark)
766 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
768 if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
771 info->MS_Lib.Phy2LogMap[phyblk] = mark;
776 static int ms_lib_set_initialerrorblock(struct us_data *us, u16 phyblk)
778 return ms_lib_set_logicalblockmark(us, phyblk, MS_LB_INITIAL_ERROR);
781 static int ms_lib_set_bootblockmark(struct us_data *us, u16 phyblk)
783 return ms_lib_set_logicalblockmark(us, phyblk, MS_LB_BOOT_BLOCK);
786 static int ms_lib_free_logicalmap(struct us_data *us)
788 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
790 kfree(info->MS_Lib.Phy2LogMap);
791 info->MS_Lib.Phy2LogMap = NULL;
793 kfree(info->MS_Lib.Log2PhyMap);
794 info->MS_Lib.Log2PhyMap = NULL;
799 static int ms_lib_alloc_logicalmap(struct us_data *us)
802 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
804 info->MS_Lib.Phy2LogMap = kmalloc(info->MS_Lib.NumberOfPhyBlock * sizeof(u16), GFP_KERNEL);
805 info->MS_Lib.Log2PhyMap = kmalloc(info->MS_Lib.NumberOfLogBlock * sizeof(u16), GFP_KERNEL);
807 if ((info->MS_Lib.Phy2LogMap == NULL) || (info->MS_Lib.Log2PhyMap == NULL)) {
808 ms_lib_free_logicalmap(us);
812 for (i = 0; i < info->MS_Lib.NumberOfPhyBlock; i++)
813 info->MS_Lib.Phy2LogMap[i] = MS_LB_NOT_USED;
815 for (i = 0; i < info->MS_Lib.NumberOfLogBlock; i++)
816 info->MS_Lib.Log2PhyMap[i] = MS_LB_NOT_USED;
821 static void ms_lib_clear_writebuf(struct us_data *us)
824 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
826 info->MS_Lib.wrtblk = (u16)-1;
827 ms_lib_clear_pagemap(info);
829 if (info->MS_Lib.blkpag)
830 memset(info->MS_Lib.blkpag, 0xff, info->MS_Lib.PagesPerBlock * info->MS_Lib.BytesPerSector);
832 if (info->MS_Lib.blkext) {
833 for (i = 0; i < info->MS_Lib.PagesPerBlock; i++) {
834 info->MS_Lib.blkext[i].status1 = MS_REG_ST1_DEFAULT;
835 info->MS_Lib.blkext[i].ovrflg = MS_REG_OVR_DEFAULT;
836 info->MS_Lib.blkext[i].mngflg = MS_REG_MNG_DEFAULT;
837 info->MS_Lib.blkext[i].logadr = MS_LB_NOT_USED;
842 static int ms_count_freeblock(struct us_data *us, u16 PhyBlock)
845 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
847 Ende = PhyBlock + MS_PHYSICAL_BLOCKS_PER_SEGMENT;
848 for (Count = 0; PhyBlock < Ende; PhyBlock++) {
849 switch (info->MS_Lib.Phy2LogMap[PhyBlock]) {
851 case MS_LB_NOT_USED_ERASED:
861 static int ms_read_readpage(struct us_data *us, u32 PhyBlockAddr,
862 u8 PageNum, u32 *PageBuf, struct ms_lib_type_extdat *ExtraDat)
864 struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
865 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
866 u8 *bbuf = info->bbuf;
868 u32 bn = PhyBlockAddr * 0x20 + PageNum;
870 result = ene_load_bincode(us, MS_RW_PATTERN);
871 if (result != USB_STOR_XFER_GOOD)
872 return USB_STOR_TRANSPORT_ERROR;
875 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
876 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
877 bcb->DataTransferLength = 0x200;
878 bcb->Flags = US_BULK_FLAG_IN;
881 bcb->CDB[1] = 0x02; /* in init.c ENE_MSInit() is 0x01 */
883 bcb->CDB[5] = (unsigned char)(bn);
884 bcb->CDB[4] = (unsigned char)(bn>>8);
885 bcb->CDB[3] = (unsigned char)(bn>>16);
886 bcb->CDB[2] = (unsigned char)(bn>>24);
888 result = ene_send_scsi_cmd(us, FDIR_READ, PageBuf, 0);
889 if (result != USB_STOR_XFER_GOOD)
890 return USB_STOR_TRANSPORT_ERROR;
893 /* Read Extra Data */
894 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
895 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
896 bcb->DataTransferLength = 0x4;
897 bcb->Flags = US_BULK_FLAG_IN;
901 bcb->CDB[5] = (unsigned char)(PageNum);
902 bcb->CDB[4] = (unsigned char)(PhyBlockAddr);
903 bcb->CDB[3] = (unsigned char)(PhyBlockAddr>>8);
904 bcb->CDB[2] = (unsigned char)(PhyBlockAddr>>16);
907 result = ene_send_scsi_cmd(us, FDIR_READ, bbuf, 0);
908 if (result != USB_STOR_XFER_GOOD)
909 return USB_STOR_TRANSPORT_ERROR;
911 ExtraDat->reserved = 0;
912 ExtraDat->intr = 0x80; /* Not yet,fireware support */
913 ExtraDat->status0 = 0x10; /* Not yet,fireware support */
915 ExtraDat->status1 = 0x00; /* Not yet,fireware support */
916 ExtraDat->ovrflg = bbuf[0];
917 ExtraDat->mngflg = bbuf[1];
918 ExtraDat->logadr = memstick_logaddr(bbuf[2], bbuf[3]);
920 return USB_STOR_TRANSPORT_GOOD;
923 static int ms_lib_process_bootblock(struct us_data *us, u16 PhyBlock, u8 *PageData)
925 struct ms_bootblock_sysent *SysEntry;
926 struct ms_bootblock_sysinf *SysInfo;
930 struct ms_lib_type_extdat ExtraData;
931 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
933 PageBuffer = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
934 if (PageBuffer == NULL)
939 SysInfo = &(((struct ms_bootblock_page0 *)PageData)->sysinf);
941 if ((SysInfo->bMsClass != MS_SYSINF_MSCLASS_TYPE_1) ||
942 (be16_to_cpu(SysInfo->wPageSize) != MS_SYSINF_PAGE_SIZE) ||
943 ((SysInfo->bSecuritySupport & MS_SYSINF_SECURITY) == MS_SYSINF_SECURITY_SUPPORT) ||
944 (SysInfo->bReserved1 != MS_SYSINF_RESERVED1) ||
945 (SysInfo->bReserved2 != MS_SYSINF_RESERVED2) ||
946 (SysInfo->bFormatType != MS_SYSINF_FORMAT_FAT) ||
947 (SysInfo->bUsage != MS_SYSINF_USAGE_GENERAL))
950 switch (info->MS_Lib.cardType = SysInfo->bCardType) {
951 case MS_SYSINF_CARDTYPE_RDONLY:
952 ms_lib_ctrl_set(info, MS_LIB_CTRL_RDONLY);
954 case MS_SYSINF_CARDTYPE_RDWR:
955 ms_lib_ctrl_reset(info, MS_LIB_CTRL_RDONLY);
957 case MS_SYSINF_CARDTYPE_HYBRID:
962 info->MS_Lib.blockSize = be16_to_cpu(SysInfo->wBlockSize);
963 info->MS_Lib.NumberOfPhyBlock = be16_to_cpu(SysInfo->wBlockNumber);
964 info->MS_Lib.NumberOfLogBlock = be16_to_cpu(SysInfo->wTotalBlockNumber)-2;
965 info->MS_Lib.PagesPerBlock = info->MS_Lib.blockSize * SIZE_OF_KIRO / MS_BYTES_PER_PAGE;
966 info->MS_Lib.NumberOfSegment = info->MS_Lib.NumberOfPhyBlock / MS_PHYSICAL_BLOCKS_PER_SEGMENT;
967 info->MS_Model = be16_to_cpu(SysInfo->wMemorySize);
969 /*Allocate to all number of logicalblock and physicalblock */
970 if (ms_lib_alloc_logicalmap(us))
973 /* Mark the book block */
974 ms_lib_set_bootblockmark(us, PhyBlock);
976 SysEntry = &(((struct ms_bootblock_page0 *)PageData)->sysent);
978 for (i = 0; i < MS_NUMBER_OF_SYSTEM_ENTRY; i++) {
979 u32 EntryOffset, EntrySize;
981 EntryOffset = be32_to_cpu(SysEntry->entry[i].dwStart);
983 if (EntryOffset == 0xffffff)
985 EntrySize = be32_to_cpu(SysEntry->entry[i].dwSize);
990 if (EntryOffset + MS_BYTES_PER_PAGE + EntrySize > info->MS_Lib.blockSize * (u32)SIZE_OF_KIRO)
994 u8 PrevPageNumber = 0;
997 if (SysEntry->entry[i].bType != MS_SYSENT_TYPE_INVALID_BLOCK)
1000 while (EntrySize > 0) {
1002 PageNumber = (u8)(EntryOffset / MS_BYTES_PER_PAGE + 1);
1003 if (PageNumber != PrevPageNumber) {
1004 switch (ms_read_readpage(us, PhyBlock, PageNumber, (u32 *)PageBuffer, &ExtraData)) {
1005 case MS_STATUS_SUCCESS:
1007 case MS_STATUS_WRITE_PROTECT:
1008 case MS_ERROR_FLASH_READ:
1009 case MS_STATUS_ERROR:
1014 PrevPageNumber = PageNumber;
1017 phyblk = be16_to_cpu(*(u16 *)(PageBuffer + (EntryOffset % MS_BYTES_PER_PAGE)));
1018 if (phyblk < 0x0fff)
1019 ms_lib_set_initialerrorblock(us, phyblk);
1024 } else if (i == 1) { /* CIS/IDI */
1025 struct ms_bootblock_idi *idi;
1027 if (SysEntry->entry[i].bType != MS_SYSENT_TYPE_CIS_IDI)
1030 switch (ms_read_readpage(us, PhyBlock, (u8)(EntryOffset / MS_BYTES_PER_PAGE + 1), (u32 *)PageBuffer, &ExtraData)) {
1031 case MS_STATUS_SUCCESS:
1033 case MS_STATUS_WRITE_PROTECT:
1034 case MS_ERROR_FLASH_READ:
1035 case MS_STATUS_ERROR:
1040 idi = &((struct ms_bootblock_cis_idi *)(PageBuffer + (EntryOffset % MS_BYTES_PER_PAGE)))->idi.idi;
1041 if (le16_to_cpu(idi->wIDIgeneralConfiguration) != MS_IDI_GENERAL_CONF)
1044 info->MS_Lib.BytesPerSector = le16_to_cpu(idi->wIDIbytesPerSector);
1045 if (info->MS_Lib.BytesPerSector != MS_BYTES_PER_PAGE)
1054 ms_lib_free_logicalmap(us);
1062 static void ms_lib_free_writebuf(struct us_data *us)
1064 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1065 info->MS_Lib.wrtblk = (u16)-1; /* set to -1 */
1067 /* memset((fdoExt)->MS_Lib.pagemap, 0, sizeof((fdoExt)->MS_Lib.pagemap)) */
1069 ms_lib_clear_pagemap(info); /* (pdx)->MS_Lib.pagemap memset 0 in ms.h */
1071 if (info->MS_Lib.blkpag) {
1072 kfree(info->MS_Lib.blkpag); /* Arnold test ... */
1073 info->MS_Lib.blkpag = NULL;
1076 if (info->MS_Lib.blkext) {
1077 kfree(info->MS_Lib.blkext); /* Arnold test ... */
1078 info->MS_Lib.blkext = NULL;
1083 static void ms_lib_free_allocatedarea(struct us_data *us)
1085 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1087 ms_lib_free_writebuf(us); /* Free MS_Lib.pagemap */
1088 ms_lib_free_logicalmap(us); /* kfree MS_Lib.Phy2LogMap and MS_Lib.Log2PhyMap */
1090 /* set struct us point flag to 0 */
1091 info->MS_Lib.flags = 0;
1092 info->MS_Lib.BytesPerSector = 0;
1093 info->MS_Lib.SectorsPerCylinder = 0;
1095 info->MS_Lib.cardType = 0;
1096 info->MS_Lib.blockSize = 0;
1097 info->MS_Lib.PagesPerBlock = 0;
1099 info->MS_Lib.NumberOfPhyBlock = 0;
1100 info->MS_Lib.NumberOfLogBlock = 0;
1104 static int ms_lib_alloc_writebuf(struct us_data *us)
1106 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1108 info->MS_Lib.wrtblk = (u16)-1;
1110 info->MS_Lib.blkpag = kmalloc(info->MS_Lib.PagesPerBlock * info->MS_Lib.BytesPerSector, GFP_KERNEL);
1111 info->MS_Lib.blkext = kmalloc(info->MS_Lib.PagesPerBlock * sizeof(struct ms_lib_type_extdat), GFP_KERNEL);
1113 if ((info->MS_Lib.blkpag == NULL) || (info->MS_Lib.blkext == NULL)) {
1114 ms_lib_free_writebuf(us);
1118 ms_lib_clear_writebuf(us);
1123 static int ms_lib_force_setlogical_pair(struct us_data *us, u16 logblk, u16 phyblk)
1125 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1127 if (logblk == MS_LB_NOT_USED)
1130 if ((logblk >= info->MS_Lib.NumberOfLogBlock) ||
1131 (phyblk >= info->MS_Lib.NumberOfPhyBlock))
1134 info->MS_Lib.Phy2LogMap[phyblk] = logblk;
1135 info->MS_Lib.Log2PhyMap[logblk] = phyblk;
1140 static int ms_read_copyblock(struct us_data *us, u16 oldphy, u16 newphy,
1141 u16 PhyBlockAddr, u8 PageNum, unsigned char *buf, u16 len)
1143 struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1146 result = ene_load_bincode(us, MS_RW_PATTERN);
1147 if (result != USB_STOR_XFER_GOOD)
1148 return USB_STOR_TRANSPORT_ERROR;
1150 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1151 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1152 bcb->DataTransferLength = 0x200*len;
1156 bcb->CDB[4] = (unsigned char)(oldphy);
1157 bcb->CDB[3] = (unsigned char)(oldphy>>8);
1158 bcb->CDB[2] = 0; /* (BYTE)(oldphy>>16) */
1159 bcb->CDB[7] = (unsigned char)(newphy);
1160 bcb->CDB[6] = (unsigned char)(newphy>>8);
1161 bcb->CDB[5] = 0; /* (BYTE)(newphy>>16) */
1162 bcb->CDB[9] = (unsigned char)(PhyBlockAddr);
1163 bcb->CDB[8] = (unsigned char)(PhyBlockAddr>>8);
1164 bcb->CDB[10] = PageNum;
1166 result = ene_send_scsi_cmd(us, FDIR_WRITE, buf, 0);
1167 if (result != USB_STOR_XFER_GOOD)
1168 return USB_STOR_TRANSPORT_ERROR;
1170 return USB_STOR_TRANSPORT_GOOD;
1173 static int ms_read_eraseblock(struct us_data *us, u32 PhyBlockAddr)
1175 struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1177 u32 bn = PhyBlockAddr;
1179 result = ene_load_bincode(us, MS_RW_PATTERN);
1180 if (result != USB_STOR_XFER_GOOD)
1181 return USB_STOR_TRANSPORT_ERROR;
1183 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1184 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1185 bcb->DataTransferLength = 0x200;
1186 bcb->Flags = US_BULK_FLAG_IN;
1189 bcb->CDB[4] = (unsigned char)(bn);
1190 bcb->CDB[3] = (unsigned char)(bn>>8);
1191 bcb->CDB[2] = (unsigned char)(bn>>16);
1193 result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0);
1194 if (result != USB_STOR_XFER_GOOD)
1195 return USB_STOR_TRANSPORT_ERROR;
1197 return USB_STOR_TRANSPORT_GOOD;
1200 static int ms_lib_check_disableblock(struct us_data *us, u16 PhyBlock)
1202 unsigned char *PageBuf = NULL;
1203 u16 result = MS_STATUS_SUCCESS;
1205 struct ms_lib_type_extdat extdat;
1206 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1208 PageBuf = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
1209 if (PageBuf == NULL) {
1210 result = MS_NO_MEMORY_ERROR;
1214 ms_read_readpage(us, PhyBlock, 1, (u32 *)PageBuf, &extdat);
1216 blk = be16_to_cpu(PageBuf[index]);
1217 if (blk == MS_LB_NOT_USED)
1219 if (blk == info->MS_Lib.Log2PhyMap[0]) {
1220 result = MS_ERROR_FLASH_READ;
1231 static int ms_lib_setacquired_errorblock(struct us_data *us, u16 phyblk)
1234 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1236 if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1239 log = info->MS_Lib.Phy2LogMap[phyblk];
1241 if (log < info->MS_Lib.NumberOfLogBlock)
1242 info->MS_Lib.Log2PhyMap[log] = MS_LB_NOT_USED;
1244 if (info->MS_Lib.Phy2LogMap[phyblk] != MS_LB_INITIAL_ERROR)
1245 info->MS_Lib.Phy2LogMap[phyblk] = MS_LB_ACQUIRED_ERROR;
1250 static int ms_lib_overwrite_extra(struct us_data *us, u32 PhyBlockAddr,
1251 u8 PageNum, u8 OverwriteFlag)
1253 struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1256 result = ene_load_bincode(us, MS_RW_PATTERN);
1257 if (result != USB_STOR_XFER_GOOD)
1258 return USB_STOR_TRANSPORT_ERROR;
1260 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1261 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1262 bcb->DataTransferLength = 0x4;
1263 bcb->Flags = US_BULK_FLAG_IN;
1266 bcb->CDB[5] = (unsigned char)(PageNum);
1267 bcb->CDB[4] = (unsigned char)(PhyBlockAddr);
1268 bcb->CDB[3] = (unsigned char)(PhyBlockAddr>>8);
1269 bcb->CDB[2] = (unsigned char)(PhyBlockAddr>>16);
1270 bcb->CDB[6] = OverwriteFlag;
1275 result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0);
1276 if (result != USB_STOR_XFER_GOOD)
1277 return USB_STOR_TRANSPORT_ERROR;
1279 return USB_STOR_TRANSPORT_GOOD;
1282 static int ms_lib_error_phyblock(struct us_data *us, u16 phyblk)
1284 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1286 if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1287 return MS_STATUS_ERROR;
1289 ms_lib_setacquired_errorblock(us, phyblk);
1291 if (ms_lib_iswritable(info))
1292 return ms_lib_overwrite_extra(us, phyblk, 0, (u8)(~MS_REG_OVR_BKST & BYTE_MASK));
1294 return MS_STATUS_SUCCESS;
1297 static int ms_lib_erase_phyblock(struct us_data *us, u16 phyblk)
1300 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1302 if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1303 return MS_STATUS_ERROR;
1305 log = info->MS_Lib.Phy2LogMap[phyblk];
1307 if (log < info->MS_Lib.NumberOfLogBlock)
1308 info->MS_Lib.Log2PhyMap[log] = MS_LB_NOT_USED;
1310 info->MS_Lib.Phy2LogMap[phyblk] = MS_LB_NOT_USED;
1312 if (ms_lib_iswritable(info)) {
1313 switch (ms_read_eraseblock(us, phyblk)) {
1314 case MS_STATUS_SUCCESS:
1315 info->MS_Lib.Phy2LogMap[phyblk] = MS_LB_NOT_USED_ERASED;
1316 return MS_STATUS_SUCCESS;
1317 case MS_ERROR_FLASH_ERASE:
1318 case MS_STATUS_INT_ERROR:
1319 ms_lib_error_phyblock(us, phyblk);
1320 return MS_ERROR_FLASH_ERASE;
1321 case MS_STATUS_ERROR:
1323 ms_lib_ctrl_set(info, MS_LIB_CTRL_RDONLY); /* MS_LibCtrlSet will used by ENE_MSInit ,need check, and why us to info*/
1324 ms_lib_setacquired_errorblock(us, phyblk);
1325 return MS_STATUS_ERROR;
1329 ms_lib_setacquired_errorblock(us, phyblk);
1331 return MS_STATUS_SUCCESS;
1334 static int ms_lib_read_extra(struct us_data *us, u32 PhyBlock,
1335 u8 PageNum, struct ms_lib_type_extdat *ExtraDat)
1337 struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1338 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1339 u8 *bbuf = info->bbuf;
1342 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1343 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1344 bcb->DataTransferLength = 0x4;
1345 bcb->Flags = US_BULK_FLAG_IN;
1348 bcb->CDB[5] = (unsigned char)(PageNum);
1349 bcb->CDB[4] = (unsigned char)(PhyBlock);
1350 bcb->CDB[3] = (unsigned char)(PhyBlock>>8);
1351 bcb->CDB[2] = (unsigned char)(PhyBlock>>16);
1354 result = ene_send_scsi_cmd(us, FDIR_READ, bbuf, 0);
1355 if (result != USB_STOR_XFER_GOOD)
1356 return USB_STOR_TRANSPORT_ERROR;
1358 ExtraDat->reserved = 0;
1359 ExtraDat->intr = 0x80; /* Not yet, waiting for fireware support */
1360 ExtraDat->status0 = 0x10; /* Not yet, waiting for fireware support */
1361 ExtraDat->status1 = 0x00; /* Not yet, waiting for fireware support */
1362 ExtraDat->ovrflg = bbuf[0];
1363 ExtraDat->mngflg = bbuf[1];
1364 ExtraDat->logadr = memstick_logaddr(bbuf[2], bbuf[3]);
1366 return USB_STOR_TRANSPORT_GOOD;
1369 static int ms_libsearch_block_from_physical(struct us_data *us, u16 phyblk)
1373 struct ms_lib_type_extdat extdat; /* need check */
1374 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1377 if (phyblk >= info->MS_Lib.NumberOfPhyBlock)
1380 for (blk = phyblk + 1; blk != phyblk; blk++) {
1381 if ((blk & MS_PHYSICAL_BLOCKS_PER_SEGMENT_MASK) == 0)
1382 blk -= MS_PHYSICAL_BLOCKS_PER_SEGMENT;
1384 Newblk = info->MS_Lib.Phy2LogMap[blk];
1385 if (info->MS_Lib.Phy2LogMap[blk] == MS_LB_NOT_USED_ERASED) {
1387 } else if (info->MS_Lib.Phy2LogMap[blk] == MS_LB_NOT_USED) {
1388 switch (ms_lib_read_extra(us, blk, 0, &extdat)) {
1389 case MS_STATUS_SUCCESS:
1390 case MS_STATUS_SUCCESS_WITH_ECC:
1392 case MS_NOCARD_ERROR:
1393 return MS_NOCARD_ERROR;
1394 case MS_STATUS_INT_ERROR:
1396 case MS_ERROR_FLASH_READ:
1398 ms_lib_setacquired_errorblock(us, blk);
1402 if ((extdat.ovrflg & MS_REG_OVR_BKST) != MS_REG_OVR_BKST_OK) {
1403 ms_lib_setacquired_errorblock(us, blk);
1407 switch (ms_lib_erase_phyblock(us, blk)) {
1408 case MS_STATUS_SUCCESS:
1410 case MS_STATUS_ERROR:
1412 case MS_ERROR_FLASH_ERASE:
1414 ms_lib_error_phyblock(us, blk);
1422 static int ms_libsearch_block_from_logical(struct us_data *us, u16 logblk)
1425 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1427 phyblk = ms_libconv_to_physical(info, logblk);
1428 if (phyblk >= MS_LB_ERROR) {
1429 if (logblk >= info->MS_Lib.NumberOfLogBlock)
1432 phyblk = (logblk + MS_NUMBER_OF_BOOT_BLOCK) / MS_LOGICAL_BLOCKS_PER_SEGMENT;
1433 phyblk *= MS_PHYSICAL_BLOCKS_PER_SEGMENT;
1434 phyblk += MS_PHYSICAL_BLOCKS_PER_SEGMENT - 1;
1437 return ms_libsearch_block_from_physical(us, phyblk);
1440 static int ms_scsi_test_unit_ready(struct us_data *us, struct scsi_cmnd *srb)
1442 struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
1444 /* pr_info("MS_SCSI_Test_Unit_Ready\n"); */
1445 if (info->MS_Status.Insert && info->MS_Status.Ready) {
1446 return USB_STOR_TRANSPORT_GOOD;
1449 return USB_STOR_TRANSPORT_GOOD;
1452 return USB_STOR_TRANSPORT_GOOD;
1455 static int ms_scsi_inquiry(struct us_data *us, struct scsi_cmnd *srb)
1457 /* pr_info("MS_SCSI_Inquiry\n"); */
1458 unsigned char data_ptr[36] = {
1459 0x00, 0x80, 0x02, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x55,
1460 0x53, 0x42, 0x32, 0x2E, 0x30, 0x20, 0x20, 0x43, 0x61,
1461 0x72, 0x64, 0x52, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20,
1462 0x20, 0x20, 0x20, 0x20, 0x20, 0x30, 0x31, 0x30, 0x30};
1464 usb_stor_set_xfer_buf(data_ptr, 36, srb);
1465 return USB_STOR_TRANSPORT_GOOD;
1468 static int ms_scsi_mode_sense(struct us_data *us, struct scsi_cmnd *srb)
1470 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1471 unsigned char mediaNoWP[12] = {
1472 0x0b, 0x00, 0x00, 0x08, 0x00, 0x00,
1473 0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
1474 unsigned char mediaWP[12] = {
1475 0x0b, 0x00, 0x80, 0x08, 0x00, 0x00,
1476 0x71, 0xc0, 0x00, 0x00, 0x02, 0x00 };
1478 if (info->MS_Status.WtP)
1479 usb_stor_set_xfer_buf(mediaWP, 12, srb);
1481 usb_stor_set_xfer_buf(mediaNoWP, 12, srb);
1483 return USB_STOR_TRANSPORT_GOOD;
1486 static int ms_scsi_read_capacity(struct us_data *us, struct scsi_cmnd *srb)
1490 unsigned int offset = 0;
1491 unsigned char buf[8];
1492 struct scatterlist *sg = NULL;
1493 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1495 usb_stor_dbg(us, "ms_scsi_read_capacity\n");
1497 if (info->MS_Status.IsMSPro)
1498 bl_num = info->MSP_TotalBlock - 1;
1500 bl_num = info->MS_Lib.NumberOfLogBlock * info->MS_Lib.blockSize * 2 - 1;
1502 info->bl_num = bl_num;
1503 usb_stor_dbg(us, "bl_len = %x\n", bl_len);
1504 usb_stor_dbg(us, "bl_num = %x\n", bl_num);
1506 /*srb->request_bufflen = 8; */
1507 buf[0] = (bl_num >> 24) & 0xff;
1508 buf[1] = (bl_num >> 16) & 0xff;
1509 buf[2] = (bl_num >> 8) & 0xff;
1510 buf[3] = (bl_num >> 0) & 0xff;
1511 buf[4] = (bl_len >> 24) & 0xff;
1512 buf[5] = (bl_len >> 16) & 0xff;
1513 buf[6] = (bl_len >> 8) & 0xff;
1514 buf[7] = (bl_len >> 0) & 0xff;
1516 usb_stor_access_xfer_buf(buf, 8, srb, &sg, &offset, TO_XFER_BUF);
1518 return USB_STOR_TRANSPORT_GOOD;
1521 static void ms_lib_phy_to_log_range(u16 PhyBlock, u16 *LogStart, u16 *LogEnde)
1523 PhyBlock /= MS_PHYSICAL_BLOCKS_PER_SEGMENT;
1526 *LogStart = MS_LOGICAL_BLOCKS_IN_1ST_SEGMENT + (PhyBlock - 1) * MS_LOGICAL_BLOCKS_PER_SEGMENT;/*496*/
1527 *LogEnde = *LogStart + MS_LOGICAL_BLOCKS_PER_SEGMENT;/*496*/
1530 *LogEnde = MS_LOGICAL_BLOCKS_IN_1ST_SEGMENT;/*494*/
1534 static int ms_lib_read_extrablock(struct us_data *us, u32 PhyBlock,
1535 u8 PageNum, u8 blen, void *buf)
1537 struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1540 /* Read Extra Data */
1541 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1542 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1543 bcb->DataTransferLength = 0x4 * blen;
1544 bcb->Flags = US_BULK_FLAG_IN;
1547 bcb->CDB[5] = (unsigned char)(PageNum);
1548 bcb->CDB[4] = (unsigned char)(PhyBlock);
1549 bcb->CDB[3] = (unsigned char)(PhyBlock>>8);
1550 bcb->CDB[2] = (unsigned char)(PhyBlock>>16);
1553 result = ene_send_scsi_cmd(us, FDIR_READ, buf, 0);
1554 if (result != USB_STOR_XFER_GOOD)
1555 return USB_STOR_TRANSPORT_ERROR;
1557 return USB_STOR_TRANSPORT_GOOD;
1560 static int ms_lib_scan_logicalblocknumber(struct us_data *us, u16 btBlk1st)
1562 u16 PhyBlock, newblk, i;
1563 u16 LogStart, LogEnde;
1564 struct ms_lib_type_extdat extdat;
1565 u32 count = 0, index = 0;
1566 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1567 u8 *bbuf = info->bbuf;
1569 for (PhyBlock = 0; PhyBlock < info->MS_Lib.NumberOfPhyBlock;) {
1570 ms_lib_phy_to_log_range(PhyBlock, &LogStart, &LogEnde);
1572 for (i = 0; i < MS_PHYSICAL_BLOCKS_PER_SEGMENT; i++, PhyBlock++) {
1573 switch (ms_libconv_to_logical(info, PhyBlock)) {
1574 case MS_STATUS_ERROR:
1580 if (count == PhyBlock) {
1581 ms_lib_read_extrablock(us, PhyBlock, 0, 0x80,
1585 index = (PhyBlock % 0x80) * 4;
1587 extdat.ovrflg = bbuf[index];
1588 extdat.mngflg = bbuf[index+1];
1589 extdat.logadr = memstick_logaddr(bbuf[index+2],
1592 if ((extdat.ovrflg & MS_REG_OVR_BKST) != MS_REG_OVR_BKST_OK) {
1593 ms_lib_setacquired_errorblock(us, PhyBlock);
1597 if ((extdat.mngflg & MS_REG_MNG_ATFLG) == MS_REG_MNG_ATFLG_ATTBL) {
1598 ms_lib_erase_phyblock(us, PhyBlock);
1602 if (extdat.logadr != MS_LB_NOT_USED) {
1603 if ((extdat.logadr < LogStart) || (LogEnde <= extdat.logadr)) {
1604 ms_lib_erase_phyblock(us, PhyBlock);
1608 newblk = ms_libconv_to_physical(info, extdat.logadr);
1610 if (newblk != MS_LB_NOT_USED) {
1611 if (extdat.logadr == 0) {
1612 ms_lib_set_logicalpair(us, extdat.logadr, PhyBlock);
1613 if (ms_lib_check_disableblock(us, btBlk1st)) {
1614 ms_lib_set_logicalpair(us, extdat.logadr, newblk);
1619 ms_lib_read_extra(us, newblk, 0, &extdat);
1620 if ((extdat.ovrflg & MS_REG_OVR_UDST) == MS_REG_OVR_UDST_UPDATING) {
1621 ms_lib_erase_phyblock(us, PhyBlock);
1624 ms_lib_erase_phyblock(us, newblk);
1628 ms_lib_set_logicalpair(us, extdat.logadr, PhyBlock);
1633 return MS_STATUS_SUCCESS;
1637 static int ms_scsi_read(struct us_data *us, struct scsi_cmnd *srb)
1640 unsigned char *cdb = srb->cmnd;
1641 struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1642 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1644 u32 bn = ((cdb[2] << 24) & 0xff000000) | ((cdb[3] << 16) & 0x00ff0000) |
1645 ((cdb[4] << 8) & 0x0000ff00) | ((cdb[5] << 0) & 0x000000ff);
1646 u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
1647 u32 blenByte = blen * 0x200;
1649 if (bn > info->bl_num)
1650 return USB_STOR_TRANSPORT_ERROR;
1652 if (info->MS_Status.IsMSPro) {
1653 result = ene_load_bincode(us, MSP_RW_PATTERN);
1654 if (result != USB_STOR_XFER_GOOD) {
1655 usb_stor_dbg(us, "Load MPS RW pattern Fail !!\n");
1656 return USB_STOR_TRANSPORT_ERROR;
1659 /* set up the command wrapper */
1660 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1661 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1662 bcb->DataTransferLength = blenByte;
1663 bcb->Flags = US_BULK_FLAG_IN;
1666 bcb->CDB[5] = (unsigned char)(bn);
1667 bcb->CDB[4] = (unsigned char)(bn>>8);
1668 bcb->CDB[3] = (unsigned char)(bn>>16);
1669 bcb->CDB[2] = (unsigned char)(bn>>24);
1671 result = ene_send_scsi_cmd(us, FDIR_READ, scsi_sglist(srb), 1);
1680 buf = kmalloc(blenByte, GFP_KERNEL);
1682 return USB_STOR_TRANSPORT_ERROR;
1684 result = ene_load_bincode(us, MS_RW_PATTERN);
1685 if (result != USB_STOR_XFER_GOOD) {
1686 pr_info("Load MS RW pattern Fail !!\n");
1687 result = USB_STOR_TRANSPORT_ERROR;
1691 logblk = (u16)(bn / info->MS_Lib.PagesPerBlock);
1692 PageNum = (u8)(bn % info->MS_Lib.PagesPerBlock);
1695 if (blen > (info->MS_Lib.PagesPerBlock-PageNum))
1696 len = info->MS_Lib.PagesPerBlock-PageNum;
1700 phyblk = ms_libconv_to_physical(info, logblk);
1701 blkno = phyblk * 0x20 + PageNum;
1703 /* set up the command wrapper */
1704 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1705 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1706 bcb->DataTransferLength = 0x200 * len;
1707 bcb->Flags = US_BULK_FLAG_IN;
1710 bcb->CDB[5] = (unsigned char)(blkno);
1711 bcb->CDB[4] = (unsigned char)(blkno>>8);
1712 bcb->CDB[3] = (unsigned char)(blkno>>16);
1713 bcb->CDB[2] = (unsigned char)(blkno>>24);
1715 result = ene_send_scsi_cmd(us, FDIR_READ, buf+offset, 0);
1716 if (result != USB_STOR_XFER_GOOD) {
1717 pr_info("MS_SCSI_Read --- result = %x\n", result);
1718 result = USB_STOR_TRANSPORT_ERROR;
1727 offset += MS_BYTES_PER_PAGE*len;
1729 usb_stor_set_xfer_buf(buf, blenByte, srb);
1736 static int ms_scsi_write(struct us_data *us, struct scsi_cmnd *srb)
1739 struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1740 unsigned char *cdb = srb->cmnd;
1741 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1743 u32 bn = ((cdb[2] << 24) & 0xff000000) |
1744 ((cdb[3] << 16) & 0x00ff0000) |
1745 ((cdb[4] << 8) & 0x0000ff00) |
1746 ((cdb[5] << 0) & 0x000000ff);
1747 u16 blen = ((cdb[7] << 8) & 0xff00) | ((cdb[8] << 0) & 0x00ff);
1748 u32 blenByte = blen * 0x200;
1750 if (bn > info->bl_num)
1751 return USB_STOR_TRANSPORT_ERROR;
1753 if (info->MS_Status.IsMSPro) {
1754 result = ene_load_bincode(us, MSP_RW_PATTERN);
1755 if (result != USB_STOR_XFER_GOOD) {
1756 pr_info("Load MSP RW pattern Fail !!\n");
1757 return USB_STOR_TRANSPORT_ERROR;
1760 /* set up the command wrapper */
1761 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1762 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1763 bcb->DataTransferLength = blenByte;
1767 bcb->CDB[5] = (unsigned char)(bn);
1768 bcb->CDB[4] = (unsigned char)(bn>>8);
1769 bcb->CDB[3] = (unsigned char)(bn>>16);
1770 bcb->CDB[2] = (unsigned char)(bn>>24);
1772 result = ene_send_scsi_cmd(us, FDIR_WRITE, scsi_sglist(srb), 1);
1778 u16 len, oldphy, newphy;
1780 buf = kmalloc(blenByte, GFP_KERNEL);
1782 return USB_STOR_TRANSPORT_ERROR;
1783 usb_stor_set_xfer_buf(buf, blenByte, srb);
1785 result = ene_load_bincode(us, MS_RW_PATTERN);
1786 if (result != USB_STOR_XFER_GOOD) {
1787 pr_info("Load MS RW pattern Fail !!\n");
1788 result = USB_STOR_TRANSPORT_ERROR;
1792 PhyBlockAddr = (u16)(bn / info->MS_Lib.PagesPerBlock);
1793 PageNum = (u8)(bn % info->MS_Lib.PagesPerBlock);
1796 if (blen > (info->MS_Lib.PagesPerBlock-PageNum))
1797 len = info->MS_Lib.PagesPerBlock-PageNum;
1801 oldphy = ms_libconv_to_physical(info, PhyBlockAddr); /* need check us <-> info */
1802 newphy = ms_libsearch_block_from_logical(us, PhyBlockAddr);
1804 result = ms_read_copyblock(us, oldphy, newphy, PhyBlockAddr, PageNum, buf+offset, len);
1806 if (result != USB_STOR_XFER_GOOD) {
1807 pr_info("MS_SCSI_Write --- result = %x\n", result);
1808 result = USB_STOR_TRANSPORT_ERROR;
1812 info->MS_Lib.Phy2LogMap[oldphy] = MS_LB_NOT_USED_ERASED;
1813 ms_lib_force_setlogical_pair(us, PhyBlockAddr, newphy);
1820 offset += MS_BYTES_PER_PAGE*len;
1832 static int ene_get_card_type(struct us_data *us, u16 index, void *buf)
1834 struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1837 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1838 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1839 bcb->DataTransferLength = 0x01;
1840 bcb->Flags = US_BULK_FLAG_IN;
1842 bcb->CDB[2] = (unsigned char)(index>>8);
1843 bcb->CDB[3] = (unsigned char)index;
1845 result = ene_send_scsi_cmd(us, FDIR_READ, buf, 0);
1849 static int ene_get_card_status(struct us_data *us, u8 *buf)
1853 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1855 /*usb_stor_dbg(us, "transport --- ENE_ReadSDReg\n");*/
1856 reg4b = *(u32 *)&buf[0x18];
1857 info->SD_READ_BL_LEN = (u8)((reg4b >> 8) & 0x0f);
1859 tmpreg = (u16) reg4b;
1860 reg4b = *(u32 *)(&buf[0x14]);
1861 if (info->SD_Status.HiCapacity && !info->SD_Status.IsMMC)
1862 info->HC_C_SIZE = (reg4b >> 8) & 0x3fffff;
1864 info->SD_C_SIZE = ((tmpreg & 0x03) << 10) | (u16)(reg4b >> 22);
1865 info->SD_C_SIZE_MULT = (u8)(reg4b >> 7) & 0x07;
1866 if (info->SD_Status.HiCapacity && info->SD_Status.IsMMC)
1867 info->HC_C_SIZE = *(u32 *)(&buf[0x100]);
1869 if (info->SD_READ_BL_LEN > SD_BLOCK_LEN) {
1870 info->SD_Block_Mult = 1 << (info->SD_READ_BL_LEN-SD_BLOCK_LEN);
1871 info->SD_READ_BL_LEN = SD_BLOCK_LEN;
1873 info->SD_Block_Mult = 1;
1876 return USB_STOR_TRANSPORT_GOOD;
1879 static int ene_load_bincode(struct us_data *us, unsigned char flag)
1882 char *fw_name = NULL;
1883 unsigned char *buf = NULL;
1884 const struct firmware *sd_fw = NULL;
1885 int result = USB_STOR_TRANSPORT_ERROR;
1886 struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
1887 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1889 if (info->BIN_FLAG == flag)
1890 return USB_STOR_TRANSPORT_GOOD;
1894 case SD_INIT1_PATTERN:
1895 usb_stor_dbg(us, "SD_INIT1_PATTERN\n");
1896 fw_name = SD_INIT1_FIRMWARE;
1898 case SD_INIT2_PATTERN:
1899 usb_stor_dbg(us, "SD_INIT2_PATTERN\n");
1900 fw_name = SD_INIT2_FIRMWARE;
1903 usb_stor_dbg(us, "SD_RW_PATTERN\n");
1904 fw_name = SD_RW_FIRMWARE;
1907 case MS_INIT_PATTERN:
1908 usb_stor_dbg(us, "MS_INIT_PATTERN\n");
1909 fw_name = MS_INIT_FIRMWARE;
1911 case MSP_RW_PATTERN:
1912 usb_stor_dbg(us, "MSP_RW_PATTERN\n");
1913 fw_name = MSP_RW_FIRMWARE;
1916 usb_stor_dbg(us, "MS_RW_PATTERN\n");
1917 fw_name = MS_RW_FIRMWARE;
1920 usb_stor_dbg(us, "----------- Unknown PATTERN ----------\n");
1924 err = reject_firmware(&sd_fw, fw_name, &us->pusb_dev->dev);
1926 usb_stor_dbg(us, "load firmware %s failed\n", fw_name);
1929 buf = kmemdup(sd_fw->data, sd_fw->size, GFP_KERNEL);
1933 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
1934 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
1935 bcb->DataTransferLength = sd_fw->size;
1939 result = ene_send_scsi_cmd(us, FDIR_WRITE, buf, 0);
1940 if (us->srb != NULL)
1941 scsi_set_resid(us->srb, 0);
1942 info->BIN_FLAG = flag;
1946 release_firmware(sd_fw);
1950 static int ms_card_init(struct us_data *us)
1954 unsigned char *PageBuffer0 = NULL, *PageBuffer1 = NULL;
1955 struct ms_lib_type_extdat extdat;
1956 u16 btBlk1st, btBlk2nd;
1958 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
1960 printk(KERN_INFO "MS_CardInit start\n");
1962 ms_lib_free_allocatedarea(us); /* Clean buffer and set struct us_data flag to 0 */
1964 /* get two PageBuffer */
1965 PageBuffer0 = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
1966 PageBuffer1 = kmalloc(MS_BYTES_PER_PAGE, GFP_KERNEL);
1967 if ((PageBuffer0 == NULL) || (PageBuffer1 == NULL)) {
1968 result = MS_NO_MEMORY_ERROR;
1972 btBlk1st = btBlk2nd = MS_LB_NOT_USED;
1975 for (TmpBlock = 0; TmpBlock < MS_MAX_INITIAL_ERROR_BLOCKS+2; TmpBlock++) {
1977 switch (ms_read_readpage(us, TmpBlock, 0, (u32 *)PageBuffer0, &extdat)) {
1978 case MS_STATUS_SUCCESS:
1980 case MS_STATUS_INT_ERROR:
1982 case MS_STATUS_ERROR:
1987 if ((extdat.ovrflg & MS_REG_OVR_BKST) == MS_REG_OVR_BKST_NG)
1990 if (((extdat.mngflg & MS_REG_MNG_SYSFLG) == MS_REG_MNG_SYSFLG_USER) ||
1991 (be16_to_cpu(((struct ms_bootblock_page0 *)PageBuffer0)->header.wBlockID) != MS_BOOT_BLOCK_ID) ||
1992 (be16_to_cpu(((struct ms_bootblock_page0 *)PageBuffer0)->header.wFormatVersion) != MS_BOOT_BLOCK_FORMAT_VERSION) ||
1993 (((struct ms_bootblock_page0 *)PageBuffer0)->header.bNumberOfDataEntry != MS_BOOT_BLOCK_DATA_ENTRIES))
1996 if (btBlk1st != MS_LB_NOT_USED) {
1997 btBlk2nd = TmpBlock;
2001 btBlk1st = TmpBlock;
2002 memcpy(PageBuffer1, PageBuffer0, MS_BYTES_PER_PAGE);
2003 if (extdat.status1 & (MS_REG_ST1_DTER | MS_REG_ST1_EXER | MS_REG_ST1_FGER))
2007 if (btBlk1st == MS_LB_NOT_USED) {
2008 result = MS_STATUS_ERROR;
2013 if ((extdat.status0 & MS_REG_ST0_WP) == MS_REG_ST0_WP_ON)
2014 ms_lib_ctrl_set(info, MS_LIB_CTRL_WRPROTECT);
2016 result = MS_STATUS_ERROR;
2017 /* 1st Boot Block */
2018 if (btBlk1stErred == 0)
2019 result = ms_lib_process_bootblock(us, btBlk1st, PageBuffer1);
2021 /* 2nd Boot Block */
2022 if (result && (btBlk2nd != MS_LB_NOT_USED))
2023 result = ms_lib_process_bootblock(us, btBlk2nd, PageBuffer0);
2026 result = MS_STATUS_ERROR;
2030 for (TmpBlock = 0; TmpBlock < btBlk1st; TmpBlock++)
2031 info->MS_Lib.Phy2LogMap[TmpBlock] = MS_LB_INITIAL_ERROR;
2033 info->MS_Lib.Phy2LogMap[btBlk1st] = MS_LB_BOOT_BLOCK;
2035 if (btBlk2nd != MS_LB_NOT_USED) {
2036 for (TmpBlock = btBlk1st + 1; TmpBlock < btBlk2nd; TmpBlock++)
2037 info->MS_Lib.Phy2LogMap[TmpBlock] = MS_LB_INITIAL_ERROR;
2039 info->MS_Lib.Phy2LogMap[btBlk2nd] = MS_LB_BOOT_BLOCK;
2042 result = ms_lib_scan_logicalblocknumber(us, btBlk1st);
2046 for (TmpBlock = MS_PHYSICAL_BLOCKS_PER_SEGMENT;
2047 TmpBlock < info->MS_Lib.NumberOfPhyBlock;
2048 TmpBlock += MS_PHYSICAL_BLOCKS_PER_SEGMENT) {
2049 if (ms_count_freeblock(us, TmpBlock) == 0) {
2050 ms_lib_ctrl_set(info, MS_LIB_CTRL_WRPROTECT);
2056 if (ms_lib_alloc_writebuf(us)) {
2057 result = MS_NO_MEMORY_ERROR;
2061 result = MS_STATUS_SUCCESS;
2067 printk(KERN_INFO "MS_CardInit end\n");
2071 static int ene_ms_init(struct us_data *us)
2073 struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
2075 u16 MSP_BlockSize, MSP_UserAreaBlocks;
2076 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
2077 u8 *bbuf = info->bbuf;
2079 printk(KERN_INFO "transport --- ENE_MSInit\n");
2081 /* the same part to test ENE */
2083 result = ene_load_bincode(us, MS_INIT_PATTERN);
2084 if (result != USB_STOR_XFER_GOOD) {
2085 printk(KERN_ERR "Load MS Init Code Fail !!\n");
2086 return USB_STOR_TRANSPORT_ERROR;
2089 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
2090 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
2091 bcb->DataTransferLength = 0x200;
2092 bcb->Flags = US_BULK_FLAG_IN;
2096 result = ene_send_scsi_cmd(us, FDIR_READ, bbuf, 0);
2097 if (result != USB_STOR_XFER_GOOD) {
2098 printk(KERN_ERR "Execution MS Init Code Fail !!\n");
2099 return USB_STOR_TRANSPORT_ERROR;
2101 /* the same part to test ENE */
2102 info->MS_Status = *(struct MS_STATUS *) bbuf;
2104 if (info->MS_Status.Insert && info->MS_Status.Ready) {
2105 printk(KERN_INFO "Insert = %x\n", info->MS_Status.Insert);
2106 printk(KERN_INFO "Ready = %x\n", info->MS_Status.Ready);
2107 printk(KERN_INFO "IsMSPro = %x\n", info->MS_Status.IsMSPro);
2108 printk(KERN_INFO "IsMSPHG = %x\n", info->MS_Status.IsMSPHG);
2109 printk(KERN_INFO "WtP= %x\n", info->MS_Status.WtP);
2110 if (info->MS_Status.IsMSPro) {
2111 MSP_BlockSize = (bbuf[6] << 8) | bbuf[7];
2112 MSP_UserAreaBlocks = (bbuf[10] << 8) | bbuf[11];
2113 info->MSP_TotalBlock = MSP_BlockSize * MSP_UserAreaBlocks;
2115 ms_card_init(us); /* Card is MS (to ms.c)*/
2117 usb_stor_dbg(us, "MS Init Code OK !!\n");
2119 usb_stor_dbg(us, "MS Card Not Ready --- %x\n", bbuf[0]);
2120 return USB_STOR_TRANSPORT_ERROR;
2123 return USB_STOR_TRANSPORT_GOOD;
2126 static int ene_sd_init(struct us_data *us)
2129 struct bulk_cb_wrap *bcb = (struct bulk_cb_wrap *) us->iobuf;
2130 struct ene_ub6250_info *info = (struct ene_ub6250_info *) us->extra;
2131 u8 *bbuf = info->bbuf;
2133 usb_stor_dbg(us, "transport --- ENE_SDInit\n");
2134 /* SD Init Part-1 */
2135 result = ene_load_bincode(us, SD_INIT1_PATTERN);
2136 if (result != USB_STOR_XFER_GOOD) {
2137 usb_stor_dbg(us, "Load SD Init Code Part-1 Fail !!\n");
2138 return USB_STOR_TRANSPORT_ERROR;
2141 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
2142 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
2143 bcb->Flags = US_BULK_FLAG_IN;
2146 result = ene_send_scsi_cmd(us, FDIR_READ, NULL, 0);
2147 if (result != USB_STOR_XFER_GOOD) {
2148 usb_stor_dbg(us, "Execution SD Init Code Fail !!\n");
2149 return USB_STOR_TRANSPORT_ERROR;
2152 /* SD Init Part-2 */
2153 result = ene_load_bincode(us, SD_INIT2_PATTERN);
2154 if (result != USB_STOR_XFER_GOOD) {
2155 usb_stor_dbg(us, "Load SD Init Code Part-2 Fail !!\n");
2156 return USB_STOR_TRANSPORT_ERROR;
2159 memset(bcb, 0, sizeof(struct bulk_cb_wrap));
2160 bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN);
2161 bcb->DataTransferLength = 0x200;
2162 bcb->Flags = US_BULK_FLAG_IN;
2165 result = ene_send_scsi_cmd(us, FDIR_READ, bbuf, 0);
2166 if (result != USB_STOR_XFER_GOOD) {
2167 usb_stor_dbg(us, "Execution SD Init Code Fail !!\n");
2168 return USB_STOR_TRANSPORT_ERROR;
2171 info->SD_Status = *(struct SD_STATUS *) bbuf;
2172 if (info->SD_Status.Insert && info->SD_Status.Ready) {
2173 struct SD_STATUS *s = &info->SD_Status;
2175 ene_get_card_status(us, bbuf);
2176 usb_stor_dbg(us, "Insert = %x\n", s->Insert);
2177 usb_stor_dbg(us, "Ready = %x\n", s->Ready);
2178 usb_stor_dbg(us, "IsMMC = %x\n", s->IsMMC);
2179 usb_stor_dbg(us, "HiCapacity = %x\n", s->HiCapacity);
2180 usb_stor_dbg(us, "HiSpeed = %x\n", s->HiSpeed);
2181 usb_stor_dbg(us, "WtP = %x\n", s->WtP);
2183 usb_stor_dbg(us, "SD Card Not Ready --- %x\n", bbuf[0]);
2184 return USB_STOR_TRANSPORT_ERROR;
2186 return USB_STOR_TRANSPORT_GOOD;
2190 static int ene_init(struct us_data *us)
2194 struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2195 u8 *bbuf = info->bbuf;
2197 result = ene_get_card_type(us, REG_CARD_STATUS, bbuf);
2198 if (result != USB_STOR_XFER_GOOD)
2199 return USB_STOR_TRANSPORT_ERROR;
2201 misc_reg03 = bbuf[0];
2202 if (misc_reg03 & 0x01) {
2203 if (!info->SD_Status.Ready) {
2204 result = ene_sd_init(us);
2205 if (result != USB_STOR_XFER_GOOD)
2206 return USB_STOR_TRANSPORT_ERROR;
2209 if (misc_reg03 & 0x02) {
2210 if (!info->MS_Status.Ready) {
2211 result = ene_ms_init(us);
2212 if (result != USB_STOR_XFER_GOOD)
2213 return USB_STOR_TRANSPORT_ERROR;
2219 /*----- sd_scsi_irp() ---------*/
2220 static int sd_scsi_irp(struct us_data *us, struct scsi_cmnd *srb)
2223 struct ene_ub6250_info *info = (struct ene_ub6250_info *)us->extra;
2225 info->SrbStatus = SS_SUCCESS;
2226 switch (srb->cmnd[0]) {
2227 case TEST_UNIT_READY:
2228 result = sd_scsi_test_unit_ready(us, srb);
2231 result = sd_scsi_inquiry(us, srb);
2234 result = sd_scsi_mode_sense(us, srb);
2238 result = SD_SCSI_Start_Stop(us, srb);
2242 result = sd_scsi_read_capacity(us, srb);
2245 result = sd_scsi_read(us, srb);
2248 result = sd_scsi_write(us, srb);
2251 info->SrbStatus = SS_ILLEGAL_REQUEST;
2252 result = USB_STOR_TRANSPORT_FAILED;
2261 static int ms_scsi_irp(struct us_data *us, struct scsi_cmnd *srb)
2264 struct ene_ub6250_info *info = (struct ene_ub6250_info *)us->extra;
2265 info->SrbStatus = SS_SUCCESS;
2266 switch (srb->cmnd[0]) {
2267 case TEST_UNIT_READY:
2268 result = ms_scsi_test_unit_ready(us, srb);
2271 result = ms_scsi_inquiry(us, srb);
2274 result = ms_scsi_mode_sense(us, srb);
2277 result = ms_scsi_read_capacity(us, srb);
2280 result = ms_scsi_read(us, srb);
2283 result = ms_scsi_write(us, srb);
2286 info->SrbStatus = SS_ILLEGAL_REQUEST;
2287 result = USB_STOR_TRANSPORT_FAILED;
2293 static int ene_transport(struct scsi_cmnd *srb, struct us_data *us)
2295 int result = USB_STOR_XFER_GOOD;
2296 struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2298 /*US_DEBUG(usb_stor_show_command(us, srb)); */
2299 scsi_set_resid(srb, 0);
2300 if (unlikely(!(info->SD_Status.Ready || info->MS_Status.Ready)))
2301 result = ene_init(us);
2302 if (result == USB_STOR_XFER_GOOD) {
2303 result = USB_STOR_TRANSPORT_ERROR;
2304 if (info->SD_Status.Ready)
2305 result = sd_scsi_irp(us, srb);
2307 if (info->MS_Status.Ready)
2308 result = ms_scsi_irp(us, srb);
2313 static struct scsi_host_template ene_ub6250_host_template;
2315 static int ene_ub6250_probe(struct usb_interface *intf,
2316 const struct usb_device_id *id)
2321 struct ene_ub6250_info *info;
2323 result = usb_stor_probe1(&us, intf, id,
2324 (id - ene_ub6250_usb_ids) + ene_ub6250_unusual_dev_list,
2325 &ene_ub6250_host_template);
2329 /* FIXME: where should the code alloc extra buf ? */
2330 us->extra = kzalloc(sizeof(struct ene_ub6250_info), GFP_KERNEL);
2333 us->extra_destructor = ene_ub6250_info_destructor;
2335 info = (struct ene_ub6250_info *)(us->extra);
2336 info->bbuf = kmalloc(512, GFP_KERNEL);
2342 us->transport_name = "ene_ub6250";
2343 us->transport = ene_transport;
2346 result = usb_stor_probe2(us);
2350 /* probe card type */
2351 result = ene_get_card_type(us, REG_CARD_STATUS, info->bbuf);
2352 if (result != USB_STOR_XFER_GOOD) {
2353 usb_stor_disconnect(intf);
2354 return USB_STOR_TRANSPORT_ERROR;
2357 misc_reg03 = info->bbuf[0];
2358 if (!(misc_reg03 & 0x01)) {
2359 pr_info("ums_eneub6250: This driver only supports SD/MS cards. "
2360 "It does not support SM cards.\n");
2369 static int ene_ub6250_resume(struct usb_interface *iface)
2372 struct us_data *us = usb_get_intfdata(iface);
2373 struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2375 mutex_lock(&us->dev_mutex);
2377 if (us->suspend_resume_hook)
2378 (us->suspend_resume_hook)(us, US_RESUME);
2380 mutex_unlock(&us->dev_mutex);
2382 info->Power_IsResum = true;
2383 /*info->SD_Status.Ready = 0; */
2384 info->SD_Status = *(struct SD_STATUS *)&tmp;
2385 info->MS_Status = *(struct MS_STATUS *)&tmp;
2386 info->SM_Status = *(struct SM_STATUS *)&tmp;
2391 static int ene_ub6250_reset_resume(struct usb_interface *iface)
2394 struct us_data *us = usb_get_intfdata(iface);
2395 struct ene_ub6250_info *info = (struct ene_ub6250_info *)(us->extra);
2397 /* Report the reset to the SCSI core */
2398 usb_stor_reset_resume(iface);
2401 * FIXME: Notify the subdrivers that they need to reinitialize
2404 info->Power_IsResum = true;
2405 /*info->SD_Status.Ready = 0; */
2406 info->SD_Status = *(struct SD_STATUS *)&tmp;
2407 info->MS_Status = *(struct MS_STATUS *)&tmp;
2408 info->SM_Status = *(struct SM_STATUS *)&tmp;
2415 #define ene_ub6250_resume NULL
2416 #define ene_ub6250_reset_resume NULL
2420 static struct usb_driver ene_ub6250_driver = {
2422 .probe = ene_ub6250_probe,
2423 .disconnect = usb_stor_disconnect,
2424 .suspend = usb_stor_suspend,
2425 .resume = ene_ub6250_resume,
2426 .reset_resume = ene_ub6250_reset_resume,
2427 .pre_reset = usb_stor_pre_reset,
2428 .post_reset = usb_stor_post_reset,
2429 .id_table = ene_ub6250_usb_ids,
2434 module_usb_stor_driver(ene_ub6250_driver, ene_ub6250_host_template, DRV_NAME);