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