linux/drivers/staging/rts5139/rts51x_scsi.c
<<
>>
Prefs
   1/* Driver for Realtek RTS51xx USB card reader
   2 *
   3 * Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms of the GNU General Public License as published by the
   7 * Free Software Foundation; either version 2, or (at your option) any
   8 * later version.
   9 *
  10 * This program is distributed in the hope that it will be useful, but
  11 * WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13 * General Public License for more details.
  14 *
  15 * You should have received a copy of the GNU General Public License along
  16 * with this program; if not, see <http://www.gnu.org/licenses/>.
  17 *
  18 * Author:
  19 *   wwang (wei_wang@realsil.com.cn)
  20 *   No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China
  21 * Maintainer:
  22 *   Edwin Rong (edwin_rong@realsil.com.cn)
  23 *   No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China
  24 */
  25
  26#include <linux/blkdev.h>
  27#include <linux/kthread.h>
  28#include <linux/sched.h>
  29#include <linux/slab.h>
  30#include <linux/vmalloc.h>
  31#include <linux/export.h>
  32
  33#include <scsi/scsi.h>
  34#include <scsi/scsi_eh.h>
  35#include <scsi/scsi_device.h>
  36
  37#include "debug.h"
  38#include "rts51x.h"
  39#include "rts51x_chip.h"
  40#include "rts51x_scsi.h"
  41#include "rts51x_card.h"
  42#include "rts51x_transport.h"
  43#include "sd_cprm.h"
  44#include "ms_mg.h"
  45#include "trace.h"
  46
  47void rts51x_scsi_show_command(struct scsi_cmnd *srb)
  48{
  49        char *what = NULL;
  50        int i, unknown_cmd = 0;
  51
  52        switch (srb->cmnd[0]) {
  53        case TEST_UNIT_READY:
  54                what = (char *)"TEST_UNIT_READY";
  55                break;
  56        case REZERO_UNIT:
  57                what = (char *)"REZERO_UNIT";
  58                break;
  59        case REQUEST_SENSE:
  60                what = (char *)"REQUEST_SENSE";
  61                break;
  62        case FORMAT_UNIT:
  63                what = (char *)"FORMAT_UNIT";
  64                break;
  65        case READ_BLOCK_LIMITS:
  66                what = (char *)"READ_BLOCK_LIMITS";
  67                break;
  68        case 0x07:
  69                what = (char *)"REASSIGN_BLOCKS";
  70                break;
  71        case READ_6:
  72                what = (char *)"READ_6";
  73                break;
  74        case WRITE_6:
  75                what = (char *)"WRITE_6";
  76                break;
  77        case SEEK_6:
  78                what = (char *)"SEEK_6";
  79                break;
  80        case READ_REVERSE:
  81                what = (char *)"READ_REVERSE";
  82                break;
  83        case WRITE_FILEMARKS:
  84                what = (char *)"WRITE_FILEMARKS";
  85                break;
  86        case SPACE:
  87                what = (char *)"SPACE";
  88                break;
  89        case INQUIRY:
  90                what = (char *)"INQUIRY";
  91                break;
  92        case RECOVER_BUFFERED_DATA:
  93                what = (char *)"RECOVER_BUFFERED_DATA";
  94                break;
  95        case MODE_SELECT:
  96                what = (char *)"MODE_SELECT";
  97                break;
  98        case RESERVE:
  99                what = (char *)"RESERVE";
 100                break;
 101        case RELEASE:
 102                what = (char *)"RELEASE";
 103                break;
 104        case COPY:
 105                what = (char *)"COPY";
 106                break;
 107        case ERASE:
 108                what = (char *)"ERASE";
 109                break;
 110        case MODE_SENSE:
 111                what = (char *)"MODE_SENSE";
 112                break;
 113        case START_STOP:
 114                what = (char *)"START_STOP";
 115                break;
 116        case RECEIVE_DIAGNOSTIC:
 117                what = (char *)"RECEIVE_DIAGNOSTIC";
 118                break;
 119        case SEND_DIAGNOSTIC:
 120                what = (char *)"SEND_DIAGNOSTIC";
 121                break;
 122        case ALLOW_MEDIUM_REMOVAL:
 123                what = (char *)"ALLOW_MEDIUM_REMOVAL";
 124                break;
 125        case SET_WINDOW:
 126                what = (char *)"SET_WINDOW";
 127                break;
 128        case READ_CAPACITY:
 129                what = (char *)"READ_CAPACITY";
 130                break;
 131        case READ_10:
 132                what = (char *)"READ_10";
 133                break;
 134        case WRITE_10:
 135                what = (char *)"WRITE_10";
 136                break;
 137        case SEEK_10:
 138                what = (char *)"SEEK_10";
 139                break;
 140        case WRITE_VERIFY:
 141                what = (char *)"WRITE_VERIFY";
 142                break;
 143        case VERIFY:
 144                what = (char *)"VERIFY";
 145                break;
 146        case SEARCH_HIGH:
 147                what = (char *)"SEARCH_HIGH";
 148                break;
 149        case SEARCH_EQUAL:
 150                what = (char *)"SEARCH_EQUAL";
 151                break;
 152        case SEARCH_LOW:
 153                what = (char *)"SEARCH_LOW";
 154                break;
 155        case SET_LIMITS:
 156                what = (char *)"SET_LIMITS";
 157                break;
 158        case READ_POSITION:
 159                what = (char *)"READ_POSITION";
 160                break;
 161        case SYNCHRONIZE_CACHE:
 162                what = (char *)"SYNCHRONIZE_CACHE";
 163                break;
 164        case LOCK_UNLOCK_CACHE:
 165                what = (char *)"LOCK_UNLOCK_CACHE";
 166                break;
 167        case READ_DEFECT_DATA:
 168                what = (char *)"READ_DEFECT_DATA";
 169                break;
 170        case MEDIUM_SCAN:
 171                what = (char *)"MEDIUM_SCAN";
 172                break;
 173        case COMPARE:
 174                what = (char *)"COMPARE";
 175                break;
 176        case COPY_VERIFY:
 177                what = (char *)"COPY_VERIFY";
 178                break;
 179        case WRITE_BUFFER:
 180                what = (char *)"WRITE_BUFFER";
 181                break;
 182        case READ_BUFFER:
 183                what = (char *)"READ_BUFFER";
 184                break;
 185        case UPDATE_BLOCK:
 186                what = (char *)"UPDATE_BLOCK";
 187                break;
 188        case READ_LONG:
 189                what = (char *)"READ_LONG";
 190                break;
 191        case WRITE_LONG:
 192                what = (char *)"WRITE_LONG";
 193                break;
 194        case CHANGE_DEFINITION:
 195                what = (char *)"CHANGE_DEFINITION";
 196                break;
 197        case WRITE_SAME:
 198                what = (char *)"WRITE_SAME";
 199                break;
 200        case GPCMD_READ_SUBCHANNEL:
 201                what = (char *)"READ SUBCHANNEL";
 202                break;
 203        case READ_TOC:
 204                what = (char *)"READ_TOC";
 205                break;
 206        case GPCMD_READ_HEADER:
 207                what = (char *)"READ HEADER";
 208                break;
 209        case GPCMD_PLAY_AUDIO_10:
 210                what = (char *)"PLAY AUDIO (10)";
 211                break;
 212        case GPCMD_PLAY_AUDIO_MSF:
 213                what = (char *)"PLAY AUDIO MSF";
 214                break;
 215        case GPCMD_GET_EVENT_STATUS_NOTIFICATION:
 216                what = (char *)"GET EVENT/STATUS NOTIFICATION";
 217                break;
 218        case GPCMD_PAUSE_RESUME:
 219                what = (char *)"PAUSE/RESUME";
 220                break;
 221        case LOG_SELECT:
 222                what = (char *)"LOG_SELECT";
 223                break;
 224        case LOG_SENSE:
 225                what = (char *)"LOG_SENSE";
 226                break;
 227        case GPCMD_STOP_PLAY_SCAN:
 228                what = (char *)"STOP PLAY/SCAN";
 229                break;
 230        case GPCMD_READ_DISC_INFO:
 231                what = (char *)"READ DISC INFORMATION";
 232                break;
 233        case GPCMD_READ_TRACK_RZONE_INFO:
 234                what = (char *)"READ TRACK INFORMATION";
 235                break;
 236        case GPCMD_RESERVE_RZONE_TRACK:
 237                what = (char *)"RESERVE TRACK";
 238                break;
 239        case GPCMD_SEND_OPC:
 240                what = (char *)"SEND OPC";
 241                break;
 242        case MODE_SELECT_10:
 243                what = (char *)"MODE_SELECT_10";
 244                break;
 245        case GPCMD_REPAIR_RZONE_TRACK:
 246                what = (char *)"REPAIR TRACK";
 247                break;
 248        case 0x59:
 249                what = (char *)"READ MASTER CUE";
 250                break;
 251        case MODE_SENSE_10:
 252                what = (char *)"MODE_SENSE_10";
 253                break;
 254        case GPCMD_CLOSE_TRACK:
 255                what = (char *)"CLOSE TRACK/SESSION";
 256                break;
 257        case 0x5C:
 258                what = (char *)"READ BUFFER CAPACITY";
 259                break;
 260        case 0x5D:
 261                what = (char *)"SEND CUE SHEET";
 262                break;
 263        case GPCMD_BLANK:
 264                what = (char *)"BLANK";
 265                break;
 266        case REPORT_LUNS:
 267                what = (char *)"REPORT LUNS";
 268                break;
 269        case MOVE_MEDIUM:
 270                what = (char *)"MOVE_MEDIUM or PLAY AUDIO (12)";
 271                break;
 272        case READ_12:
 273                what = (char *)"READ_12";
 274                break;
 275        case WRITE_12:
 276                what = (char *)"WRITE_12";
 277                break;
 278        case WRITE_VERIFY_12:
 279                what = (char *)"WRITE_VERIFY_12";
 280                break;
 281        case SEARCH_HIGH_12:
 282                what = (char *)"SEARCH_HIGH_12";
 283                break;
 284        case SEARCH_EQUAL_12:
 285                what = (char *)"SEARCH_EQUAL_12";
 286                break;
 287        case SEARCH_LOW_12:
 288                what = (char *)"SEARCH_LOW_12";
 289                break;
 290        case SEND_VOLUME_TAG:
 291                what = (char *)"SEND_VOLUME_TAG";
 292                break;
 293        case READ_ELEMENT_STATUS:
 294                what = (char *)"READ_ELEMENT_STATUS";
 295                break;
 296        case GPCMD_READ_CD_MSF:
 297                what = (char *)"READ CD MSF";
 298                break;
 299        case GPCMD_SCAN:
 300                what = (char *)"SCAN";
 301                break;
 302        case GPCMD_SET_SPEED:
 303                what = (char *)"SET CD SPEED";
 304                break;
 305        case GPCMD_MECHANISM_STATUS:
 306                what = (char *)"MECHANISM STATUS";
 307                break;
 308        case GPCMD_READ_CD:
 309                what = (char *)"READ CD";
 310                break;
 311        case 0xE1:
 312                what = (char *)"WRITE CONTINUE";
 313                break;
 314        case WRITE_LONG_2:
 315                what = (char *)"WRITE_LONG_2";
 316                break;
 317        case VENDOR_CMND:
 318                what = (char *)"Realtek's vendor command";
 319                break;
 320        default:
 321                what = (char *)"(unknown command)";
 322                unknown_cmd = 1;
 323                break;
 324        }
 325
 326        if (srb->cmnd[0] != TEST_UNIT_READY)
 327                RTS51X_DEBUGP("Command %s (%d bytes)\n", what, srb->cmd_len);
 328        if (unknown_cmd) {
 329                RTS51X_DEBUGP("");
 330                for (i = 0; i < srb->cmd_len && i < 16; i++)
 331                        RTS51X_DEBUGPN(" %02x", srb->cmnd[i]);
 332                RTS51X_DEBUGPN("\n");
 333        }
 334}
 335
 336void rts51x_set_sense_type(struct rts51x_chip *chip, unsigned int lun, int sense_type)
 337{
 338        switch (sense_type) {
 339        case SENSE_TYPE_MEDIA_CHANGE:
 340                rts51x_set_sense_data(chip, lun, CUR_ERR, 0x06, 0, 0x28, 0, 0, 0);
 341                break;
 342
 343        case SENSE_TYPE_MEDIA_NOT_PRESENT:
 344                rts51x_set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x3A, 0, 0, 0);
 345                break;
 346
 347        case SENSE_TYPE_MEDIA_LBA_OVER_RANGE:
 348                rts51x_set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x21, 0, 0, 0);
 349                break;
 350
 351        case SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT:
 352                rts51x_set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x25, 0, 0, 0);
 353                break;
 354
 355        case SENSE_TYPE_MEDIA_WRITE_PROTECT:
 356                rts51x_set_sense_data(chip, lun, CUR_ERR, 0x07, 0, 0x27, 0, 0, 0);
 357                break;
 358
 359        case SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR:
 360                rts51x_set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x11, 0, 0, 0);
 361                break;
 362
 363        case SENSE_TYPE_MEDIA_WRITE_ERR:
 364                rts51x_set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x0C, 0x02, 0, 0);
 365                break;
 366
 367        case SENSE_TYPE_MEDIA_INVALID_CMD_FIELD:
 368                rts51x_set_sense_data(chip, lun, CUR_ERR, ILGAL_REQ, 0,
 369                               ASC_INVLD_CDB, ASCQ_INVLD_CDB, CDB_ILLEGAL, 1);
 370                break;
 371
 372        case SENSE_TYPE_FORMAT_CMD_FAILED:
 373                rts51x_set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x31, 0x01, 0, 0);
 374                break;
 375
 376#ifdef SUPPORT_MAGIC_GATE
 377        case SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB:
 378                rts51x_set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x6F, 0x02, 0, 0);
 379                break;
 380
 381        case SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN:
 382                rts51x_set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x6F, 0x00, 0, 0);
 383                break;
 384
 385        case SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM:
 386                rts51x_set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x30, 0x00, 0, 0);
 387                break;
 388
 389        case SENSE_TYPE_MG_WRITE_ERR:
 390                rts51x_set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x0C, 0x00, 0, 0);
 391                break;
 392#endif
 393
 394        case SENSE_TYPE_NO_SENSE:
 395        default:
 396                rts51x_set_sense_data(chip, lun, CUR_ERR, 0, 0, 0, 0, 0, 0);
 397                break;
 398        }
 399}
 400
 401void rts51x_set_sense_data(struct rts51x_chip *chip, unsigned int lun, u8 err_code,
 402                    u8 sense_key, u32 info, u8 asc, u8 ascq, u8 sns_key_info0,
 403                    u16 sns_key_info1)
 404{
 405        struct sense_data_t *sense = &(chip->sense_buffer[lun]);
 406
 407        sense->err_code = err_code;
 408        sense->sense_key = sense_key;
 409        sense->info[0] = (u8) (info >> 24);
 410        sense->info[1] = (u8) (info >> 16);
 411        sense->info[2] = (u8) (info >> 8);
 412        sense->info[3] = (u8) info;
 413
 414        sense->ad_sense_len = sizeof(struct sense_data_t) - 8;
 415        sense->asc = asc;
 416        sense->ascq = ascq;
 417        if (sns_key_info0 != 0) {
 418                sense->sns_key_info[0] = SKSV | sns_key_info0;
 419                sense->sns_key_info[1] = (sns_key_info1 & 0xf0) >> 8;
 420                sense->sns_key_info[2] = sns_key_info1 & 0x0f;
 421        }
 422}
 423
 424static int test_unit_ready(struct scsi_cmnd *srb, struct rts51x_chip *chip)
 425{
 426        unsigned int lun = SCSI_LUN(srb);
 427
 428        rts51x_init_cards(chip);
 429
 430        if (!check_card_ready(chip, lun)) {
 431                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
 432                return TRANSPORT_FAILED;
 433        }
 434
 435        if (!check_lun_mc(chip, lun)) {
 436                set_lun_mc(chip, lun);
 437                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
 438                return TRANSPORT_FAILED;
 439        }
 440
 441        return TRANSPORT_GOOD;
 442}
 443
 444unsigned char formatter_inquiry_str[20] = {
 445        'M', 'E', 'M', 'O', 'R', 'Y', 'S', 'T', 'I', 'C', 'K',
 446        '-', 'M', 'G',          /* Byte[47:49] */
 447        0x0B,                   /* Byte[50]: MG, MS, MSPro, MSXC */
 448        0x00,                   /* Byte[51]: Category Specific Commands */
 449        0x00,                   /* Byte[52]: Access Control and feature */
 450        0x20, 0x20, 0x20,       /* Byte[53:55] */
 451};
 452
 453static int inquiry(struct scsi_cmnd *srb, struct rts51x_chip *chip)
 454{
 455        unsigned int lun = SCSI_LUN(srb);
 456        char *inquiry_default = (char *)"Generic-xD/SD/M.S.      1.00 ";
 457        char *inquiry_string;
 458        unsigned char sendbytes;
 459        unsigned char *buf;
 460        u8 card = rts51x_get_lun_card(chip, lun);
 461        int pro_formatter_flag = 0;
 462        unsigned char inquiry_buf[] = {
 463                QULIFIRE | DRCT_ACCESS_DEV,
 464                RMB_DISC | 0x0D,
 465                0x00,
 466                0x01,
 467                0x1f,
 468                0x02,
 469                0,
 470                REL_ADR | WBUS_32 | WBUS_16 | SYNC | LINKED | CMD_QUE | SFT_RE,
 471        };
 472
 473        inquiry_string = inquiry_default;
 474
 475        buf = vmalloc(scsi_bufflen(srb));
 476        if (buf == NULL)
 477                TRACE_RET(chip, TRANSPORT_ERROR);
 478
 479        if (MS_FORMATTER_ENABLED(chip) && (get_lun2card(chip, lun) & MS_CARD)) {
 480                if (!card || (card == MS_CARD))
 481                        pro_formatter_flag = 1;
 482        }
 483
 484        if (pro_formatter_flag) {
 485                if (scsi_bufflen(srb) < 56)
 486                        sendbytes = (unsigned char)(scsi_bufflen(srb));
 487                else
 488                        sendbytes = 56;
 489        } else {
 490                if (scsi_bufflen(srb) < 36)
 491                        sendbytes = (unsigned char)(scsi_bufflen(srb));
 492                else
 493                        sendbytes = 36;
 494        }
 495
 496        if (sendbytes > 8) {
 497                memcpy(buf, inquiry_buf, 8);
 498                memcpy(buf + 8, inquiry_string, sendbytes - 8);
 499                if (pro_formatter_flag)
 500                        buf[4] = 0x33;  /* Additional Length */
 501        } else {
 502                memcpy(buf, inquiry_buf, sendbytes);
 503        }
 504
 505        if (pro_formatter_flag) {
 506                if (sendbytes > 36)
 507                        memcpy(buf + 36, formatter_inquiry_str, sendbytes - 36);
 508        }
 509
 510        scsi_set_resid(srb, 0);
 511
 512        rts51x_set_xfer_buf(buf, scsi_bufflen(srb), srb);
 513        vfree(buf);
 514
 515        return TRANSPORT_GOOD;
 516}
 517
 518static int start_stop_unit(struct scsi_cmnd *srb, struct rts51x_chip *chip)
 519{
 520        unsigned int lun = SCSI_LUN(srb);
 521
 522        scsi_set_resid(srb, scsi_bufflen(srb));
 523
 524        if (srb->cmnd[1] == 1)
 525                return TRANSPORT_GOOD;
 526
 527        switch (srb->cmnd[0x4]) {
 528        case STOP_MEDIUM:
 529                /* Media disabled */
 530                return TRANSPORT_GOOD;
 531
 532        case UNLOAD_MEDIUM:
 533                /* Media shall be unload */
 534                if (check_card_ready(chip, lun))
 535                        rts51x_eject_card(chip, lun);
 536                return TRANSPORT_GOOD;
 537
 538        case MAKE_MEDIUM_READY:
 539        case LOAD_MEDIUM:
 540                if (check_card_ready(chip, lun)) {
 541                        return TRANSPORT_GOOD;
 542                } else {
 543                        rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
 544                        TRACE_RET(chip, TRANSPORT_FAILED);
 545                }
 546
 547                break;
 548        }
 549
 550        TRACE_RET(chip, TRANSPORT_ERROR);
 551}
 552
 553static int allow_medium_removal(struct scsi_cmnd *srb, struct rts51x_chip *chip)
 554{
 555        int prevent;
 556
 557        prevent = srb->cmnd[4] & 0x1;
 558
 559        scsi_set_resid(srb, 0);
 560
 561        if (prevent) {
 562                rts51x_set_sense_type(chip, SCSI_LUN(srb),
 563                               SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
 564                TRACE_RET(chip, TRANSPORT_FAILED);
 565        }
 566
 567        return TRANSPORT_GOOD;
 568}
 569
 570static void ms_mode_sense(struct rts51x_chip *chip, u8 cmd,
 571                          int lun, u8 *buf, int buf_len)
 572{
 573        struct ms_info *ms_card = &(chip->ms_card);
 574        int sys_info_offset;
 575        int data_size = buf_len;
 576        int support_format = 0;
 577        int i = 0;
 578
 579        if (cmd == MODE_SENSE) {
 580                sys_info_offset = 8;
 581                if (data_size > 0x68)
 582                        data_size = 0x68;
 583                buf[i++] = 0x67;        /* Mode Data Length */
 584        } else {
 585                sys_info_offset = 12;
 586                if (data_size > 0x6C)
 587                        data_size = 0x6C;
 588                buf[i++] = 0x00;        /* Mode Data Length (MSB) */
 589                buf[i++] = 0x6A;        /* Mode Data Length (LSB) */
 590        }
 591
 592        /* Medium Type Code */
 593        if (check_card_ready(chip, lun)) {
 594                if (CHK_MSXC(ms_card)) {
 595                        support_format = 1;
 596                        buf[i++] = 0x40;
 597                } else if (CHK_MSPRO(ms_card)) {
 598                        support_format = 1;
 599                        buf[i++] = 0x20;
 600                } else {
 601                        buf[i++] = 0x10;
 602                }
 603
 604                /* WP */
 605                if (check_card_wp(chip, lun))
 606                        buf[i++] = 0x80;
 607                else
 608                        buf[i++] = 0x00;
 609        } else {
 610                buf[i++] = 0x00;        /* MediaType */
 611                buf[i++] = 0x00;        /* WP */
 612        }
 613
 614        buf[i++] = 0x00;        /* Reserved */
 615
 616        if (cmd == MODE_SENSE_10) {
 617                buf[i++] = 0x00;        /* Reserved */
 618                buf[i++] = 0x00;        /* Block descriptor length(MSB) */
 619                buf[i++] = 0x00;        /* Block descriptor length(LSB) */
 620
 621                /* The Following Data is the content of "Page 0x20" */
 622                if (data_size >= 9)
 623                        buf[i++] = 0x20;        /* Page Code */
 624                if (data_size >= 10)
 625                        buf[i++] = 0x62;        /* Page Length */
 626                if (data_size >= 11)
 627                        buf[i++] = 0x00;        /* No Access Control */
 628                if (data_size >= 12) {
 629                        if (support_format)
 630                                buf[i++] = 0xC0;        /* SF, SGM */
 631                        else
 632                                buf[i++] = 0x00;
 633                }
 634        } else {
 635                /* The Following Data is the content of "Page 0x20" */
 636                if (data_size >= 5)
 637                        buf[i++] = 0x20;        /* Page Code */
 638                if (data_size >= 6)
 639                        buf[i++] = 0x62;        /* Page Length */
 640                if (data_size >= 7)
 641                        buf[i++] = 0x00;        /* No Access Control */
 642                if (data_size >= 8) {
 643                        if (support_format)
 644                                buf[i++] = 0xC0;        /* SF, SGM */
 645                        else
 646                                buf[i++] = 0x00;
 647                }
 648        }
 649
 650        if (data_size > sys_info_offset) {
 651                /* 96 Bytes Attribute Data */
 652                int len = data_size - sys_info_offset;
 653                len = (len < 96) ? len : 96;
 654
 655                memcpy(buf + sys_info_offset, ms_card->raw_sys_info, len);
 656        }
 657}
 658
 659static int mode_sense(struct scsi_cmnd *srb, struct rts51x_chip *chip)
 660{
 661        unsigned int lun = SCSI_LUN(srb);
 662        unsigned int dataSize;
 663        int status;
 664        int pro_formatter_flag;
 665        unsigned char pageCode, *buf;
 666        u8 card = rts51x_get_lun_card(chip, lun);
 667
 668        if (!check_card_ready(chip, lun)) {
 669                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
 670                scsi_set_resid(srb, scsi_bufflen(srb));
 671                TRACE_RET(chip, TRANSPORT_FAILED);
 672        }
 673
 674        pro_formatter_flag = 0;
 675        dataSize = 8;
 676        /* In Combo mode, device responses ModeSense command as a MS LUN
 677         * when no card is inserted */
 678        if ((get_lun2card(chip, lun) & MS_CARD)) {
 679                if (!card || (card == MS_CARD)) {
 680                        dataSize = 108;
 681                        if (chip->option.rts51x_mspro_formatter_enable)
 682                                pro_formatter_flag = 1;
 683                }
 684        }
 685
 686        buf = kmalloc(dataSize, GFP_KERNEL);
 687        if (buf == NULL)
 688                TRACE_RET(chip, TRANSPORT_ERROR);
 689
 690        pageCode = srb->cmnd[2] & 0x3f;
 691
 692        if ((pageCode == 0x3F) || (pageCode == 0x1C) ||
 693            (pageCode == 0x00) || (pro_formatter_flag && (pageCode == 0x20))) {
 694                if (srb->cmnd[0] == MODE_SENSE) {
 695                        if ((pageCode == 0x3F) || (pageCode == 0x20)) {
 696                                ms_mode_sense(chip, srb->cmnd[0], lun, buf,
 697                                              dataSize);
 698                        } else {
 699                                dataSize = 4;
 700                                buf[0] = 0x03;
 701                                buf[1] = 0x00;
 702                                if (check_card_wp(chip, lun))
 703                                        buf[2] = 0x80;
 704                                else
 705                                buf[3] = 0x00;
 706                        }
 707                } else {
 708                        if ((pageCode == 0x3F) || (pageCode == 0x20)) {
 709                                ms_mode_sense(chip, srb->cmnd[0], lun, buf,
 710                                              dataSize);
 711                        } else {
 712                                dataSize = 8;
 713                                buf[0] = 0x00;
 714                                buf[1] = 0x06;
 715                                buf[2] = 0x00;
 716                                if (check_card_wp(chip, lun))
 717                                        buf[3] = 0x80;
 718                                else
 719                                        buf[3] = 0x00;
 720                                buf[4] = 0x00;
 721                                buf[5] = 0x00;
 722                                buf[6] = 0x00;
 723                                buf[7] = 0x00;
 724                        }
 725                }
 726                status = TRANSPORT_GOOD;
 727        } else {
 728                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
 729                scsi_set_resid(srb, scsi_bufflen(srb));
 730                status = TRANSPORT_FAILED;
 731        }
 732
 733        if (status == TRANSPORT_GOOD) {
 734                unsigned int len = min(scsi_bufflen(srb), dataSize);
 735                rts51x_set_xfer_buf(buf, len, srb);
 736                scsi_set_resid(srb, scsi_bufflen(srb) - len);
 737        }
 738        kfree(buf);
 739
 740        return status;
 741}
 742
 743static int request_sense(struct scsi_cmnd *srb, struct rts51x_chip *chip)
 744{
 745        struct sense_data_t *sense;
 746        unsigned int lun = SCSI_LUN(srb);
 747        struct ms_info *ms_card = &(chip->ms_card);
 748        unsigned char *tmp, *buf;
 749
 750        sense = &(chip->sense_buffer[lun]);
 751
 752        if ((rts51x_get_lun_card(chip, lun) == MS_CARD)
 753            && PRO_UNDER_FORMATTING(ms_card)) {
 754                rts51x_mspro_format_sense(chip, lun);
 755        }
 756
 757        buf = vmalloc(scsi_bufflen(srb));
 758        if (buf == NULL)
 759                TRACE_RET(chip, TRANSPORT_ERROR);
 760
 761        tmp = (unsigned char *)sense;
 762        memcpy(buf, tmp, scsi_bufflen(srb));
 763
 764        rts51x_set_xfer_buf(buf, scsi_bufflen(srb), srb);
 765        vfree(buf);
 766
 767        scsi_set_resid(srb, 0);
 768        /* Reset Sense Data */
 769        rts51x_set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
 770        return TRANSPORT_GOOD;
 771}
 772
 773static int read_write(struct scsi_cmnd *srb, struct rts51x_chip *chip)
 774{
 775        unsigned int lun = SCSI_LUN(srb);
 776        int retval;
 777        u32 start_sec;
 778        u16 sec_cnt;
 779
 780        if (!check_card_ready(chip, lun) || (chip->capacity[lun] == 0)) {
 781                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
 782                TRACE_RET(chip, TRANSPORT_FAILED);
 783        }
 784
 785        if (!check_lun_mc(chip, lun)) {
 786                set_lun_mc(chip, lun);
 787                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
 788                return TRANSPORT_FAILED;
 789        }
 790
 791        rts51x_prepare_run(chip);
 792        RTS51X_SET_STAT(chip, STAT_RUN);
 793
 794        if ((srb->cmnd[0] == READ_10) || (srb->cmnd[0] == WRITE_10)) {
 795                start_sec =
 796                    ((u32) srb->cmnd[2] << 24) |
 797                    ((u32) srb->cmnd[3] << 16) |
 798                    ((u32) srb->cmnd[4] << 8) |
 799                    ((u32) srb->cmnd[5]);
 800                sec_cnt = ((u16) (srb->cmnd[7]) << 8) | srb->cmnd[8];
 801        } else if ((srb->cmnd[0] == READ_6) || (srb->cmnd[0] == WRITE_6)) {
 802                start_sec = ((u32) (srb->cmnd[1] & 0x1F) << 16) |
 803                    ((u32) srb->cmnd[2] << 8) | ((u32) srb->cmnd[3]);
 804                sec_cnt = srb->cmnd[4];
 805        } else if ((srb->cmnd[0] == VENDOR_CMND) &&
 806                        (srb->cmnd[1] == SCSI_APP_CMD) &&
 807                        ((srb->cmnd[2] == PP_READ10) ||
 808                         (srb->cmnd[2] == PP_WRITE10))) {
 809                start_sec = ((u32) srb->cmnd[4] << 24) |
 810                        ((u32) srb->cmnd[5] << 16) |
 811                        ((u32) srb->cmnd[6] << 8) |
 812                        ((u32) srb->cmnd[7]);
 813                sec_cnt = ((u16) (srb->cmnd[9]) << 8) | srb->cmnd[10];
 814        } else {
 815                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
 816                TRACE_RET(chip, TRANSPORT_FAILED);
 817        }
 818
 819        if ((start_sec > chip->capacity[lun]) ||
 820            ((start_sec + sec_cnt) > chip->capacity[lun])) {
 821                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LBA_OVER_RANGE);
 822                TRACE_RET(chip, TRANSPORT_FAILED);
 823        }
 824
 825        if (sec_cnt == 0) {
 826                scsi_set_resid(srb, 0);
 827                return TRANSPORT_GOOD;
 828        }
 829
 830        if ((srb->sc_data_direction == DMA_TO_DEVICE)
 831            && check_card_wp(chip, lun)) {
 832                RTS51X_DEBUGP("Write protected card!\n");
 833                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
 834                TRACE_RET(chip, TRANSPORT_FAILED);
 835        }
 836
 837        retval = rts51x_card_rw(srb, chip, start_sec, sec_cnt);
 838        if (retval != STATUS_SUCCESS) {
 839                if (srb->sc_data_direction == DMA_FROM_DEVICE) {
 840                        rts51x_set_sense_type(chip, lun,
 841                                       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
 842                } else {
 843                        rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
 844                }
 845                TRACE_RET(chip, TRANSPORT_FAILED);
 846        }
 847
 848        scsi_set_resid(srb, 0);
 849
 850        return TRANSPORT_GOOD;
 851}
 852
 853static int read_format_capacity(struct scsi_cmnd *srb, struct rts51x_chip *chip)
 854{
 855        unsigned char *buf;
 856        unsigned int lun = SCSI_LUN(srb);
 857        unsigned int buf_len;
 858        u8 card = rts51x_get_lun_card(chip, lun);
 859        int desc_cnt;
 860        int i = 0;
 861
 862        if (!check_card_ready(chip, lun)) {
 863                if (!chip->option.rts51x_mspro_formatter_enable) {
 864                        rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
 865                        TRACE_RET(chip, TRANSPORT_FAILED);
 866                }
 867        }
 868
 869        buf_len = (scsi_bufflen(srb) > 12) ? 0x14 : 12;
 870
 871        buf = kmalloc(buf_len, GFP_KERNEL);
 872        if (buf == NULL)
 873                TRACE_RET(chip, TRANSPORT_ERROR);
 874
 875        buf[i++] = 0;
 876        buf[i++] = 0;
 877        buf[i++] = 0;
 878
 879        /* Capacity List Length */
 880        if ((buf_len > 12) && chip->option.rts51x_mspro_formatter_enable &&
 881            (chip->lun2card[lun] & MS_CARD) && (!card || (card == MS_CARD))) {
 882                buf[i++] = 0x10;
 883                desc_cnt = 2;
 884        } else {
 885                buf[i++] = 0x08;
 886                desc_cnt = 1;
 887        }
 888
 889        while (desc_cnt) {
 890                if (check_card_ready(chip, lun)) {
 891                        buf[i++] = (unsigned char)((chip->capacity[lun]) >> 24);
 892                        buf[i++] = (unsigned char)((chip->capacity[lun]) >> 16);
 893                        buf[i++] = (unsigned char)((chip->capacity[lun]) >> 8);
 894                        buf[i++] = (unsigned char)(chip->capacity[lun]);
 895
 896                        if (desc_cnt == 2)
 897                                /* Byte[8]: Descriptor Type: Formatted medium */
 898                                buf[i++] = 2;
 899                        else
 900                                buf[i++] = 0;   /* Byte[16] */
 901                } else {
 902                        buf[i++] = 0xFF;
 903                        buf[i++] = 0xFF;
 904                        buf[i++] = 0xFF;
 905                        buf[i++] = 0xFF;
 906
 907                        if (desc_cnt == 2)
 908                                /* Byte[8]: Descriptor Type: No medium */
 909                                buf[i++] = 3;
 910                        else
 911                                buf[i++] = 0;   /*Byte[16] */
 912                }
 913
 914                buf[i++] = 0x00;
 915                buf[i++] = 0x02;
 916                buf[i++] = 0x00;
 917
 918                desc_cnt--;
 919        }
 920
 921        buf_len = min(scsi_bufflen(srb), buf_len);
 922        rts51x_set_xfer_buf(buf, buf_len, srb);
 923        kfree(buf);
 924
 925        scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
 926
 927        return TRANSPORT_GOOD;
 928}
 929
 930static int read_capacity(struct scsi_cmnd *srb, struct rts51x_chip *chip)
 931{
 932        unsigned char *buf;
 933        unsigned int lun = SCSI_LUN(srb);
 934
 935        if (!check_card_ready(chip, lun)) {
 936                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
 937                TRACE_RET(chip, TRANSPORT_FAILED);
 938        }
 939
 940        if (!check_lun_mc(chip, lun)) {
 941                set_lun_mc(chip, lun);
 942                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
 943                return TRANSPORT_FAILED;
 944        }
 945
 946        buf = kmalloc(8, GFP_KERNEL);
 947        if (buf == NULL)
 948                TRACE_RET(chip, TRANSPORT_ERROR);
 949
 950        buf[0] = (unsigned char)((chip->capacity[lun] - 1) >> 24);
 951        buf[1] = (unsigned char)((chip->capacity[lun] - 1) >> 16);
 952        buf[2] = (unsigned char)((chip->capacity[lun] - 1) >> 8);
 953        buf[3] = (unsigned char)(chip->capacity[lun] - 1);
 954
 955        buf[4] = 0x00;
 956        buf[5] = 0x00;
 957        buf[6] = 0x02;
 958        buf[7] = 0x00;
 959
 960        rts51x_set_xfer_buf(buf, scsi_bufflen(srb), srb);
 961        kfree(buf);
 962
 963        scsi_set_resid(srb, 0);
 964
 965        return TRANSPORT_GOOD;
 966}
 967
 968static int get_dev_status(struct scsi_cmnd *srb, struct rts51x_chip *chip)
 969{
 970        unsigned int lun = SCSI_LUN(srb);
 971        unsigned int buf_len;
 972        u8 status[32] = { 0 };
 973
 974        rts51x_pp_status(chip, lun, status, 32);
 975
 976        buf_len = min(scsi_bufflen(srb), (unsigned int)sizeof(status));
 977        rts51x_set_xfer_buf(status, buf_len, srb);
 978        scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
 979
 980        return TRANSPORT_GOOD;
 981}
 982
 983static int read_status(struct scsi_cmnd *srb, struct rts51x_chip *chip)
 984{
 985        u8 rts51x_status[16];
 986        unsigned int buf_len;
 987        unsigned int lun = SCSI_LUN(srb);
 988
 989        rts51x_read_status(chip, lun, rts51x_status, 16);
 990
 991        buf_len = min(scsi_bufflen(srb), (unsigned int)sizeof(rts51x_status));
 992        rts51x_set_xfer_buf(rts51x_status, buf_len, srb);
 993        scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
 994
 995        return TRANSPORT_GOOD;
 996}
 997
 998static int read_mem(struct scsi_cmnd *srb, struct rts51x_chip *chip)
 999{
1000        unsigned int lun = SCSI_LUN(srb);
1001        unsigned short addr, len, i;
1002        int retval;
1003        u8 *buf;
1004
1005        rts51x_prepare_run(chip);
1006        RTS51X_SET_STAT(chip, STAT_RUN);
1007
1008        addr = ((u16) srb->cmnd[2] << 8) | srb->cmnd[3];
1009        len = ((u16) srb->cmnd[4] << 8) | srb->cmnd[5];
1010
1011        if (addr < 0xe000) {
1012                RTS51X_DEBUGP("filter!addr=0x%x\n", addr);
1013                return TRANSPORT_GOOD;
1014        }
1015
1016        buf = vmalloc(len);
1017        if (!buf)
1018                TRACE_RET(chip, TRANSPORT_ERROR);
1019
1020        for (i = 0; i < len; i++) {
1021                retval = rts51x_ep0_read_register(chip, addr + i, buf + i);
1022                if (retval != STATUS_SUCCESS) {
1023                        vfree(buf);
1024                        rts51x_set_sense_type(chip, lun,
1025                                       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1026                        TRACE_RET(chip, TRANSPORT_FAILED);
1027                }
1028        }
1029
1030        len = (unsigned short)min(scsi_bufflen(srb), (unsigned int)len);
1031        rts51x_set_xfer_buf(buf, len, srb);
1032        scsi_set_resid(srb, scsi_bufflen(srb) - len);
1033
1034        vfree(buf);
1035
1036        return TRANSPORT_GOOD;
1037}
1038
1039static int write_mem(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1040{
1041        unsigned int lun = SCSI_LUN(srb);
1042        unsigned short addr, len, i;
1043        int retval;
1044        u8 *buf;
1045
1046        rts51x_prepare_run(chip);
1047        RTS51X_SET_STAT(chip, STAT_RUN);
1048
1049        addr = ((u16) srb->cmnd[2] << 8) | srb->cmnd[3];
1050        len = ((u16) srb->cmnd[4] << 8) | srb->cmnd[5];
1051
1052        if (addr < 0xe000) {
1053                RTS51X_DEBUGP("filter!addr=0x%x\n", addr);
1054                return TRANSPORT_GOOD;
1055        }
1056
1057        len = (unsigned short)min(scsi_bufflen(srb), (unsigned int)len);
1058        buf = vmalloc(len);
1059        if (!buf)
1060                TRACE_RET(chip, TRANSPORT_ERROR);
1061
1062        rts51x_get_xfer_buf(buf, len, srb);
1063
1064        for (i = 0; i < len; i++) {
1065                retval =
1066                    rts51x_ep0_write_register(chip, addr + i, 0xFF, buf[i]);
1067                if (retval != STATUS_SUCCESS) {
1068                        vfree(buf);
1069                        rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
1070                        TRACE_RET(chip, TRANSPORT_FAILED);
1071                }
1072        }
1073
1074        vfree(buf);
1075        scsi_set_resid(srb, scsi_bufflen(srb) - len);
1076
1077        return TRANSPORT_GOOD;
1078}
1079
1080static int get_sd_csd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1081{
1082        struct sd_info *sd_card = &(chip->sd_card);
1083        unsigned int lun = SCSI_LUN(srb);
1084
1085        if (!check_card_ready(chip, lun)) {
1086                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1087                TRACE_RET(chip, TRANSPORT_FAILED);
1088        }
1089
1090        if (rts51x_get_lun_card(chip, lun) != SD_CARD) {
1091                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1092                TRACE_RET(chip, TRANSPORT_FAILED);
1093        }
1094
1095        scsi_set_resid(srb, 0);
1096        rts51x_set_xfer_buf(sd_card->raw_csd, scsi_bufflen(srb), srb);
1097
1098        return TRANSPORT_GOOD;
1099}
1100
1101static int read_phy_register(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1102{
1103        int retval;
1104        u8 addr, len, i;
1105        u8 *buf;
1106
1107        rts51x_prepare_run(chip);
1108        RTS51X_SET_STAT(chip, STAT_RUN);
1109
1110        addr = srb->cmnd[5];
1111        len = srb->cmnd[7];
1112
1113        if (len) {
1114                buf = vmalloc(len);
1115                if (!buf)
1116                        TRACE_RET(chip, TRANSPORT_ERROR);
1117
1118                for (i = 0; i < len; i++) {
1119                        retval =
1120                            rts51x_read_phy_register(chip, addr + i, buf + i);
1121                        if (retval != STATUS_SUCCESS) {
1122                                vfree(buf);
1123                                rts51x_set_sense_type(chip, SCSI_LUN(srb),
1124                                        SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1125                                TRACE_RET(chip, TRANSPORT_FAILED);
1126                        }
1127                }
1128
1129                len = min(scsi_bufflen(srb), (unsigned int)len);
1130                rts51x_set_xfer_buf(buf, len, srb);
1131                scsi_set_resid(srb, scsi_bufflen(srb) - len);
1132
1133                vfree(buf);
1134        }
1135
1136        return TRANSPORT_GOOD;
1137}
1138
1139static int write_phy_register(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1140{
1141        int retval;
1142        u8 addr, len, i;
1143        u8 *buf;
1144
1145        rts51x_prepare_run(chip);
1146        RTS51X_SET_STAT(chip, STAT_RUN);
1147
1148        addr = srb->cmnd[5];
1149        len = srb->cmnd[7];
1150
1151        if (len) {
1152                len = min(scsi_bufflen(srb), (unsigned int)len);
1153
1154                buf = vmalloc(len);
1155                if (buf == NULL)
1156                        TRACE_RET(chip, TRANSPORT_ERROR);
1157
1158                rts51x_get_xfer_buf(buf, len, srb);
1159                scsi_set_resid(srb, scsi_bufflen(srb) - len);
1160
1161                for (i = 0; i < len; i++) {
1162                        retval =
1163                            rts51x_write_phy_register(chip, addr + i, buf[i]);
1164                        if (retval != STATUS_SUCCESS) {
1165                                vfree(buf);
1166                                rts51x_set_sense_type(chip, SCSI_LUN(srb),
1167                                               SENSE_TYPE_MEDIA_WRITE_ERR);
1168                                TRACE_RET(chip, TRANSPORT_FAILED);
1169                        }
1170                }
1171
1172                vfree(buf);
1173        }
1174
1175        return TRANSPORT_GOOD;
1176}
1177
1178static int get_card_bus_width(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1179{
1180        unsigned int lun = SCSI_LUN(srb);
1181        u8 card, bus_width;
1182
1183        if (!check_card_ready(chip, lun)) {
1184                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1185                TRACE_RET(chip, TRANSPORT_FAILED);
1186        }
1187
1188        card = rts51x_get_lun_card(chip, lun);
1189        if ((card == SD_CARD) || (card == MS_CARD)) {
1190                bus_width = chip->card_bus_width[lun];
1191        } else {
1192                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1193                TRACE_RET(chip, TRANSPORT_FAILED);
1194        }
1195
1196        scsi_set_resid(srb, 0);
1197        rts51x_set_xfer_buf(&bus_width, scsi_bufflen(srb), srb);
1198
1199        return TRANSPORT_GOOD;
1200}
1201
1202#ifdef _MSG_TRACE
1203static int trace_msg_cmd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1204{
1205        unsigned char *buf = NULL;
1206        u8 clear;
1207        unsigned int buf_len;
1208
1209        buf_len =
1210            4 +
1211            ((2 + MSG_FUNC_LEN + MSG_FILE_LEN + TIME_VAL_LEN) * TRACE_ITEM_CNT);
1212
1213        if ((scsi_bufflen(srb) < buf_len) || (scsi_sglist(srb) == NULL)) {
1214                rts51x_set_sense_type(chip, SCSI_LUN(srb),
1215                               SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1216                TRACE_RET(chip, TRANSPORT_FAILED);
1217        }
1218
1219        clear = srb->cmnd[2];
1220
1221        buf = vmalloc(scsi_bufflen(srb));
1222        if (buf == NULL)
1223                TRACE_RET(chip, TRANSPORT_ERROR);
1224
1225        rts51x_trace_msg(chip, buf, clear);
1226
1227        rts51x_set_xfer_buf(buf, scsi_bufflen(srb), srb);
1228        vfree(buf);
1229
1230        scsi_set_resid(srb, 0);
1231        return TRANSPORT_GOOD;
1232}
1233#endif
1234
1235static int rw_mem_cmd_buf(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1236{
1237        int retval = STATUS_SUCCESS;
1238        unsigned int lun = SCSI_LUN(srb);
1239        u8 cmd_type, mask, value, idx, mode, len;
1240        u16 addr;
1241        u32 timeout;
1242
1243        rts51x_prepare_run(chip);
1244        RTS51X_SET_STAT(chip, STAT_RUN);
1245
1246        switch (srb->cmnd[3]) {
1247        case INIT_BATCHCMD:
1248                rts51x_init_cmd(chip);
1249                break;
1250
1251        case ADD_BATCHCMD:
1252                cmd_type = srb->cmnd[4];
1253                if (cmd_type > 2) {
1254                        rts51x_set_sense_type(chip, lun,
1255                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1256                        TRACE_RET(chip, TRANSPORT_FAILED);
1257                }
1258                addr = (srb->cmnd[5] << 8) | srb->cmnd[6];
1259                mask = srb->cmnd[7];
1260                value = srb->cmnd[8];
1261                rts51x_add_cmd(chip, cmd_type, addr, mask, value);
1262                break;
1263
1264        case SEND_BATCHCMD:
1265                mode = srb->cmnd[4];
1266                len = srb->cmnd[5];
1267                timeout =
1268                    ((u32) srb->cmnd[6] << 24) | ((u32) srb->
1269                                                  cmnd[7] << 16) | ((u32) srb->
1270                                                                    cmnd[8] <<
1271                                                                    8) | ((u32)
1272                                                                          srb->
1273                                                                          cmnd
1274                                                                          [9]);
1275                retval = rts51x_send_cmd(chip, mode, 1000);
1276                if (retval != STATUS_SUCCESS) {
1277                        rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
1278                        TRACE_RET(chip, TRANSPORT_FAILED);
1279                }
1280                if (mode & STAGE_R) {
1281                        retval = rts51x_get_rsp(chip, len, timeout);
1282                        if (retval != STATUS_SUCCESS) {
1283                                rts51x_set_sense_type(chip, lun,
1284                                        SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1285                                TRACE_RET(chip, TRANSPORT_FAILED);
1286                        }
1287                }
1288                break;
1289
1290        case GET_BATCHRSP:
1291                idx = srb->cmnd[4];
1292                value = chip->rsp_buf[idx];
1293                if (scsi_bufflen(srb) < 1) {
1294                        rts51x_set_sense_type(chip, lun,
1295                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1296                        TRACE_RET(chip, TRANSPORT_FAILED);
1297                }
1298                rts51x_set_xfer_buf(&value, 1, srb);
1299                scsi_set_resid(srb, 0);
1300                break;
1301
1302        default:
1303                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1304                TRACE_RET(chip, TRANSPORT_FAILED);
1305        }
1306
1307        if (retval != STATUS_SUCCESS) {
1308                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
1309                TRACE_RET(chip, TRANSPORT_FAILED);
1310        }
1311
1312        return TRANSPORT_GOOD;
1313}
1314
1315static int suit_cmd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1316{
1317        int result;
1318
1319        switch (srb->cmnd[3]) {
1320        case INIT_BATCHCMD:
1321        case ADD_BATCHCMD:
1322        case SEND_BATCHCMD:
1323        case GET_BATCHRSP:
1324                result = rw_mem_cmd_buf(srb, chip);
1325                break;
1326        default:
1327                result = TRANSPORT_ERROR;
1328        }
1329
1330        return result;
1331}
1332
1333static int app_cmd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1334{
1335        int result;
1336
1337        switch (srb->cmnd[2]) {
1338        case PP_READ10:
1339        case PP_WRITE10:
1340                result = read_write(srb, chip);
1341                break;
1342
1343        case SUIT_CMD:
1344                result = suit_cmd(srb, chip);
1345                break;
1346
1347        case READ_PHY:
1348                result = read_phy_register(srb, chip);
1349                break;
1350
1351        case WRITE_PHY:
1352                result = write_phy_register(srb, chip);
1353                break;
1354
1355        case GET_DEV_STATUS:
1356                result = get_dev_status(srb, chip);
1357                break;
1358
1359        default:
1360                rts51x_set_sense_type(chip, SCSI_LUN(srb),
1361                               SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1362                TRACE_RET(chip, TRANSPORT_FAILED);
1363        }
1364
1365        return result;
1366}
1367
1368static int vendor_cmnd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1369{
1370        int result = TRANSPORT_GOOD;
1371
1372        switch (srb->cmnd[1]) {
1373        case READ_STATUS:
1374                result = read_status(srb, chip);
1375                break;
1376
1377        case READ_MEM:
1378                result = read_mem(srb, chip);
1379                break;
1380
1381        case WRITE_MEM:
1382                result = write_mem(srb, chip);
1383                break;
1384
1385        case GET_BUS_WIDTH:
1386                result = get_card_bus_width(srb, chip);
1387                break;
1388
1389        case GET_SD_CSD:
1390                result = get_sd_csd(srb, chip);
1391                break;
1392
1393#ifdef _MSG_TRACE
1394        case TRACE_MSG:
1395                result = trace_msg_cmd(srb, chip);
1396                break;
1397#endif
1398
1399        case SCSI_APP_CMD:
1400                result = app_cmd(srb, chip);
1401                break;
1402
1403        default:
1404                rts51x_set_sense_type(chip, SCSI_LUN(srb),
1405                               SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1406                TRACE_RET(chip, TRANSPORT_FAILED);
1407        }
1408
1409        return result;
1410}
1411
1412static int ms_format_cmnd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1413{
1414        struct ms_info *ms_card = &(chip->ms_card);
1415        unsigned int lun = SCSI_LUN(srb);
1416        int retval, quick_format;
1417
1418        if (rts51x_get_lun_card(chip, lun) != MS_CARD) {
1419                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
1420                TRACE_RET(chip, TRANSPORT_FAILED);
1421        }
1422
1423        if ((srb->cmnd[3] != 0x4D) || (srb->cmnd[4] != 0x47)
1424            || (srb->cmnd[5] != 0x66) || (srb->cmnd[6] != 0x6D)
1425            || (srb->cmnd[7] != 0x74)) {
1426                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1427                TRACE_RET(chip, TRANSPORT_FAILED);
1428        }
1429
1430        if (srb->cmnd[8] & 0x01)
1431                quick_format = 0;
1432        else
1433                quick_format = 1;
1434
1435        if (!(chip->card_ready & MS_CARD)) {
1436                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1437                TRACE_RET(chip, TRANSPORT_FAILED);
1438        }
1439
1440        if (chip->card_wp & MS_CARD) {
1441                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
1442                TRACE_RET(chip, TRANSPORT_FAILED);
1443        }
1444
1445        if (!CHK_MSPRO(ms_card)) {
1446                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
1447                TRACE_RET(chip, TRANSPORT_FAILED);
1448        }
1449
1450        rts51x_prepare_run(chip);
1451        RTS51X_SET_STAT(chip, STAT_RUN);
1452
1453        retval = rts51x_mspro_format(srb, chip, MS_SHORT_DATA_LEN, quick_format);
1454        if (retval != STATUS_SUCCESS) {
1455                rts51x_set_sense_type(chip, lun, SENSE_TYPE_FORMAT_CMD_FAILED);
1456                TRACE_RET(chip, TRANSPORT_FAILED);
1457        }
1458
1459        scsi_set_resid(srb, 0);
1460        return TRANSPORT_GOOD;
1461}
1462
1463#ifdef SUPPORT_PCGL_1P18
1464static int get_ms_information(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1465{
1466        struct ms_info *ms_card = &(chip->ms_card);
1467        unsigned int lun = SCSI_LUN(srb);
1468        u8 dev_info_id, data_len;
1469        u8 *buf;
1470        unsigned int buf_len;
1471        int i;
1472
1473        if (!check_card_ready(chip, lun)) {
1474                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1475                TRACE_RET(chip, TRANSPORT_FAILED);
1476        }
1477        if ((rts51x_get_lun_card(chip, lun) != MS_CARD)) {
1478                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
1479                TRACE_RET(chip, TRANSPORT_FAILED);
1480        }
1481
1482        if ((srb->cmnd[2] != 0xB0) || (srb->cmnd[4] != 0x4D) ||
1483            (srb->cmnd[5] != 0x53) || (srb->cmnd[6] != 0x49) ||
1484            (srb->cmnd[7] != 0x44)) {
1485                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1486                TRACE_RET(chip, TRANSPORT_FAILED);
1487        }
1488
1489        dev_info_id = srb->cmnd[3];
1490        if ((CHK_MSXC(ms_card) && (dev_info_id == 0x10)) ||
1491            (!CHK_MSXC(ms_card) && (dev_info_id == 0x13)) ||
1492            !CHK_MSPRO(ms_card)) {
1493                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1494                TRACE_RET(chip, TRANSPORT_FAILED);
1495        }
1496
1497        if (dev_info_id == 0x15)
1498                buf_len = data_len = 0x3A;
1499        else
1500                buf_len = data_len = 0x6A;
1501
1502        buf = kmalloc(buf_len, GFP_KERNEL);
1503        if (!buf)
1504                TRACE_RET(chip, TRANSPORT_ERROR);
1505
1506        i = 0;
1507        /* GET Memory Stick Media Information Response Header */
1508        buf[i++] = 0x00;        /* Data length MSB */
1509        buf[i++] = data_len;    /* Data length LSB */
1510        /* Device Information Type Code */
1511        if (CHK_MSXC(ms_card))
1512                buf[i++] = 0x03;
1513        else
1514                buf[i++] = 0x02;
1515        /* SGM bit */
1516        buf[i++] = 0x01;
1517        /* Reserved */
1518        buf[i++] = 0x00;
1519        buf[i++] = 0x00;
1520        buf[i++] = 0x00;
1521        /* Number of Device Information */
1522        buf[i++] = 0x01;
1523
1524        /*  Device Information Body
1525         *  Device Information ID Number */
1526        buf[i++] = dev_info_id;
1527        /* Device Information Length */
1528        if (dev_info_id == 0x15)
1529                data_len = 0x31;
1530        else
1531                data_len = 0x61;
1532        buf[i++] = 0x00;        /* Data length MSB */
1533        buf[i++] = data_len;    /* Data length LSB */
1534        /* Valid Bit */
1535        buf[i++] = 0x80;
1536        if ((dev_info_id == 0x10) || (dev_info_id == 0x13)) {
1537                /* System Information */
1538                memcpy(buf + i, ms_card->raw_sys_info, 96);
1539        } else {
1540                /* Model Name */
1541                memcpy(buf + i, ms_card->raw_model_name, 48);
1542        }
1543
1544        rts51x_set_xfer_buf(buf, buf_len, srb);
1545
1546        if (dev_info_id == 0x15)
1547                scsi_set_resid(srb, scsi_bufflen(srb) - 0x3C);
1548        else
1549                scsi_set_resid(srb, scsi_bufflen(srb) - 0x6C);
1550
1551        kfree(buf);
1552        return STATUS_SUCCESS;
1553}
1554#endif
1555
1556static int ms_sp_cmnd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1557{
1558        int retval = TRANSPORT_ERROR;
1559
1560        if (srb->cmnd[2] == MS_FORMAT)
1561                retval = ms_format_cmnd(srb, chip);
1562#ifdef SUPPORT_PCGL_1P18
1563        else if (srb->cmnd[2] == GET_MS_INFORMATION)
1564                retval = get_ms_information(srb, chip);
1565#endif
1566
1567        return retval;
1568}
1569
1570#ifdef SUPPORT_CPRM
1571static int sd_extention_cmnd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1572{
1573        unsigned int lun = SCSI_LUN(srb);
1574        int result;
1575
1576        rts51x_prepare_run(chip);
1577        RTS51X_SET_STAT(chip, STAT_RUN);
1578
1579        rts51x_sd_cleanup_work(chip);
1580
1581        if (!check_card_ready(chip, lun)) {
1582                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1583                TRACE_RET(chip, TRANSPORT_FAILED);
1584        }
1585        if ((rts51x_get_lun_card(chip, lun) != SD_CARD)) {
1586                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
1587                TRACE_RET(chip, TRANSPORT_FAILED);
1588        }
1589
1590        switch (srb->cmnd[0]) {
1591        case SD_PASS_THRU_MODE:
1592                result = rts51x_sd_pass_thru_mode(srb, chip);
1593                break;
1594
1595        case SD_EXECUTE_NO_DATA:
1596                result = rts51x_sd_execute_no_data(srb, chip);
1597                break;
1598
1599        case SD_EXECUTE_READ:
1600                result = rts51x_sd_execute_read_data(srb, chip);
1601                break;
1602
1603        case SD_EXECUTE_WRITE:
1604                result = rts51x_sd_execute_write_data(srb, chip);
1605                break;
1606
1607        case SD_GET_RSP:
1608                result = rts51x_sd_get_cmd_rsp(srb, chip);
1609                break;
1610
1611        case SD_HW_RST:
1612                result = rts51x_sd_hw_rst(srb, chip);
1613                break;
1614
1615        default:
1616                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1617                TRACE_RET(chip, TRANSPORT_FAILED);
1618        }
1619
1620        return result;
1621}
1622#endif
1623
1624#ifdef SUPPORT_MAGIC_GATE
1625static int mg_report_key(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1626{
1627        struct ms_info *ms_card = &(chip->ms_card);
1628        unsigned int lun = SCSI_LUN(srb);
1629        int retval;
1630        u8 key_format;
1631
1632        rts51x_prepare_run(chip);
1633        RTS51X_SET_STAT(chip, STAT_RUN);
1634
1635        rts51x_ms_cleanup_work(chip);
1636
1637        if (!check_card_ready(chip, lun)) {
1638                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1639                TRACE_RET(chip, TRANSPORT_FAILED);
1640        }
1641        if ((rts51x_get_lun_card(chip, lun) != MS_CARD)) {
1642                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
1643                TRACE_RET(chip, TRANSPORT_FAILED);
1644        }
1645
1646        if (srb->cmnd[7] != KC_MG_R_PRO) {
1647                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1648                TRACE_RET(chip, TRANSPORT_FAILED);
1649        }
1650
1651        if (!CHK_MSPRO(ms_card)) {
1652                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
1653                TRACE_RET(chip, TRANSPORT_FAILED);
1654        }
1655
1656        key_format = srb->cmnd[10] & 0x3F;
1657
1658        switch (key_format) {
1659        case KF_GET_LOC_EKB:
1660                if ((scsi_bufflen(srb) == 0x41C) &&
1661                    (srb->cmnd[8] == 0x04) && (srb->cmnd[9] == 0x1C)) {
1662                        retval = rts51x_mg_get_local_EKB(srb, chip);
1663                        if (retval != STATUS_SUCCESS)
1664                                TRACE_RET(chip, TRANSPORT_FAILED);
1665                } else {
1666                        rts51x_set_sense_type(chip, lun,
1667                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1668                        TRACE_RET(chip, TRANSPORT_FAILED);
1669                }
1670                break;
1671
1672        case KF_RSP_CHG:
1673                if ((scsi_bufflen(srb) == 0x24) &&
1674                    (srb->cmnd[8] == 0x00) && (srb->cmnd[9] == 0x24)) {
1675                        retval = rts51x_mg_get_rsp_chg(srb, chip);
1676                        if (retval != STATUS_SUCCESS)
1677                                TRACE_RET(chip, TRANSPORT_FAILED);
1678                } else {
1679                        rts51x_set_sense_type(chip, lun,
1680                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1681                        TRACE_RET(chip, TRANSPORT_FAILED);
1682                }
1683                break;
1684
1685        case KF_GET_ICV:
1686                ms_card->mg_entry_num = srb->cmnd[5];
1687                if ((scsi_bufflen(srb) == 0x404) &&
1688                    (srb->cmnd[8] == 0x04) &&
1689                    (srb->cmnd[9] == 0x04) &&
1690                    (srb->cmnd[2] == 0x00) &&
1691                    (srb->cmnd[3] == 0x00) &&
1692                    (srb->cmnd[4] == 0x00) && (srb->cmnd[5] < 32)) {
1693                        retval = rts51x_mg_get_ICV(srb, chip);
1694                        if (retval != STATUS_SUCCESS)
1695                                TRACE_RET(chip, TRANSPORT_FAILED);
1696                } else {
1697                        rts51x_set_sense_type(chip, lun,
1698                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1699                        TRACE_RET(chip, TRANSPORT_FAILED);
1700                }
1701                break;
1702
1703        default:
1704                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1705                TRACE_RET(chip, TRANSPORT_FAILED);
1706        }
1707
1708        scsi_set_resid(srb, 0);
1709        return TRANSPORT_GOOD;
1710}
1711
1712static int mg_send_key(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1713{
1714        struct ms_info *ms_card = &(chip->ms_card);
1715        unsigned int lun = SCSI_LUN(srb);
1716        int retval;
1717        u8 key_format;
1718
1719        rts51x_prepare_run(chip);
1720        RTS51X_SET_STAT(chip, STAT_RUN);
1721
1722        rts51x_ms_cleanup_work(chip);
1723
1724        if (!check_card_ready(chip, lun)) {
1725                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1726                TRACE_RET(chip, TRANSPORT_FAILED);
1727        }
1728        if (check_card_wp(chip, lun)) {
1729                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
1730                TRACE_RET(chip, TRANSPORT_FAILED);
1731        }
1732        if ((rts51x_get_lun_card(chip, lun) != MS_CARD)) {
1733                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
1734                TRACE_RET(chip, TRANSPORT_FAILED);
1735        }
1736
1737        if (srb->cmnd[7] != KC_MG_R_PRO) {
1738                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1739                TRACE_RET(chip, TRANSPORT_FAILED);
1740        }
1741
1742        if (!CHK_MSPRO(ms_card)) {
1743                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
1744                TRACE_RET(chip, TRANSPORT_FAILED);
1745        }
1746
1747        key_format = srb->cmnd[10] & 0x3F;
1748
1749        switch (key_format) {
1750        case KF_SET_LEAF_ID:
1751                if ((scsi_bufflen(srb) == 0x0C) &&
1752                    (srb->cmnd[8] == 0x00) && (srb->cmnd[9] == 0x0C)) {
1753                        retval = rts51x_mg_set_leaf_id(srb, chip);
1754                        if (retval != STATUS_SUCCESS)
1755                                TRACE_RET(chip, TRANSPORT_FAILED);
1756                } else {
1757                        rts51x_set_sense_type(chip, lun,
1758                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1759                        TRACE_RET(chip, TRANSPORT_FAILED);
1760                }
1761                break;
1762
1763        case KF_CHG_HOST:
1764                if ((scsi_bufflen(srb) == 0x0C) &&
1765                    (srb->cmnd[8] == 0x00) && (srb->cmnd[9] == 0x0C)) {
1766                        retval = rts51x_mg_chg(srb, chip);
1767                        if (retval != STATUS_SUCCESS)
1768                                TRACE_RET(chip, TRANSPORT_FAILED);
1769                } else {
1770                        rts51x_set_sense_type(chip, lun,
1771                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1772                        TRACE_RET(chip, TRANSPORT_FAILED);
1773                }
1774                break;
1775
1776        case KF_RSP_HOST:
1777                if ((scsi_bufflen(srb) == 0x0C) &&
1778                    (srb->cmnd[8] == 0x00) && (srb->cmnd[9] == 0x0C)) {
1779                        retval = rts51x_mg_rsp(srb, chip);
1780                        if (retval != STATUS_SUCCESS)
1781                                TRACE_RET(chip, TRANSPORT_FAILED);
1782                } else {
1783                        rts51x_set_sense_type(chip, lun,
1784                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1785                        TRACE_RET(chip, TRANSPORT_FAILED);
1786                }
1787                break;
1788
1789        case KF_SET_ICV:
1790                ms_card->mg_entry_num = srb->cmnd[5];
1791                if ((scsi_bufflen(srb) == 0x404) &&
1792                    (srb->cmnd[8] == 0x04) &&
1793                    (srb->cmnd[9] == 0x04) &&
1794                    (srb->cmnd[2] == 0x00) &&
1795                    (srb->cmnd[3] == 0x00) &&
1796                    (srb->cmnd[4] == 0x00) && (srb->cmnd[5] < 32)) {
1797                        retval = rts51x_mg_set_ICV(srb, chip);
1798                        if (retval != STATUS_SUCCESS)
1799                                TRACE_RET(chip, TRANSPORT_FAILED);
1800                } else {
1801                        rts51x_set_sense_type(chip, lun,
1802                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1803                        TRACE_RET(chip, TRANSPORT_FAILED);
1804                }
1805                break;
1806
1807        default:
1808                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1809                TRACE_RET(chip, TRANSPORT_FAILED);
1810        }
1811
1812        scsi_set_resid(srb, 0);
1813        return TRANSPORT_GOOD;
1814}
1815#endif
1816
1817int rts51x_scsi_handler(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1818{
1819        struct ms_info *ms_card = &(chip->ms_card);
1820        unsigned int lun = SCSI_LUN(srb);
1821        int result = TRANSPORT_GOOD;
1822
1823        if ((rts51x_get_lun_card(chip, lun) == MS_CARD) &&
1824            (ms_card->format_status == FORMAT_IN_PROGRESS)) {
1825                if ((srb->cmnd[0] != REQUEST_SENSE)
1826                    && (srb->cmnd[0] != INQUIRY)) {
1827                        /* Logical Unit Not Ready Format in Progress */
1828                        rts51x_set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04,
1829                                       0, (u16) (ms_card->progress));
1830                        TRACE_RET(chip, TRANSPORT_FAILED);
1831                }
1832        }
1833
1834        switch (srb->cmnd[0]) {
1835        case READ_10:
1836        case WRITE_10:
1837        case READ_6:
1838        case WRITE_6:
1839                result = read_write(srb, chip);
1840                break;
1841
1842        case TEST_UNIT_READY:
1843                result = test_unit_ready(srb, chip);
1844                break;
1845
1846        case INQUIRY:
1847                result = inquiry(srb, chip);
1848                break;
1849
1850        case READ_CAPACITY:
1851                result = read_capacity(srb, chip);
1852                break;
1853
1854        case START_STOP:
1855                result = start_stop_unit(srb, chip);
1856                break;
1857
1858        case ALLOW_MEDIUM_REMOVAL:
1859                result = allow_medium_removal(srb, chip);
1860                break;
1861
1862        case REQUEST_SENSE:
1863                result = request_sense(srb, chip);
1864                break;
1865
1866        case MODE_SENSE:
1867        case MODE_SENSE_10:
1868                result = mode_sense(srb, chip);
1869                break;
1870
1871        case 0x23:
1872                result = read_format_capacity(srb, chip);
1873                break;
1874
1875        case VENDOR_CMND:
1876                result = vendor_cmnd(srb, chip);
1877                break;
1878
1879        case MS_SP_CMND:
1880                result = ms_sp_cmnd(srb, chip);
1881                break;
1882
1883#ifdef SUPPORT_CPRM
1884        case SD_PASS_THRU_MODE:
1885        case SD_EXECUTE_NO_DATA:
1886        case SD_EXECUTE_READ:
1887        case SD_EXECUTE_WRITE:
1888        case SD_GET_RSP:
1889        case SD_HW_RST:
1890                result = sd_extention_cmnd(srb, chip);
1891                break;
1892#endif
1893
1894#ifdef SUPPORT_MAGIC_GATE
1895        case CMD_MSPRO_MG_RKEY:
1896                result = mg_report_key(srb, chip);
1897                break;
1898
1899        case CMD_MSPRO_MG_SKEY:
1900                result = mg_send_key(srb, chip);
1901                break;
1902#endif
1903
1904        case FORMAT_UNIT:
1905        case MODE_SELECT:
1906        case VERIFY:
1907                result = TRANSPORT_GOOD;
1908                break;
1909
1910        default:
1911                rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1912                result = TRANSPORT_FAILED;
1913        }
1914
1915        return result;
1916}
1917
1918/***********************************************************************
1919 * Host functions
1920 ***********************************************************************/
1921
1922int slave_alloc(struct scsi_device *sdev)
1923{
1924        /*
1925         * Set the INQUIRY transfer length to 36.  We don't use any of
1926         * the extra data and many devices choke if asked for more or
1927         * less than 36 bytes.
1928         */
1929        sdev->inquiry_len = 36;
1930        return 0;
1931}
1932
1933int slave_configure(struct scsi_device *sdev)
1934{
1935        /* Scatter-gather buffers (all but the last) must have a length
1936         * divisible by the bulk maxpacket size.  Otherwise a data packet
1937         * would end up being short, causing a premature end to the data
1938         * transfer.  Since high-speed bulk pipes have a maxpacket size
1939         * of 512, we'll use that as the scsi device queue's DMA alignment
1940         * mask.  Guaranteeing proper alignment of the first buffer will
1941         * have the desired effect because, except at the beginning and
1942         * the end, scatter-gather buffers follow page boundaries. */
1943        blk_queue_dma_alignment(sdev->request_queue, (512 - 1));
1944
1945        /* Set the SCSI level to at least 2.  We'll leave it at 3 if that's
1946         * what is originally reported.  We need this to avoid confusing
1947         * the SCSI layer with devices that report 0 or 1, but need 10-byte
1948         * commands (ala ATAPI devices behind certain bridges, or devices
1949         * which simply have broken INQUIRY data).
1950         *
1951         * NOTE: This means /dev/sg programs (ala cdrecord) will get the
1952         * actual information.  This seems to be the preference for
1953         * programs like that.
1954         *
1955         * NOTE: This also means that /proc/scsi/scsi and sysfs may report
1956         * the actual value or the modified one, depending on where the
1957         * data comes from.
1958         */
1959        if (sdev->scsi_level < SCSI_2)
1960                sdev->scsi_level = sdev->sdev_target->scsi_level = SCSI_2;
1961
1962        return 0;
1963}
1964
1965/***********************************************************************
1966 * /proc/scsi/ functions
1967 ***********************************************************************/
1968
1969/* we use this macro to help us write into the buffer */
1970#undef SPRINTF
1971#define SPRINTF(args...) seq_printf(m, ##args)
1972
1973static int write_info(struct Scsi_Host *host, char *buffer, int length)
1974{
1975        /* if someone is sending us data, just throw it away */
1976        return length;
1977}
1978
1979static int show_info(struct seq_file *m, struct Scsi_Host *host)
1980{
1981        /* print the controller name */
1982        SPRINTF("   Host scsi%d: %s\n", host->host_no, RTS51X_NAME);
1983
1984        /* print product, vendor, and driver version strings */
1985        SPRINTF("       Vendor: Realtek Corp.\n");
1986        SPRINTF("      Product: RTS51xx USB Card Reader\n");
1987        SPRINTF("      Version: %s\n", DRIVER_VERSION);
1988        SPRINTF("        Build: %s\n", __TIME__);
1989        return 0;
1990}
1991
1992/* queue a command */
1993/* This is always called with scsi_lock(host) held */
1994int queuecommand_lck(struct scsi_cmnd *srb, void (*done) (struct scsi_cmnd *))
1995{
1996        struct rts51x_chip *chip = host_to_rts51x(srb->device->host);
1997
1998        /* check for state-transition errors */
1999        if (chip->srb != NULL) {
2000                RTS51X_DEBUGP("Error in %s: chip->srb = %p\n",
2001                               __func__, chip->srb);
2002                return SCSI_MLQUEUE_HOST_BUSY;
2003        }
2004
2005        /* fail the command if we are disconnecting */
2006        if (test_bit(FLIDX_DISCONNECTING, &chip->usb->dflags)) {
2007                RTS51X_DEBUGP("Fail command during disconnect\n");
2008                srb->result = DID_NO_CONNECT << 16;
2009                done(srb);
2010                return 0;
2011        }
2012
2013        /* enqueue the command and wake up the control thread */
2014        srb->scsi_done = done;
2015        chip->srb = srb;
2016        complete(&chip->usb->cmnd_ready);
2017
2018        return 0;
2019}
2020
2021DEF_SCSI_QCMD(queuecommand)
2022/***********************************************************************
2023 * Error handling functions
2024 ***********************************************************************/
2025/* Command timeout and abort */
2026int command_abort(struct scsi_cmnd *srb)
2027{
2028        struct rts51x_chip *chip = host_to_rts51x(srb->device->host);
2029
2030        RTS51X_DEBUGP("%s called\n", __func__);
2031
2032        /* us->srb together with the TIMED_OUT, RESETTING, and ABORTING
2033         * bits are protected by the host lock. */
2034        scsi_lock(rts51x_to_host(chip));
2035
2036        /* Is this command still active? */
2037        if (chip->srb != srb) {
2038                scsi_unlock(rts51x_to_host(chip));
2039                RTS51X_DEBUGP("-- nothing to abort\n");
2040                return FAILED;
2041        }
2042
2043        /* Set the TIMED_OUT bit.  Also set the ABORTING bit, but only if
2044         * a device reset isn't already in progress (to avoid interfering
2045         * with the reset).  Note that we must retain the host lock while
2046         * calling usb_stor_stop_transport(); otherwise it might interfere
2047         * with an auto-reset that begins as soon as we release the lock. */
2048        set_bit(FLIDX_TIMED_OUT, &chip->usb->dflags);
2049        if (!test_bit(FLIDX_RESETTING, &chip->usb->dflags)) {
2050                set_bit(FLIDX_ABORTING, &chip->usb->dflags);
2051                /* rts51x_stop_transport(us); */
2052        }
2053        scsi_unlock(rts51x_to_host(chip));
2054
2055        /* Wait for the aborted command to finish */
2056        wait_for_completion(&chip->usb->notify);
2057        return SUCCESS;
2058}
2059
2060/* This invokes the transport reset mechanism to reset the state of the
2061 * device */
2062static int device_reset(struct scsi_cmnd *srb)
2063{
2064        int result = 0;
2065
2066        RTS51X_DEBUGP("%s called\n", __func__);
2067
2068        return result < 0 ? FAILED : SUCCESS;
2069}
2070
2071/* Simulate a SCSI bus reset by resetting the device's USB port. */
2072int bus_reset(struct scsi_cmnd *srb)
2073{
2074        int result = 0;
2075
2076        RTS51X_DEBUGP("%s called\n", __func__);
2077
2078        return result < 0 ? FAILED : SUCCESS;
2079}
2080
2081static const char *rts5139_info(struct Scsi_Host *host)
2082{
2083        return "SCSI emulation for RTS5139 USB card reader";
2084}
2085
2086struct scsi_host_template rts51x_host_template = {
2087        /* basic userland interface stuff */
2088        .name = RTS51X_NAME,
2089        .proc_name = RTS51X_NAME,
2090        .show_info = show_info,
2091        .write_info = write_info,
2092        .info = rts5139_info,
2093
2094        /* command interface -- queued only */
2095        .queuecommand = queuecommand,
2096
2097        /* error and abort handlers */
2098        .eh_abort_handler = command_abort,
2099        .eh_device_reset_handler = device_reset,
2100        .eh_bus_reset_handler = bus_reset,
2101
2102        /* queue commands only, only one command per LUN */
2103        .can_queue = 1,
2104        .cmd_per_lun = 1,
2105
2106        /* unknown initiator id */
2107        .this_id = -1,
2108
2109        .slave_alloc = slave_alloc,
2110        .slave_configure = slave_configure,
2111
2112        /* lots of sg segments can be handled */
2113        .sg_tablesize = SG_ALL,
2114
2115        /* limit the total size of a transfer to 120 KB */
2116        .max_sectors = 240,
2117
2118        /* merge commands... this seems to help performance, but
2119         * periodically someone should test to see which setting is more
2120         * optimal.
2121         */
2122        .use_clustering = 1,
2123
2124        /* emulated HBA */
2125        .emulated = 1,
2126
2127        /* we do our own delay after a device or bus reset */
2128        .skip_settle_delay = 1,
2129
2130        /* sysfs device attributes */
2131        /* .sdev_attrs = sysfs_device_attr_list, */
2132
2133        /* module management */
2134        .module = THIS_MODULE
2135};
2136
2137