linux/drivers/staging/rts5208/rtsx_scsi.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Driver for Realtek PCI-Express card reader
   4 *
   5 * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved.
   6 *
   7 * Author:
   8 *   Wei WANG (wei_wang@realsil.com.cn)
   9 *   Micky Ching (micky_ching@realsil.com.cn)
  10 */
  11
  12#include <linux/blkdev.h>
  13#include <linux/kthread.h>
  14#include <linux/sched.h>
  15#include <linux/vmalloc.h>
  16
  17#include "rtsx.h"
  18#include "sd.h"
  19#include "ms.h"
  20#include "spi.h"
  21
  22void scsi_show_command(struct rtsx_chip *chip)
  23{
  24        struct scsi_cmnd *srb = chip->srb;
  25        char *what = NULL;
  26        bool unknown_cmd = false;
  27        int len;
  28
  29        switch (srb->cmnd[0]) {
  30        case TEST_UNIT_READY:
  31                what = "TEST_UNIT_READY";
  32                break;
  33        case REZERO_UNIT:
  34                what = "REZERO_UNIT";
  35                break;
  36        case REQUEST_SENSE:
  37                what = "REQUEST_SENSE";
  38                break;
  39        case FORMAT_UNIT:
  40                what = "FORMAT_UNIT";
  41                break;
  42        case READ_BLOCK_LIMITS:
  43                what = "READ_BLOCK_LIMITS";
  44                break;
  45        case REASSIGN_BLOCKS:
  46                what = "REASSIGN_BLOCKS";
  47                break;
  48        case READ_6:
  49                what = "READ_6";
  50                break;
  51        case WRITE_6:
  52                what = "WRITE_6";
  53                break;
  54        case SEEK_6:
  55                what = "SEEK_6";
  56                break;
  57        case READ_REVERSE:
  58                what = "READ_REVERSE";
  59                break;
  60        case WRITE_FILEMARKS:
  61                what = "WRITE_FILEMARKS";
  62                break;
  63        case SPACE:
  64                what = "SPACE";
  65                break;
  66        case INQUIRY:
  67                what = "INQUIRY";
  68                break;
  69        case RECOVER_BUFFERED_DATA:
  70                what = "RECOVER_BUFFERED_DATA";
  71                break;
  72        case MODE_SELECT:
  73                what = "MODE_SELECT";
  74                break;
  75        case RESERVE:
  76                what = "RESERVE";
  77                break;
  78        case RELEASE:
  79                what = "RELEASE";
  80                break;
  81        case COPY:
  82                what = "COPY";
  83                break;
  84        case ERASE:
  85                what = "ERASE";
  86                break;
  87        case MODE_SENSE:
  88                what = "MODE_SENSE";
  89                break;
  90        case START_STOP:
  91                what = "START_STOP";
  92                break;
  93        case RECEIVE_DIAGNOSTIC:
  94                what = "RECEIVE_DIAGNOSTIC";
  95                break;
  96        case SEND_DIAGNOSTIC:
  97                what = "SEND_DIAGNOSTIC";
  98                break;
  99        case ALLOW_MEDIUM_REMOVAL:
 100                what = "ALLOW_MEDIUM_REMOVAL";
 101                break;
 102        case SET_WINDOW:
 103                what = "SET_WINDOW";
 104                break;
 105        case READ_CAPACITY:
 106                what = "READ_CAPACITY";
 107                break;
 108        case READ_10:
 109                what = "READ_10";
 110                break;
 111        case WRITE_10:
 112                what = "WRITE_10";
 113                break;
 114        case SEEK_10:
 115                what = "SEEK_10";
 116                break;
 117        case WRITE_VERIFY:
 118                what = "WRITE_VERIFY";
 119                break;
 120        case VERIFY:
 121                what = "VERIFY";
 122                break;
 123        case SEARCH_HIGH:
 124                what = "SEARCH_HIGH";
 125                break;
 126        case SEARCH_EQUAL:
 127                what = "SEARCH_EQUAL";
 128                break;
 129        case SEARCH_LOW:
 130                what = "SEARCH_LOW";
 131                break;
 132        case SET_LIMITS:
 133                what = "SET_LIMITS";
 134                break;
 135        case READ_POSITION:
 136                what = "READ_POSITION";
 137                break;
 138        case SYNCHRONIZE_CACHE:
 139                what = "SYNCHRONIZE_CACHE";
 140                break;
 141        case LOCK_UNLOCK_CACHE:
 142                what = "LOCK_UNLOCK_CACHE";
 143                break;
 144        case READ_DEFECT_DATA:
 145                what = "READ_DEFECT_DATA";
 146                break;
 147        case MEDIUM_SCAN:
 148                what = "MEDIUM_SCAN";
 149                break;
 150        case COMPARE:
 151                what = "COMPARE";
 152                break;
 153        case COPY_VERIFY:
 154                what = "COPY_VERIFY";
 155                break;
 156        case WRITE_BUFFER:
 157                what = "WRITE_BUFFER";
 158                break;
 159        case READ_BUFFER:
 160                what = "READ_BUFFER";
 161                break;
 162        case UPDATE_BLOCK:
 163                what = "UPDATE_BLOCK";
 164                break;
 165        case READ_LONG:
 166                what = "READ_LONG";
 167                break;
 168        case WRITE_LONG:
 169                what = "WRITE_LONG";
 170                break;
 171        case CHANGE_DEFINITION:
 172                what = "CHANGE_DEFINITION";
 173                break;
 174        case WRITE_SAME:
 175                what = "WRITE_SAME";
 176                break;
 177        case GPCMD_READ_SUBCHANNEL:
 178                what = "READ SUBCHANNEL";
 179                break;
 180        case READ_TOC:
 181                what = "READ_TOC";
 182                break;
 183        case GPCMD_READ_HEADER:
 184                what = "READ HEADER";
 185                break;
 186        case GPCMD_PLAY_AUDIO_10:
 187                what = "PLAY AUDIO (10)";
 188                break;
 189        case GPCMD_PLAY_AUDIO_MSF:
 190                what = "PLAY AUDIO MSF";
 191                break;
 192        case GPCMD_GET_EVENT_STATUS_NOTIFICATION:
 193                what = "GET EVENT/STATUS NOTIFICATION";
 194                break;
 195        case GPCMD_PAUSE_RESUME:
 196                what = "PAUSE/RESUME";
 197                break;
 198        case LOG_SELECT:
 199                what = "LOG_SELECT";
 200                break;
 201        case LOG_SENSE:
 202                what = "LOG_SENSE";
 203                break;
 204        case GPCMD_STOP_PLAY_SCAN:
 205                what = "STOP PLAY/SCAN";
 206                break;
 207        case GPCMD_READ_DISC_INFO:
 208                what = "READ DISC INFORMATION";
 209                break;
 210        case GPCMD_READ_TRACK_RZONE_INFO:
 211                what = "READ TRACK INFORMATION";
 212                break;
 213        case GPCMD_RESERVE_RZONE_TRACK:
 214                what = "RESERVE TRACK";
 215                break;
 216        case GPCMD_SEND_OPC:
 217                what = "SEND OPC";
 218                break;
 219        case MODE_SELECT_10:
 220                what = "MODE_SELECT_10";
 221                break;
 222        case GPCMD_REPAIR_RZONE_TRACK:
 223                what = "REPAIR TRACK";
 224                break;
 225        case 0x59:
 226                what = "READ MASTER CUE";
 227                break;
 228        case MODE_SENSE_10:
 229                what = "MODE_SENSE_10";
 230                break;
 231        case GPCMD_CLOSE_TRACK:
 232                what = "CLOSE TRACK/SESSION";
 233                break;
 234        case 0x5C:
 235                what = "READ BUFFER CAPACITY";
 236                break;
 237        case 0x5D:
 238                what = "SEND CUE SHEET";
 239                break;
 240        case GPCMD_BLANK:
 241                what = "BLANK";
 242                break;
 243        case REPORT_LUNS:
 244                what = "REPORT LUNS";
 245                break;
 246        case MOVE_MEDIUM:
 247                what = "MOVE_MEDIUM or PLAY AUDIO (12)";
 248                break;
 249        case READ_12:
 250                what = "READ_12";
 251                break;
 252        case WRITE_12:
 253                what = "WRITE_12";
 254                break;
 255        case WRITE_VERIFY_12:
 256                what = "WRITE_VERIFY_12";
 257                break;
 258        case SEARCH_HIGH_12:
 259                what = "SEARCH_HIGH_12";
 260                break;
 261        case SEARCH_EQUAL_12:
 262                what = "SEARCH_EQUAL_12";
 263                break;
 264        case SEARCH_LOW_12:
 265                what = "SEARCH_LOW_12";
 266                break;
 267        case SEND_VOLUME_TAG:
 268                what = "SEND_VOLUME_TAG";
 269                break;
 270        case READ_ELEMENT_STATUS:
 271                what = "READ_ELEMENT_STATUS";
 272                break;
 273        case GPCMD_READ_CD_MSF:
 274                what = "READ CD MSF";
 275                break;
 276        case GPCMD_SCAN:
 277                what = "SCAN";
 278                break;
 279        case GPCMD_SET_SPEED:
 280                what = "SET CD SPEED";
 281                break;
 282        case GPCMD_MECHANISM_STATUS:
 283                what = "MECHANISM STATUS";
 284                break;
 285        case GPCMD_READ_CD:
 286                what = "READ CD";
 287                break;
 288        case 0xE1:
 289                what = "WRITE CONTINUE";
 290                break;
 291        case WRITE_LONG_2:
 292                what = "WRITE_LONG_2";
 293                break;
 294        case VENDOR_CMND:
 295                what = "Realtek's vendor command";
 296                break;
 297        default:
 298                what = "(unknown command)";
 299                unknown_cmd = true;
 300                break;
 301        }
 302
 303        if (srb->cmnd[0] != TEST_UNIT_READY)
 304                dev_dbg(rtsx_dev(chip), "Command %s (%d bytes)\n",
 305                        what, srb->cmd_len);
 306
 307        if (unknown_cmd) {
 308                len = min_t(unsigned short, srb->cmd_len, 16);
 309                dev_dbg(rtsx_dev(chip), "%*ph\n", len, srb->cmnd);
 310        }
 311}
 312
 313void set_sense_type(struct rtsx_chip *chip, unsigned int lun, int sense_type)
 314{
 315        switch (sense_type) {
 316        case SENSE_TYPE_MEDIA_CHANGE:
 317                set_sense_data(chip, lun, CUR_ERR, 0x06, 0, 0x28, 0, 0, 0);
 318                break;
 319
 320        case SENSE_TYPE_MEDIA_NOT_PRESENT:
 321                set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x3A, 0, 0, 0);
 322                break;
 323
 324        case SENSE_TYPE_MEDIA_LBA_OVER_RANGE:
 325                set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x21, 0, 0, 0);
 326                break;
 327
 328        case SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT:
 329                set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x25, 0, 0, 0);
 330                break;
 331
 332        case SENSE_TYPE_MEDIA_WRITE_PROTECT:
 333                set_sense_data(chip, lun, CUR_ERR, 0x07, 0, 0x27, 0, 0, 0);
 334                break;
 335
 336        case SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR:
 337                set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x11, 0, 0, 0);
 338                break;
 339
 340        case SENSE_TYPE_MEDIA_WRITE_ERR:
 341                set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x0C, 0x02, 0, 0);
 342                break;
 343
 344        case SENSE_TYPE_MEDIA_INVALID_CMD_FIELD:
 345                set_sense_data(chip, lun, CUR_ERR, ILGAL_REQ, 0,
 346                               ASC_INVLD_CDB, ASCQ_INVLD_CDB, CDB_ILLEGAL, 1);
 347                break;
 348
 349        case SENSE_TYPE_FORMAT_IN_PROGRESS:
 350                set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04, 0, 0);
 351                break;
 352
 353        case SENSE_TYPE_FORMAT_CMD_FAILED:
 354                set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x31, 0x01, 0, 0);
 355                break;
 356
 357#ifdef SUPPORT_MAGIC_GATE
 358        case SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB:
 359                set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x6F, 0x02, 0, 0);
 360                break;
 361
 362        case SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN:
 363                set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x6F, 0x00, 0, 0);
 364                break;
 365
 366        case SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM:
 367                set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x30, 0x00, 0, 0);
 368                break;
 369
 370        case SENSE_TYPE_MG_WRITE_ERR:
 371                set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x0C, 0x00, 0, 0);
 372                break;
 373#endif
 374
 375#ifdef SUPPORT_SD_LOCK
 376        case SENSE_TYPE_MEDIA_READ_FORBIDDEN:
 377                set_sense_data(chip, lun, CUR_ERR, 0x07, 0, 0x11, 0x13, 0, 0);
 378                break;
 379#endif
 380
 381        case SENSE_TYPE_NO_SENSE:
 382        default:
 383                set_sense_data(chip, lun, CUR_ERR, 0, 0, 0, 0, 0, 0);
 384                break;
 385        }
 386}
 387
 388void set_sense_data(struct rtsx_chip *chip, unsigned int lun, u8 err_code,
 389                    u8 sense_key, u32 info, u8 asc, u8 ascq, u8 sns_key_info0,
 390                u16 sns_key_info1)
 391{
 392        struct sense_data_t *sense = &chip->sense_buffer[lun];
 393
 394        sense->err_code = err_code;
 395        sense->sense_key = sense_key;
 396        sense->info[0] = (u8)(info >> 24);
 397        sense->info[1] = (u8)(info >> 16);
 398        sense->info[2] = (u8)(info >> 8);
 399        sense->info[3] = (u8)info;
 400
 401        sense->ad_sense_len = sizeof(struct sense_data_t) - 8;
 402        sense->asc = asc;
 403        sense->ascq = ascq;
 404        if (sns_key_info0 != 0) {
 405                sense->sns_key_info[0] = SKSV | sns_key_info0;
 406                sense->sns_key_info[1] = (sns_key_info1 & 0xf0) >> 4;
 407                sense->sns_key_info[2] = sns_key_info1 & 0x0f;
 408        }
 409}
 410
 411static int test_unit_ready(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 412{
 413        unsigned int lun = SCSI_LUN(srb);
 414
 415        if (!check_card_ready(chip, lun)) {
 416                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
 417                return TRANSPORT_FAILED;
 418        }
 419
 420        if (!(CHK_BIT(chip->lun_mc, lun))) {
 421                SET_BIT(chip->lun_mc, lun);
 422                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
 423                return TRANSPORT_FAILED;
 424        }
 425
 426#ifdef SUPPORT_SD_LOCK
 427        if (get_lun_card(chip, SCSI_LUN(srb)) == SD_CARD) {
 428                struct sd_info *sd_card = &chip->sd_card;
 429
 430                if (sd_card->sd_lock_notify) {
 431                        sd_card->sd_lock_notify = 0;
 432                        set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
 433                        return TRANSPORT_FAILED;
 434                } else if (sd_card->sd_lock_status & SD_LOCKED) {
 435                        set_sense_type(chip, lun,
 436                                       SENSE_TYPE_MEDIA_READ_FORBIDDEN);
 437                        return TRANSPORT_FAILED;
 438                }
 439        }
 440#endif
 441
 442        return TRANSPORT_GOOD;
 443}
 444
 445static unsigned char formatter_inquiry_str[20] = {
 446        'M', 'E', 'M', 'O', 'R', 'Y', 'S', 'T', 'I', 'C', 'K',
 447#ifdef SUPPORT_MAGIC_GATE
 448        '-', 'M', 'G', /* Byte[47:49] */
 449#else
 450        0x20, 0x20, 0x20,  /* Byte[47:49] */
 451#endif
 452
 453#ifdef SUPPORT_MAGIC_GATE
 454        0x0B,  /* Byte[50]: MG, MS, MSPro, MSXC */
 455#else
 456        0x09,  /* Byte[50]: MS, MSPro, MSXC */
 457#endif
 458        0x00,  /* Byte[51]: Category Specific Commands */
 459        0x00,  /* Byte[52]: Access Control and feature */
 460        0x20, 0x20, 0x20, /* Byte[53:55] */
 461};
 462
 463static int inquiry(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 464{
 465        unsigned int lun = SCSI_LUN(srb);
 466        char *inquiry_default = (char *)"Generic-xD/SD/M.S.      1.00 ";
 467        char *inquiry_sdms =    (char *)"Generic-SD/MemoryStick  1.00 ";
 468        char *inquiry_sd =      (char *)"Generic-SD/MMC          1.00 ";
 469        char *inquiry_ms =      (char *)"Generic-MemoryStick     1.00 ";
 470        char *inquiry_string;
 471        unsigned char sendbytes;
 472        unsigned char *buf;
 473        u8 card = get_lun_card(chip, lun);
 474        bool pro_formatter_flag = false;
 475        unsigned char inquiry_buf[] = {
 476                QULIFIRE | DRCT_ACCESS_DEV,
 477                RMB_DISC | 0x0D,
 478                0x00,
 479                0x01,
 480                0x1f,
 481                0x02,
 482                0,
 483                REL_ADR | WBUS_32 | WBUS_16 | SYNC | LINKED | CMD_QUE | SFT_RE,
 484        };
 485
 486        if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
 487                if (chip->lun2card[lun] == SD_CARD)
 488                        inquiry_string = inquiry_sd;
 489                else
 490                        inquiry_string = inquiry_ms;
 491
 492        } else if (CHECK_LUN_MODE(chip, SD_MS_1LUN)) {
 493                inquiry_string = inquiry_sdms;
 494        } else {
 495                inquiry_string = inquiry_default;
 496        }
 497
 498        buf = vmalloc(scsi_bufflen(srb));
 499        if (!buf)
 500                return TRANSPORT_ERROR;
 501
 502#ifdef SUPPORT_MAGIC_GATE
 503        if ((chip->mspro_formatter_enable) &&
 504            (chip->lun2card[lun] & MS_CARD))
 505#else
 506        if (chip->mspro_formatter_enable)
 507#endif
 508                if (!card || (card == MS_CARD))
 509                        pro_formatter_flag = true;
 510
 511        if (pro_formatter_flag) {
 512                if (scsi_bufflen(srb) < 56)
 513                        sendbytes = (unsigned char)(scsi_bufflen(srb));
 514                else
 515                        sendbytes = 56;
 516
 517        } else {
 518                if (scsi_bufflen(srb) < 36)
 519                        sendbytes = (unsigned char)(scsi_bufflen(srb));
 520                else
 521                        sendbytes = 36;
 522        }
 523
 524        if (sendbytes > 8) {
 525                memcpy(buf, inquiry_buf, 8);
 526                strncpy(buf + 8, inquiry_string, sendbytes - 8);
 527                if (pro_formatter_flag) {
 528                        /* Additional Length */
 529                        buf[4] = 0x33;
 530                }
 531        } else {
 532                memcpy(buf, inquiry_buf, sendbytes);
 533        }
 534
 535        if (pro_formatter_flag) {
 536                if (sendbytes > 36)
 537                        memcpy(buf + 36, formatter_inquiry_str, sendbytes - 36);
 538        }
 539
 540        scsi_set_resid(srb, 0);
 541
 542        rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
 543        vfree(buf);
 544
 545        return TRANSPORT_GOOD;
 546}
 547
 548static int start_stop_unit(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 549{
 550        unsigned int lun = SCSI_LUN(srb);
 551
 552        scsi_set_resid(srb, scsi_bufflen(srb));
 553
 554        if (srb->cmnd[1] == 1)
 555                return TRANSPORT_GOOD;
 556
 557        switch (srb->cmnd[0x4]) {
 558        case STOP_MEDIUM:
 559                /* Media disabled */
 560                return TRANSPORT_GOOD;
 561
 562        case UNLOAD_MEDIUM:
 563                /* Media shall be unload */
 564                if (check_card_ready(chip, lun))
 565                        eject_card(chip, lun);
 566                return TRANSPORT_GOOD;
 567
 568        case MAKE_MEDIUM_READY:
 569        case LOAD_MEDIUM:
 570                if (check_card_ready(chip, lun))
 571                        return TRANSPORT_GOOD;
 572                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
 573                return TRANSPORT_FAILED;
 574
 575                break;
 576        }
 577
 578        return TRANSPORT_ERROR;
 579}
 580
 581static int allow_medium_removal(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 582{
 583        int prevent;
 584
 585        prevent = srb->cmnd[4] & 0x1;
 586
 587        scsi_set_resid(srb, 0);
 588
 589        if (prevent) {
 590                set_sense_type(chip, SCSI_LUN(srb),
 591                               SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
 592                return TRANSPORT_FAILED;
 593        }
 594
 595        return TRANSPORT_GOOD;
 596}
 597
 598static int request_sense(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 599{
 600        struct sense_data_t *sense;
 601        unsigned int lun = SCSI_LUN(srb);
 602        struct ms_info *ms_card = &chip->ms_card;
 603        unsigned char *tmp, *buf;
 604
 605        sense = &chip->sense_buffer[lun];
 606
 607        if ((get_lun_card(chip, lun) == MS_CARD) &&
 608            ms_card->pro_under_formatting) {
 609                if (ms_card->format_status == FORMAT_SUCCESS) {
 610                        set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
 611                        ms_card->pro_under_formatting = 0;
 612                        ms_card->progress = 0;
 613                } else if (ms_card->format_status == FORMAT_IN_PROGRESS) {
 614                        /* Logical Unit Not Ready Format in Progress */
 615                        set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04,
 616                                       0, (u16)(ms_card->progress));
 617                } else {
 618                        /* Format Command Failed */
 619                        set_sense_type(chip, lun, SENSE_TYPE_FORMAT_CMD_FAILED);
 620                        ms_card->pro_under_formatting = 0;
 621                        ms_card->progress = 0;
 622                }
 623
 624                rtsx_set_stat(chip, RTSX_STAT_RUN);
 625        }
 626
 627        buf = vmalloc(scsi_bufflen(srb));
 628        if (!buf)
 629                return TRANSPORT_ERROR;
 630
 631        tmp = (unsigned char *)sense;
 632        memcpy(buf, tmp, scsi_bufflen(srb));
 633
 634        rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
 635        vfree(buf);
 636
 637        scsi_set_resid(srb, 0);
 638        /* Reset Sense Data */
 639        set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
 640        return TRANSPORT_GOOD;
 641}
 642
 643static void ms_mode_sense(struct rtsx_chip *chip, u8 cmd,
 644                          int lun, u8 *buf, int buf_len)
 645{
 646        struct ms_info *ms_card = &chip->ms_card;
 647        int sys_info_offset;
 648        int data_size = buf_len;
 649        bool support_format = false;
 650        int i = 0;
 651
 652        if (cmd == MODE_SENSE) {
 653                sys_info_offset = 8;
 654                if (data_size > 0x68)
 655                        data_size = 0x68;
 656
 657                buf[i++] = 0x67;  /* Mode Data Length */
 658        } else {
 659                sys_info_offset = 12;
 660                if (data_size > 0x6C)
 661                        data_size = 0x6C;
 662
 663                buf[i++] = 0x00;  /* Mode Data Length (MSB) */
 664                buf[i++] = 0x6A;  /* Mode Data Length (LSB) */
 665        }
 666
 667        /* Medium Type Code */
 668        if (check_card_ready(chip, lun)) {
 669                if (CHK_MSXC(ms_card)) {
 670                        support_format = true;
 671                        buf[i++] = 0x40;
 672                } else if (CHK_MSPRO(ms_card)) {
 673                        support_format = true;
 674                        buf[i++] = 0x20;
 675                } else {
 676                        buf[i++] = 0x10;
 677                }
 678
 679                /* WP */
 680                if (check_card_wp(chip, lun))
 681                        buf[i++] = 0x80;
 682                else
 683                        buf[i++] = 0x00;
 684
 685        } else {
 686                buf[i++] = 0x00;        /* MediaType */
 687                buf[i++] = 0x00;        /* WP */
 688        }
 689
 690        buf[i++] = 0x00;                /* Reserved */
 691
 692        if (cmd == MODE_SENSE_10) {
 693                buf[i++] = 0x00;  /* Reserved */
 694                buf[i++] = 0x00;  /* Block descriptor length(MSB) */
 695                buf[i++] = 0x00;  /* Block descriptor length(LSB) */
 696
 697                /* The Following Data is the content of "Page 0x20" */
 698                if (data_size >= 9)
 699                        buf[i++] = 0x20;                /* Page Code */
 700                if (data_size >= 10)
 701                        buf[i++] = 0x62;                /* Page Length */
 702                if (data_size >= 11)
 703                        buf[i++] = 0x00;                /* No Access Control */
 704                if (data_size >= 12) {
 705                        if (support_format)
 706                                buf[i++] = 0xC0;        /* SF, SGM */
 707                        else
 708                                buf[i++] = 0x00;
 709                }
 710        } else {
 711                /* The Following Data is the content of "Page 0x20" */
 712                if (data_size >= 5)
 713                        buf[i++] = 0x20;                /* Page Code */
 714                if (data_size >= 6)
 715                        buf[i++] = 0x62;                /* Page Length */
 716                if (data_size >= 7)
 717                        buf[i++] = 0x00;                /* No Access Control */
 718                if (data_size >= 8) {
 719                        if (support_format)
 720                                buf[i++] = 0xC0;        /* SF, SGM */
 721                        else
 722                                buf[i++] = 0x00;
 723                }
 724        }
 725
 726        if (data_size > sys_info_offset) {
 727                /* 96 Bytes Attribute Data */
 728                int len = data_size - sys_info_offset;
 729
 730                len = (len < 96) ? len : 96;
 731
 732                memcpy(buf + sys_info_offset, ms_card->raw_sys_info, len);
 733        }
 734}
 735
 736static int mode_sense(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 737{
 738        unsigned int lun = SCSI_LUN(srb);
 739        unsigned int data_size;
 740        int status;
 741        bool pro_formatter_flag;
 742        unsigned char page_code, *buf;
 743        u8 card = get_lun_card(chip, lun);
 744
 745#ifndef SUPPORT_MAGIC_GATE
 746        if (!check_card_ready(chip, lun)) {
 747                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
 748                scsi_set_resid(srb, scsi_bufflen(srb));
 749                return TRANSPORT_FAILED;
 750        }
 751#endif
 752
 753        pro_formatter_flag = false;
 754        data_size = 8;
 755#ifdef SUPPORT_MAGIC_GATE
 756        if ((chip->lun2card[lun] & MS_CARD)) {
 757                if (!card || (card == MS_CARD)) {
 758                        data_size = 108;
 759                        if (chip->mspro_formatter_enable)
 760                                pro_formatter_flag = true;
 761                }
 762        }
 763#else
 764        if (card == MS_CARD) {
 765                if (chip->mspro_formatter_enable) {
 766                        pro_formatter_flag = true;
 767                        data_size = 108;
 768                }
 769        }
 770#endif
 771
 772        buf = kmalloc(data_size, GFP_KERNEL);
 773        if (!buf)
 774                return TRANSPORT_ERROR;
 775
 776        page_code = srb->cmnd[2] & 0x3f;
 777
 778        if ((page_code == 0x3F) || (page_code == 0x1C) ||
 779            (page_code == 0x00) ||
 780                (pro_formatter_flag && (page_code == 0x20))) {
 781                if (srb->cmnd[0] == MODE_SENSE) {
 782                        if ((page_code == 0x3F) || (page_code == 0x20)) {
 783                                ms_mode_sense(chip, srb->cmnd[0],
 784                                              lun, buf, data_size);
 785                        } else {
 786                                data_size = 4;
 787                                buf[0] = 0x03;
 788                                buf[1] = 0x00;
 789                                if (check_card_wp(chip, lun))
 790                                        buf[2] = 0x80;
 791                                else
 792                                        buf[2] = 0x00;
 793
 794                                buf[3] = 0x00;
 795                        }
 796                } else {
 797                        if ((page_code == 0x3F) || (page_code == 0x20)) {
 798                                ms_mode_sense(chip, srb->cmnd[0],
 799                                              lun, buf, data_size);
 800                        } else {
 801                                data_size = 8;
 802                                buf[0] = 0x00;
 803                                buf[1] = 0x06;
 804                                buf[2] = 0x00;
 805                                if (check_card_wp(chip, lun))
 806                                        buf[3] = 0x80;
 807                                else
 808                                        buf[3] = 0x00;
 809                                buf[4] = 0x00;
 810                                buf[5] = 0x00;
 811                                buf[6] = 0x00;
 812                                buf[7] = 0x00;
 813                        }
 814                }
 815                status = TRANSPORT_GOOD;
 816        } else {
 817                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
 818                scsi_set_resid(srb, scsi_bufflen(srb));
 819                status = TRANSPORT_FAILED;
 820        }
 821
 822        if (status == TRANSPORT_GOOD) {
 823                unsigned int len = min_t(unsigned int, scsi_bufflen(srb),
 824                                        data_size);
 825                rtsx_stor_set_xfer_buf(buf, len, srb);
 826                scsi_set_resid(srb, scsi_bufflen(srb) - len);
 827        }
 828        kfree(buf);
 829
 830        return status;
 831}
 832
 833static int read_write(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 834{
 835#ifdef SUPPORT_SD_LOCK
 836        struct sd_info *sd_card = &chip->sd_card;
 837#endif
 838        unsigned int lun = SCSI_LUN(srb);
 839        int retval;
 840        u32 start_sec;
 841        u16 sec_cnt;
 842
 843        rtsx_disable_aspm(chip);
 844
 845        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
 846                rtsx_exit_ss(chip);
 847                wait_timeout(100);
 848        }
 849        rtsx_set_stat(chip, RTSX_STAT_RUN);
 850
 851        if (!check_card_ready(chip, lun) || (get_card_size(chip, lun) == 0)) {
 852                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
 853                return TRANSPORT_FAILED;
 854        }
 855
 856        if (!(CHK_BIT(chip->lun_mc, lun))) {
 857                SET_BIT(chip->lun_mc, lun);
 858                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
 859                return TRANSPORT_FAILED;
 860        }
 861
 862#ifdef SUPPORT_SD_LOCK
 863        if (sd_card->sd_erase_status) {
 864                /* Accessing to any card is forbidden
 865                 * until the erase procedure of SD is completed
 866                 */
 867                dev_dbg(rtsx_dev(chip), "SD card being erased!\n");
 868                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_READ_FORBIDDEN);
 869                return TRANSPORT_FAILED;
 870        }
 871
 872        if (get_lun_card(chip, lun) == SD_CARD) {
 873                if (sd_card->sd_lock_status & SD_LOCKED) {
 874                        dev_dbg(rtsx_dev(chip), "SD card locked!\n");
 875                        set_sense_type(chip, lun,
 876                                       SENSE_TYPE_MEDIA_READ_FORBIDDEN);
 877                        return TRANSPORT_FAILED;
 878                }
 879        }
 880#endif
 881
 882        if ((srb->cmnd[0] == READ_10) || (srb->cmnd[0] == WRITE_10)) {
 883                start_sec = ((u32)srb->cmnd[2] << 24) |
 884                        ((u32)srb->cmnd[3] << 16) |
 885                        ((u32)srb->cmnd[4] << 8) | ((u32)srb->cmnd[5]);
 886                sec_cnt = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
 887        } else if ((srb->cmnd[0] == READ_6) || (srb->cmnd[0] == WRITE_6)) {
 888                start_sec = ((u32)(srb->cmnd[1] & 0x1F) << 16) |
 889                        ((u32)srb->cmnd[2] << 8) | ((u32)srb->cmnd[3]);
 890                sec_cnt = srb->cmnd[4];
 891                if (sec_cnt == 0)
 892                        sec_cnt = 256;
 893        } else if ((srb->cmnd[0] == VENDOR_CMND) &&
 894                (srb->cmnd[1] == SCSI_APP_CMD) &&
 895                ((srb->cmnd[2] == PP_READ10) || (srb->cmnd[2] == PP_WRITE10))) {
 896                start_sec = ((u32)srb->cmnd[4] << 24) |
 897                        ((u32)srb->cmnd[5] << 16) |
 898                        ((u32)srb->cmnd[6] << 8) | ((u32)srb->cmnd[7]);
 899                sec_cnt = ((u16)(srb->cmnd[9]) << 8) | srb->cmnd[10];
 900        } else {
 901                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
 902                return TRANSPORT_FAILED;
 903        }
 904
 905        /* In some test, we will receive a start_sec like 0xFFFFFFFF.
 906         * In this situation, start_sec + sec_cnt will overflow, so we
 907         * need to judge start_sec at first
 908         */
 909        if ((start_sec > get_card_size(chip, lun)) ||
 910            ((start_sec + sec_cnt) > get_card_size(chip, lun))) {
 911                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LBA_OVER_RANGE);
 912                return TRANSPORT_FAILED;
 913        }
 914
 915        if (sec_cnt == 0) {
 916                scsi_set_resid(srb, 0);
 917                return TRANSPORT_GOOD;
 918        }
 919
 920        if (chip->rw_fail_cnt[lun] == 3) {
 921                dev_dbg(rtsx_dev(chip), "read/write fail three times in succession\n");
 922                if (srb->sc_data_direction == DMA_FROM_DEVICE)
 923                        set_sense_type(chip, lun,
 924                                       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
 925                else
 926                        set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
 927
 928                return TRANSPORT_FAILED;
 929        }
 930
 931        if (srb->sc_data_direction == DMA_TO_DEVICE) {
 932                if (check_card_wp(chip, lun)) {
 933                        dev_dbg(rtsx_dev(chip), "Write protected card!\n");
 934                        set_sense_type(chip, lun,
 935                                       SENSE_TYPE_MEDIA_WRITE_PROTECT);
 936                        return TRANSPORT_FAILED;
 937                }
 938        }
 939
 940        retval = card_rw(srb, chip, start_sec, sec_cnt);
 941        if (retval != STATUS_SUCCESS) {
 942                if (chip->need_release & chip->lun2card[lun]) {
 943                        chip->rw_fail_cnt[lun] = 0;
 944                        set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
 945                } else {
 946                        chip->rw_fail_cnt[lun]++;
 947                        if (srb->sc_data_direction == DMA_FROM_DEVICE)
 948                                set_sense_type
 949                                        (chip, lun,
 950                                         SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
 951                        else
 952                                set_sense_type(chip, lun,
 953                                               SENSE_TYPE_MEDIA_WRITE_ERR);
 954                }
 955                retval = TRANSPORT_FAILED;
 956                goto exit;
 957        } else {
 958                chip->rw_fail_cnt[lun] = 0;
 959                retval = TRANSPORT_GOOD;
 960        }
 961
 962        scsi_set_resid(srb, 0);
 963
 964exit:
 965        return retval;
 966}
 967
 968static int read_format_capacity(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 969{
 970        unsigned char *buf;
 971        unsigned int lun = SCSI_LUN(srb);
 972        unsigned int buf_len;
 973        u8 card = get_lun_card(chip, lun);
 974        u32 card_size;
 975        int desc_cnt;
 976        int i = 0;
 977
 978        if (!check_card_ready(chip, lun)) {
 979                if (!chip->mspro_formatter_enable) {
 980                        set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
 981                        return TRANSPORT_FAILED;
 982                }
 983        }
 984
 985        buf_len = (scsi_bufflen(srb) > 12) ? 0x14 : 12;
 986
 987        buf = kmalloc(buf_len, GFP_KERNEL);
 988        if (!buf)
 989                return TRANSPORT_ERROR;
 990
 991        buf[i++] = 0;
 992        buf[i++] = 0;
 993        buf[i++] = 0;
 994
 995        /* Capacity List Length */
 996        if ((buf_len > 12) && chip->mspro_formatter_enable &&
 997            (chip->lun2card[lun] & MS_CARD) &&
 998            (!card || (card == MS_CARD))) {
 999                buf[i++] = 0x10;
1000                desc_cnt = 2;
1001        } else {
1002                buf[i++] = 0x08;
1003                desc_cnt = 1;
1004        }
1005
1006        while (desc_cnt) {
1007                if (check_card_ready(chip, lun)) {
1008                        card_size = get_card_size(chip, lun);
1009                        buf[i++] = (unsigned char)(card_size >> 24);
1010                        buf[i++] = (unsigned char)(card_size >> 16);
1011                        buf[i++] = (unsigned char)(card_size >> 8);
1012                        buf[i++] = (unsigned char)card_size;
1013
1014                        if (desc_cnt == 2)
1015                                buf[i++] = 2;
1016                        else
1017                                buf[i++] = 0;
1018                } else {
1019                        buf[i++] = 0xFF;
1020                        buf[i++] = 0xFF;
1021                        buf[i++] = 0xFF;
1022                        buf[i++] = 0xFF;
1023
1024                        if (desc_cnt == 2)
1025                                buf[i++] = 3;
1026                        else
1027                                buf[i++] = 0;
1028                }
1029
1030                buf[i++] = 0x00;
1031                buf[i++] = 0x02;
1032                buf[i++] = 0x00;
1033
1034                desc_cnt--;
1035        }
1036
1037        buf_len = min_t(unsigned int, scsi_bufflen(srb), buf_len);
1038        rtsx_stor_set_xfer_buf(buf, buf_len, srb);
1039        kfree(buf);
1040
1041        scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
1042
1043        return TRANSPORT_GOOD;
1044}
1045
1046static int read_capacity(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1047{
1048        unsigned char *buf;
1049        unsigned int lun = SCSI_LUN(srb);
1050        u32 card_size;
1051
1052        if (!check_card_ready(chip, lun)) {
1053                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1054                return TRANSPORT_FAILED;
1055        }
1056
1057        if (!(CHK_BIT(chip->lun_mc, lun))) {
1058                SET_BIT(chip->lun_mc, lun);
1059                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
1060                return TRANSPORT_FAILED;
1061        }
1062
1063        buf = kmalloc(8, GFP_KERNEL);
1064        if (!buf)
1065                return TRANSPORT_ERROR;
1066
1067        card_size = get_card_size(chip, lun);
1068        buf[0] = (unsigned char)((card_size - 1) >> 24);
1069        buf[1] = (unsigned char)((card_size - 1) >> 16);
1070        buf[2] = (unsigned char)((card_size - 1) >> 8);
1071        buf[3] = (unsigned char)(card_size - 1);
1072
1073        buf[4] = 0x00;
1074        buf[5] = 0x00;
1075        buf[6] = 0x02;
1076        buf[7] = 0x00;
1077
1078        rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
1079        kfree(buf);
1080
1081        scsi_set_resid(srb, 0);
1082
1083        return TRANSPORT_GOOD;
1084}
1085
1086static int read_eeprom(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1087{
1088        unsigned short len, i;
1089        int retval;
1090        u8 *buf;
1091
1092        rtsx_disable_aspm(chip);
1093
1094        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1095                rtsx_exit_ss(chip);
1096                wait_timeout(100);
1097        }
1098        rtsx_set_stat(chip, RTSX_STAT_RUN);
1099
1100        len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1101
1102        buf = vmalloc(len);
1103        if (!buf)
1104                return TRANSPORT_ERROR;
1105
1106        retval = rtsx_force_power_on(chip, SSC_PDCTL);
1107        if (retval != STATUS_SUCCESS) {
1108                vfree(buf);
1109                set_sense_type(chip, SCSI_LUN(srb),
1110                               SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1111                return TRANSPORT_FAILED;
1112        }
1113
1114        for (i = 0; i < len; i++) {
1115                retval = spi_read_eeprom(chip, i, buf + i);
1116                if (retval != STATUS_SUCCESS) {
1117                        vfree(buf);
1118                        set_sense_type(chip, SCSI_LUN(srb),
1119                                       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1120                        return TRANSPORT_FAILED;
1121                }
1122        }
1123
1124        len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
1125        rtsx_stor_set_xfer_buf(buf, len, srb);
1126        scsi_set_resid(srb, scsi_bufflen(srb) - len);
1127
1128        vfree(buf);
1129
1130        return TRANSPORT_GOOD;
1131}
1132
1133static int write_eeprom(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1134{
1135        unsigned short len, i;
1136        int retval;
1137        u8 *buf;
1138
1139        rtsx_disable_aspm(chip);
1140
1141        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1142                rtsx_exit_ss(chip);
1143                wait_timeout(100);
1144        }
1145        rtsx_set_stat(chip, RTSX_STAT_RUN);
1146
1147        len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1148
1149        retval = rtsx_force_power_on(chip, SSC_PDCTL);
1150        if (retval != STATUS_SUCCESS) {
1151                set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1152                return TRANSPORT_FAILED;
1153        }
1154
1155        if (len == 511) {
1156                retval = spi_erase_eeprom_chip(chip);
1157                if (retval != STATUS_SUCCESS) {
1158                        set_sense_type(chip, SCSI_LUN(srb),
1159                                       SENSE_TYPE_MEDIA_WRITE_ERR);
1160                        return TRANSPORT_FAILED;
1161                }
1162        } else {
1163                len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb),
1164                                        len);
1165                buf = vmalloc(len);
1166                if (!buf)
1167                        return TRANSPORT_ERROR;
1168
1169                rtsx_stor_get_xfer_buf(buf, len, srb);
1170                scsi_set_resid(srb, scsi_bufflen(srb) - len);
1171
1172                for (i = 0; i < len; i++) {
1173                        retval = spi_write_eeprom(chip, i, buf[i]);
1174                        if (retval != STATUS_SUCCESS) {
1175                                vfree(buf);
1176                                set_sense_type(chip, SCSI_LUN(srb),
1177                                               SENSE_TYPE_MEDIA_WRITE_ERR);
1178                                return TRANSPORT_FAILED;
1179                        }
1180                }
1181
1182                vfree(buf);
1183        }
1184
1185        return TRANSPORT_GOOD;
1186}
1187
1188static int read_mem(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1189{
1190        unsigned short addr, len, i;
1191        int retval;
1192        u8 *buf;
1193
1194        rtsx_disable_aspm(chip);
1195
1196        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1197                rtsx_exit_ss(chip);
1198                wait_timeout(100);
1199        }
1200        rtsx_set_stat(chip, RTSX_STAT_RUN);
1201
1202        addr = ((u16)srb->cmnd[2] << 8) | srb->cmnd[3];
1203        len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1204
1205        if (addr < 0xFC00) {
1206                set_sense_type(chip, SCSI_LUN(srb),
1207                               SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1208                return TRANSPORT_FAILED;
1209        }
1210
1211        buf = vmalloc(len);
1212        if (!buf)
1213                return TRANSPORT_ERROR;
1214
1215        retval = rtsx_force_power_on(chip, SSC_PDCTL);
1216        if (retval != STATUS_SUCCESS) {
1217                vfree(buf);
1218                set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1219                return TRANSPORT_FAILED;
1220        }
1221
1222        for (i = 0; i < len; i++) {
1223                retval = rtsx_read_register(chip, addr + i, buf + i);
1224                if (retval != STATUS_SUCCESS) {
1225                        vfree(buf);
1226                        set_sense_type(chip, SCSI_LUN(srb),
1227                                       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1228                        return TRANSPORT_FAILED;
1229                }
1230        }
1231
1232        len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
1233        rtsx_stor_set_xfer_buf(buf, len, srb);
1234        scsi_set_resid(srb, scsi_bufflen(srb) - len);
1235
1236        vfree(buf);
1237
1238        return TRANSPORT_GOOD;
1239}
1240
1241static int write_mem(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1242{
1243        unsigned short addr, len, i;
1244        int retval;
1245        u8 *buf;
1246
1247        rtsx_disable_aspm(chip);
1248
1249        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1250                rtsx_exit_ss(chip);
1251                wait_timeout(100);
1252        }
1253        rtsx_set_stat(chip, RTSX_STAT_RUN);
1254
1255        addr = ((u16)srb->cmnd[2] << 8) | srb->cmnd[3];
1256        len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1257
1258        if (addr < 0xFC00) {
1259                set_sense_type(chip, SCSI_LUN(srb),
1260                               SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1261                return TRANSPORT_FAILED;
1262        }
1263
1264        len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
1265        buf = vmalloc(len);
1266        if (!buf)
1267                return TRANSPORT_ERROR;
1268
1269        rtsx_stor_get_xfer_buf(buf, len, srb);
1270        scsi_set_resid(srb, scsi_bufflen(srb) - len);
1271
1272        retval = rtsx_force_power_on(chip, SSC_PDCTL);
1273        if (retval != STATUS_SUCCESS) {
1274                vfree(buf);
1275                set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1276                return TRANSPORT_FAILED;
1277        }
1278
1279        for (i = 0; i < len; i++) {
1280                retval = rtsx_write_register(chip, addr + i, 0xFF, buf[i]);
1281                if (retval != STATUS_SUCCESS) {
1282                        vfree(buf);
1283                        set_sense_type(chip, SCSI_LUN(srb),
1284                                       SENSE_TYPE_MEDIA_WRITE_ERR);
1285                        return TRANSPORT_FAILED;
1286                }
1287        }
1288
1289        vfree(buf);
1290
1291        return TRANSPORT_GOOD;
1292}
1293
1294static int get_sd_csd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1295{
1296        struct sd_info *sd_card = &chip->sd_card;
1297        unsigned int lun = SCSI_LUN(srb);
1298
1299        if (!check_card_ready(chip, lun)) {
1300                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1301                return TRANSPORT_FAILED;
1302        }
1303
1304        if (get_lun_card(chip, lun) != SD_CARD) {
1305                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1306                return TRANSPORT_FAILED;
1307        }
1308
1309        scsi_set_resid(srb, 0);
1310        rtsx_stor_set_xfer_buf(sd_card->raw_csd, scsi_bufflen(srb), srb);
1311
1312        return TRANSPORT_GOOD;
1313}
1314
1315static int toggle_gpio_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1316{
1317        u8 gpio = srb->cmnd[2];
1318
1319        rtsx_disable_aspm(chip);
1320
1321        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1322                rtsx_exit_ss(chip);
1323                wait_timeout(100);
1324        }
1325        rtsx_set_stat(chip, RTSX_STAT_RUN);
1326
1327        if (gpio > 3)
1328                gpio = 1;
1329        toggle_gpio(chip, gpio);
1330
1331        return TRANSPORT_GOOD;
1332}
1333
1334static int read_host_reg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1335{
1336        u8 addr, buf[4];
1337        u32 val;
1338        unsigned int len;
1339
1340        rtsx_disable_aspm(chip);
1341
1342        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1343                rtsx_exit_ss(chip);
1344                wait_timeout(100);
1345        }
1346        rtsx_set_stat(chip, RTSX_STAT_RUN);
1347
1348        addr = srb->cmnd[4];
1349
1350        val = rtsx_readl(chip, addr);
1351        dev_dbg(rtsx_dev(chip), "Host register (0x%x): 0x%x\n", addr, val);
1352
1353        buf[0] = (u8)(val >> 24);
1354        buf[1] = (u8)(val >> 16);
1355        buf[2] = (u8)(val >> 8);
1356        buf[3] = (u8)val;
1357
1358        len = min_t(unsigned int, scsi_bufflen(srb), 4);
1359        rtsx_stor_set_xfer_buf(buf, len, srb);
1360        scsi_set_resid(srb, scsi_bufflen(srb) - len);
1361
1362        return TRANSPORT_GOOD;
1363}
1364
1365static int write_host_reg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1366{
1367        u8 addr, buf[4];
1368        u32 val;
1369        unsigned int len;
1370
1371        rtsx_disable_aspm(chip);
1372
1373        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1374                rtsx_exit_ss(chip);
1375                wait_timeout(100);
1376        }
1377        rtsx_set_stat(chip, RTSX_STAT_RUN);
1378
1379        addr = srb->cmnd[4];
1380
1381        len = min_t(unsigned int, scsi_bufflen(srb), 4);
1382        rtsx_stor_get_xfer_buf(buf, len, srb);
1383        scsi_set_resid(srb, scsi_bufflen(srb) - len);
1384
1385        val = ((u32)buf[0] << 24) | ((u32)buf[1] << 16) | ((u32)buf[2]
1386                                                        << 8) | buf[3];
1387
1388        rtsx_writel(chip, addr, val);
1389
1390        return TRANSPORT_GOOD;
1391}
1392
1393static int set_variable(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1394{
1395        unsigned int lun = SCSI_LUN(srb);
1396
1397        if (srb->cmnd[3] == 1) {
1398                /* Variable Clock */
1399                struct xd_info *xd_card = &chip->xd_card;
1400                struct sd_info *sd_card = &chip->sd_card;
1401                struct ms_info *ms_card = &chip->ms_card;
1402
1403                switch (srb->cmnd[4]) {
1404                case XD_CARD:
1405                        xd_card->xd_clock = srb->cmnd[5];
1406                        break;
1407
1408                case SD_CARD:
1409                        sd_card->sd_clock = srb->cmnd[5];
1410                        break;
1411
1412                case MS_CARD:
1413                        ms_card->ms_clock = srb->cmnd[5];
1414                        break;
1415
1416                default:
1417                        set_sense_type(chip, lun,
1418                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1419                        return TRANSPORT_FAILED;
1420                }
1421        } else if (srb->cmnd[3] == 2) {
1422                if (srb->cmnd[4]) {
1423                        chip->blink_led = 1;
1424                } else {
1425                        int retval;
1426
1427                        chip->blink_led = 0;
1428
1429                        rtsx_disable_aspm(chip);
1430
1431                        if (chip->ss_en &&
1432                            (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1433                                rtsx_exit_ss(chip);
1434                                wait_timeout(100);
1435                        }
1436                        rtsx_set_stat(chip, RTSX_STAT_RUN);
1437
1438                        retval = rtsx_force_power_on(chip, SSC_PDCTL);
1439                        if (retval != STATUS_SUCCESS) {
1440                                set_sense_type(chip, SCSI_LUN(srb),
1441                                               SENSE_TYPE_MEDIA_WRITE_ERR);
1442                                return TRANSPORT_FAILED;
1443                        }
1444
1445                        turn_off_led(chip, LED_GPIO);
1446                }
1447        } else {
1448                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1449                return TRANSPORT_FAILED;
1450        }
1451
1452        return TRANSPORT_GOOD;
1453}
1454
1455static int get_variable(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1456{
1457        unsigned int lun = SCSI_LUN(srb);
1458
1459        if (srb->cmnd[3] == 1) {
1460                struct xd_info *xd_card = &chip->xd_card;
1461                struct sd_info *sd_card = &chip->sd_card;
1462                struct ms_info *ms_card = &chip->ms_card;
1463                u8 tmp;
1464
1465                switch (srb->cmnd[4]) {
1466                case XD_CARD:
1467                        tmp = (u8)(xd_card->xd_clock);
1468                        break;
1469
1470                case SD_CARD:
1471                        tmp = (u8)(sd_card->sd_clock);
1472                        break;
1473
1474                case MS_CARD:
1475                        tmp = (u8)(ms_card->ms_clock);
1476                        break;
1477
1478                default:
1479                        set_sense_type(chip, lun,
1480                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1481                        return TRANSPORT_FAILED;
1482                }
1483
1484                rtsx_stor_set_xfer_buf(&tmp, 1, srb);
1485        } else if (srb->cmnd[3] == 2) {
1486                u8 tmp = chip->blink_led;
1487
1488                rtsx_stor_set_xfer_buf(&tmp, 1, srb);
1489        } else {
1490                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1491                return TRANSPORT_FAILED;
1492        }
1493
1494        return TRANSPORT_GOOD;
1495}
1496
1497static int dma_access_ring_buffer(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1498{
1499        int retval;
1500        unsigned int lun = SCSI_LUN(srb);
1501        u16 len;
1502
1503        rtsx_disable_aspm(chip);
1504
1505        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1506                rtsx_exit_ss(chip);
1507                wait_timeout(100);
1508        }
1509        rtsx_set_stat(chip, RTSX_STAT_RUN);
1510
1511        len = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
1512        len = min_t(u16, len, scsi_bufflen(srb));
1513
1514        if (srb->sc_data_direction == DMA_FROM_DEVICE)
1515                dev_dbg(rtsx_dev(chip), "Read from device\n");
1516        else
1517                dev_dbg(rtsx_dev(chip), "Write to device\n");
1518
1519        retval = rtsx_transfer_data(chip, 0, scsi_sglist(srb), len,
1520                                    scsi_sg_count(srb), srb->sc_data_direction,
1521                                    1000);
1522        if (retval < 0) {
1523                if (srb->sc_data_direction == DMA_FROM_DEVICE)
1524                        set_sense_type(chip, lun,
1525                                       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1526                else
1527                        set_sense_type(chip, lun,
1528                                       SENSE_TYPE_MEDIA_WRITE_ERR);
1529
1530                return TRANSPORT_FAILED;
1531        }
1532        scsi_set_resid(srb, 0);
1533
1534        return TRANSPORT_GOOD;
1535}
1536
1537static int get_dev_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1538{
1539        struct sd_info *sd_card = &chip->sd_card;
1540        struct ms_info *ms_card = &chip->ms_card;
1541        int buf_len;
1542        unsigned int lun = SCSI_LUN(srb);
1543        u8 card = get_lun_card(chip, lun);
1544        u8 status[32];
1545#ifdef SUPPORT_OCP
1546        u8 oc_now_mask = 0, oc_ever_mask = 0;
1547#endif
1548
1549        memset(status, 0, 32);
1550
1551        status[0] = (u8)(chip->product_id);
1552        status[1] = chip->ic_version;
1553
1554        if (chip->auto_delink_en)
1555                status[2] = 0x10;
1556        else
1557                status[2] = 0x00;
1558
1559        status[3] = 20;
1560        status[4] = 10;
1561        status[5] = 05;
1562        status[6] = 21;
1563
1564        if (chip->card_wp)
1565                status[7] = 0x20;
1566        else
1567                status[7] = 0x00;
1568
1569#ifdef SUPPORT_OCP
1570        status[8] = 0;
1571        if (CHECK_LUN_MODE(chip, SD_MS_2LUN) &&
1572            (chip->lun2card[lun] == MS_CARD)) {
1573                oc_now_mask = MS_OC_NOW;
1574                oc_ever_mask = MS_OC_EVER;
1575        } else {
1576                oc_now_mask = SD_OC_NOW;
1577                oc_ever_mask = SD_OC_EVER;
1578        }
1579
1580        if (chip->ocp_stat & oc_now_mask)
1581                status[8] |= 0x02;
1582
1583        if (chip->ocp_stat & oc_ever_mask)
1584                status[8] |= 0x01;
1585#endif
1586
1587        if (card == SD_CARD) {
1588                if (CHK_SD(sd_card)) {
1589                        if (CHK_SD_HCXC(sd_card)) {
1590                                if (sd_card->capacity > 0x4000000)
1591                                        status[0x0E] = 0x02;
1592                                else
1593                                        status[0x0E] = 0x01;
1594                        } else {
1595                                status[0x0E] = 0x00;
1596                        }
1597
1598                        if (CHK_SD_SDR104(sd_card))
1599                                status[0x0F] = 0x03;
1600                        else if (CHK_SD_DDR50(sd_card))
1601                                status[0x0F] = 0x04;
1602                        else if (CHK_SD_SDR50(sd_card))
1603                                status[0x0F] = 0x02;
1604                        else if (CHK_SD_HS(sd_card))
1605                                status[0x0F] = 0x01;
1606                        else
1607                                status[0x0F] = 0x00;
1608                } else {
1609                        if (CHK_MMC_SECTOR_MODE(sd_card))
1610                                status[0x0E] = 0x01;
1611                        else
1612                                status[0x0E] = 0x00;
1613
1614                        if (CHK_MMC_DDR52(sd_card))
1615                                status[0x0F] = 0x03;
1616                        else if (CHK_MMC_52M(sd_card))
1617                                status[0x0F] = 0x02;
1618                        else if (CHK_MMC_26M(sd_card))
1619                                status[0x0F] = 0x01;
1620                        else
1621                                status[0x0F] = 0x00;
1622                }
1623        } else if (card == MS_CARD) {
1624                if (CHK_MSPRO(ms_card)) {
1625                        if (CHK_MSXC(ms_card))
1626                                status[0x0E] = 0x01;
1627                        else
1628                                status[0x0E] = 0x00;
1629
1630                        if (CHK_HG8BIT(ms_card))
1631                                status[0x0F] = 0x01;
1632                        else
1633                                status[0x0F] = 0x00;
1634                }
1635        }
1636
1637#ifdef SUPPORT_SD_LOCK
1638        if (card == SD_CARD) {
1639                status[0x17] = 0x80;
1640                if (sd_card->sd_erase_status)
1641                        status[0x17] |= 0x01;
1642                if (sd_card->sd_lock_status & SD_LOCKED) {
1643                        status[0x17] |= 0x02;
1644                        status[0x07] |= 0x40;
1645                }
1646                if (sd_card->sd_lock_status & SD_PWD_EXIST)
1647                        status[0x17] |= 0x04;
1648        } else {
1649                status[0x17] = 0x00;
1650        }
1651
1652        dev_dbg(rtsx_dev(chip), "status[0x17] = 0x%x\n", status[0x17]);
1653#endif
1654
1655        status[0x18] = 0x8A;
1656        status[0x1A] = 0x28;
1657#ifdef SUPPORT_SD_LOCK
1658        status[0x1F] = 0x01;
1659#endif
1660
1661        buf_len = min_t(unsigned int, scsi_bufflen(srb), sizeof(status));
1662        rtsx_stor_set_xfer_buf(status, buf_len, srb);
1663        scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
1664
1665        return TRANSPORT_GOOD;
1666}
1667
1668static int set_chip_mode(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1669{
1670        int phy_debug_mode;
1671        int retval;
1672        u16 reg;
1673
1674        if (!CHECK_PID(chip, 0x5208)) {
1675                set_sense_type(chip, SCSI_LUN(srb),
1676                               SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1677                return TRANSPORT_FAILED;
1678        }
1679
1680        phy_debug_mode = (int)(srb->cmnd[3]);
1681
1682        if (phy_debug_mode) {
1683                chip->phy_debug_mode = 1;
1684                retval = rtsx_write_register(chip, CDRESUMECTL, 0x77, 0);
1685                if (retval != STATUS_SUCCESS)
1686                        return TRANSPORT_FAILED;
1687
1688                rtsx_disable_bus_int(chip);
1689
1690                retval = rtsx_read_phy_register(chip, 0x1C, &reg);
1691                if (retval != STATUS_SUCCESS)
1692                        return TRANSPORT_FAILED;
1693
1694                reg |= 0x0001;
1695                retval = rtsx_write_phy_register(chip, 0x1C, reg);
1696                if (retval != STATUS_SUCCESS)
1697                        return TRANSPORT_FAILED;
1698        } else {
1699                chip->phy_debug_mode = 0;
1700                retval = rtsx_write_register(chip, CDRESUMECTL, 0x77, 0x77);
1701                if (retval != STATUS_SUCCESS)
1702                        return TRANSPORT_FAILED;
1703
1704                rtsx_enable_bus_int(chip);
1705
1706                retval = rtsx_read_phy_register(chip, 0x1C, &reg);
1707                if (retval != STATUS_SUCCESS)
1708                        return TRANSPORT_FAILED;
1709
1710                reg &= 0xFFFE;
1711                retval = rtsx_write_phy_register(chip, 0x1C, reg);
1712                if (retval != STATUS_SUCCESS)
1713                        return TRANSPORT_FAILED;
1714        }
1715
1716        return TRANSPORT_GOOD;
1717}
1718
1719static int rw_mem_cmd_buf(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1720{
1721        int retval =  STATUS_SUCCESS;
1722        unsigned int lun = SCSI_LUN(srb);
1723        u8 cmd_type, mask, value, idx;
1724        u16 addr;
1725
1726        rtsx_disable_aspm(chip);
1727
1728        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1729                rtsx_exit_ss(chip);
1730                wait_timeout(100);
1731        }
1732        rtsx_set_stat(chip, RTSX_STAT_RUN);
1733
1734        switch (srb->cmnd[3]) {
1735        case INIT_BATCHCMD:
1736                rtsx_init_cmd(chip);
1737                break;
1738
1739        case ADD_BATCHCMD:
1740                cmd_type = srb->cmnd[4];
1741                if (cmd_type > 2) {
1742                        set_sense_type(chip, lun,
1743                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1744                        return TRANSPORT_FAILED;
1745                }
1746                addr = (srb->cmnd[5] << 8) | srb->cmnd[6];
1747                mask = srb->cmnd[7];
1748                value = srb->cmnd[8];
1749                rtsx_add_cmd(chip, cmd_type, addr, mask, value);
1750                break;
1751
1752        case SEND_BATCHCMD:
1753                retval = rtsx_send_cmd(chip, 0, 1000);
1754                break;
1755
1756        case GET_BATCHRSP:
1757                idx = srb->cmnd[4];
1758                value = *(rtsx_get_cmd_data(chip) + idx);
1759                if (scsi_bufflen(srb) < 1) {
1760                        set_sense_type(chip, lun,
1761                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1762                        return TRANSPORT_FAILED;
1763                }
1764                rtsx_stor_set_xfer_buf(&value, 1, srb);
1765                scsi_set_resid(srb, 0);
1766                break;
1767
1768        default:
1769                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1770                return TRANSPORT_FAILED;
1771        }
1772
1773        if (retval != STATUS_SUCCESS) {
1774                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
1775                return TRANSPORT_FAILED;
1776        }
1777
1778        return TRANSPORT_GOOD;
1779}
1780
1781static int suit_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1782{
1783        switch (srb->cmnd[3]) {
1784        case INIT_BATCHCMD:
1785        case ADD_BATCHCMD:
1786        case SEND_BATCHCMD:
1787        case GET_BATCHRSP:
1788                return rw_mem_cmd_buf(srb, chip);
1789        default:
1790                return TRANSPORT_ERROR;
1791        }
1792}
1793
1794static int read_phy_register(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1795{
1796        unsigned short addr, len, i;
1797        int retval;
1798        u8 *buf;
1799        u16 val;
1800
1801        rtsx_disable_aspm(chip);
1802
1803        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1804                rtsx_exit_ss(chip);
1805                wait_timeout(100);
1806        }
1807        rtsx_set_stat(chip, RTSX_STAT_RUN);
1808
1809        addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1810        len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1811
1812        if (len % 2)
1813                len -= len % 2;
1814
1815        if (len) {
1816                buf = vmalloc(len);
1817                if (!buf)
1818                        return TRANSPORT_ERROR;
1819
1820                retval = rtsx_force_power_on(chip, SSC_PDCTL);
1821                if (retval != STATUS_SUCCESS) {
1822                        vfree(buf);
1823                        set_sense_type(chip, SCSI_LUN(srb),
1824                                       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1825                        return TRANSPORT_FAILED;
1826                }
1827
1828                for (i = 0; i < len / 2; i++) {
1829                        retval = rtsx_read_phy_register(chip, addr + i, &val);
1830                        if (retval != STATUS_SUCCESS) {
1831                                vfree(buf);
1832                                set_sense_type
1833                                        (chip, SCSI_LUN(srb),
1834                                         SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1835                                return TRANSPORT_FAILED;
1836                        }
1837
1838                        buf[2 * i] = (u8)(val >> 8);
1839                        buf[2 * i + 1] = (u8)val;
1840                }
1841
1842                len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb),
1843                                        len);
1844                rtsx_stor_set_xfer_buf(buf, len, srb);
1845                scsi_set_resid(srb, scsi_bufflen(srb) - len);
1846
1847                vfree(buf);
1848        }
1849
1850        return TRANSPORT_GOOD;
1851}
1852
1853static int write_phy_register(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1854{
1855        unsigned short addr, len, i;
1856        int retval;
1857        u8 *buf;
1858        u16 val;
1859
1860        rtsx_disable_aspm(chip);
1861
1862        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1863                rtsx_exit_ss(chip);
1864                wait_timeout(100);
1865        }
1866        rtsx_set_stat(chip, RTSX_STAT_RUN);
1867
1868        addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1869        len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1870
1871        if (len % 2)
1872                len -= len % 2;
1873
1874        if (len) {
1875                len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb),
1876                                        len);
1877
1878                buf = vmalloc(len);
1879                if (!buf)
1880                        return TRANSPORT_ERROR;
1881
1882                rtsx_stor_get_xfer_buf(buf, len, srb);
1883                scsi_set_resid(srb, scsi_bufflen(srb) - len);
1884
1885                retval = rtsx_force_power_on(chip, SSC_PDCTL);
1886                if (retval != STATUS_SUCCESS) {
1887                        vfree(buf);
1888                        set_sense_type(chip, SCSI_LUN(srb),
1889                                       SENSE_TYPE_MEDIA_WRITE_ERR);
1890                        return TRANSPORT_FAILED;
1891                }
1892
1893                for (i = 0; i < len / 2; i++) {
1894                        val = ((u16)buf[2 * i] << 8) | buf[2 * i + 1];
1895                        retval = rtsx_write_phy_register(chip, addr + i, val);
1896                        if (retval != STATUS_SUCCESS) {
1897                                vfree(buf);
1898                                set_sense_type(chip, SCSI_LUN(srb),
1899                                               SENSE_TYPE_MEDIA_WRITE_ERR);
1900                                return TRANSPORT_FAILED;
1901                        }
1902                }
1903
1904                vfree(buf);
1905        }
1906
1907        return TRANSPORT_GOOD;
1908}
1909
1910static int erase_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1911{
1912        unsigned short addr;
1913        int retval;
1914        u8 mode;
1915
1916        rtsx_disable_aspm(chip);
1917
1918        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1919                rtsx_exit_ss(chip);
1920                wait_timeout(100);
1921        }
1922        rtsx_set_stat(chip, RTSX_STAT_RUN);
1923
1924        retval = rtsx_force_power_on(chip, SSC_PDCTL);
1925        if (retval != STATUS_SUCCESS) {
1926                set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1927                return TRANSPORT_FAILED;
1928        }
1929
1930        mode = srb->cmnd[3];
1931        addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1932
1933        if (mode == 0) {
1934                retval = spi_erase_eeprom_chip(chip);
1935                if (retval != STATUS_SUCCESS) {
1936                        set_sense_type(chip, SCSI_LUN(srb),
1937                                       SENSE_TYPE_MEDIA_WRITE_ERR);
1938                        return TRANSPORT_FAILED;
1939                }
1940        } else if (mode == 1) {
1941                retval = spi_erase_eeprom_byte(chip, addr);
1942                if (retval != STATUS_SUCCESS) {
1943                        set_sense_type(chip, SCSI_LUN(srb),
1944                                       SENSE_TYPE_MEDIA_WRITE_ERR);
1945                        return TRANSPORT_FAILED;
1946                }
1947        } else {
1948                set_sense_type(chip, SCSI_LUN(srb),
1949                               SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1950                return TRANSPORT_FAILED;
1951        }
1952
1953        return TRANSPORT_GOOD;
1954}
1955
1956static int read_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1957{
1958        unsigned short addr, len, i;
1959        int retval;
1960        u8 *buf;
1961
1962        rtsx_disable_aspm(chip);
1963
1964        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1965                rtsx_exit_ss(chip);
1966                wait_timeout(100);
1967        }
1968        rtsx_set_stat(chip, RTSX_STAT_RUN);
1969
1970        addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1971        len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1972
1973        buf = vmalloc(len);
1974        if (!buf)
1975                return TRANSPORT_ERROR;
1976
1977        retval = rtsx_force_power_on(chip, SSC_PDCTL);
1978        if (retval != STATUS_SUCCESS) {
1979                vfree(buf);
1980                set_sense_type(chip, SCSI_LUN(srb),
1981                               SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1982                return TRANSPORT_FAILED;
1983        }
1984
1985        for (i = 0; i < len; i++) {
1986                retval = spi_read_eeprom(chip, addr + i, buf + i);
1987                if (retval != STATUS_SUCCESS) {
1988                        vfree(buf);
1989                        set_sense_type(chip, SCSI_LUN(srb),
1990                                       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1991                        return TRANSPORT_FAILED;
1992                }
1993        }
1994
1995        len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
1996        rtsx_stor_set_xfer_buf(buf, len, srb);
1997        scsi_set_resid(srb, scsi_bufflen(srb) - len);
1998
1999        vfree(buf);
2000
2001        return TRANSPORT_GOOD;
2002}
2003
2004static int write_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2005{
2006        unsigned short addr, len, i;
2007        int retval;
2008        u8 *buf;
2009
2010        rtsx_disable_aspm(chip);
2011
2012        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2013                rtsx_exit_ss(chip);
2014                wait_timeout(100);
2015        }
2016        rtsx_set_stat(chip, RTSX_STAT_RUN);
2017
2018        addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
2019        len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
2020
2021        len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
2022        buf = vmalloc(len);
2023        if (!buf)
2024                return TRANSPORT_ERROR;
2025
2026        rtsx_stor_get_xfer_buf(buf, len, srb);
2027        scsi_set_resid(srb, scsi_bufflen(srb) - len);
2028
2029        retval = rtsx_force_power_on(chip, SSC_PDCTL);
2030        if (retval != STATUS_SUCCESS) {
2031                vfree(buf);
2032                set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
2033                return TRANSPORT_FAILED;
2034        }
2035
2036        for (i = 0; i < len; i++) {
2037                retval = spi_write_eeprom(chip, addr + i, buf[i]);
2038                if (retval != STATUS_SUCCESS) {
2039                        vfree(buf);
2040                        set_sense_type(chip, SCSI_LUN(srb),
2041                                       SENSE_TYPE_MEDIA_WRITE_ERR);
2042                        return TRANSPORT_FAILED;
2043                }
2044        }
2045
2046        vfree(buf);
2047
2048        return TRANSPORT_GOOD;
2049}
2050
2051static int read_efuse(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2052{
2053        int retval;
2054        u8 addr, len, i;
2055        u8 *buf;
2056
2057        rtsx_disable_aspm(chip);
2058
2059        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2060                rtsx_exit_ss(chip);
2061                wait_timeout(100);
2062        }
2063        rtsx_set_stat(chip, RTSX_STAT_RUN);
2064
2065        addr = srb->cmnd[4];
2066        len = srb->cmnd[5];
2067
2068        buf = vmalloc(len);
2069        if (!buf)
2070                return TRANSPORT_ERROR;
2071
2072        retval = rtsx_force_power_on(chip, SSC_PDCTL);
2073        if (retval != STATUS_SUCCESS) {
2074                vfree(buf);
2075                set_sense_type(chip, SCSI_LUN(srb),
2076                               SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2077                return TRANSPORT_FAILED;
2078        }
2079
2080        for (i = 0; i < len; i++) {
2081                retval = rtsx_read_efuse(chip, addr + i, buf + i);
2082                if (retval != STATUS_SUCCESS) {
2083                        vfree(buf);
2084                        set_sense_type(chip, SCSI_LUN(srb),
2085                                       SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2086                        return TRANSPORT_FAILED;
2087                }
2088        }
2089
2090        len = (u8)min_t(unsigned int, scsi_bufflen(srb), len);
2091        rtsx_stor_set_xfer_buf(buf, len, srb);
2092        scsi_set_resid(srb, scsi_bufflen(srb) - len);
2093
2094        vfree(buf);
2095
2096        return TRANSPORT_GOOD;
2097}
2098
2099static int write_efuse(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2100{
2101        int retval, result = TRANSPORT_GOOD;
2102        u16 val;
2103        u8 addr, len, i;
2104        u8 *buf;
2105
2106        rtsx_disable_aspm(chip);
2107
2108        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2109                rtsx_exit_ss(chip);
2110                wait_timeout(100);
2111        }
2112        rtsx_set_stat(chip, RTSX_STAT_RUN);
2113
2114        addr = srb->cmnd[4];
2115        len = srb->cmnd[5];
2116
2117        len = (u8)min_t(unsigned int, scsi_bufflen(srb), len);
2118        buf = vmalloc(len);
2119        if (!buf)
2120                return TRANSPORT_ERROR;
2121
2122        rtsx_stor_get_xfer_buf(buf, len, srb);
2123        scsi_set_resid(srb, scsi_bufflen(srb) - len);
2124
2125        retval = rtsx_force_power_on(chip, SSC_PDCTL);
2126        if (retval != STATUS_SUCCESS) {
2127                vfree(buf);
2128                return TRANSPORT_ERROR;
2129        }
2130
2131        if (chip->asic_code) {
2132                retval = rtsx_read_phy_register(chip, 0x08, &val);
2133                if (retval != STATUS_SUCCESS) {
2134                        vfree(buf);
2135                        return TRANSPORT_ERROR;
2136                }
2137
2138                retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2139                                             LDO3318_PWR_MASK, LDO_OFF);
2140                if (retval != STATUS_SUCCESS) {
2141                        vfree(buf);
2142                        return TRANSPORT_ERROR;
2143                }
2144
2145                wait_timeout(600);
2146
2147                retval = rtsx_write_phy_register(chip, 0x08,
2148                                                 0x4C00 | chip->phy_voltage);
2149                if (retval != STATUS_SUCCESS) {
2150                        vfree(buf);
2151                        return TRANSPORT_ERROR;
2152                }
2153
2154                retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2155                                             LDO3318_PWR_MASK, LDO_ON);
2156                if (retval != STATUS_SUCCESS) {
2157                        vfree(buf);
2158                        return TRANSPORT_ERROR;
2159                }
2160
2161                wait_timeout(600);
2162        }
2163
2164        retval = card_power_on(chip, SPI_CARD);
2165        if (retval != STATUS_SUCCESS) {
2166                vfree(buf);
2167                return TRANSPORT_ERROR;
2168        }
2169
2170        wait_timeout(50);
2171
2172        for (i = 0; i < len; i++) {
2173                retval = rtsx_write_efuse(chip, addr + i, buf[i]);
2174                if (retval != STATUS_SUCCESS) {
2175                        set_sense_type(chip, SCSI_LUN(srb),
2176                                       SENSE_TYPE_MEDIA_WRITE_ERR);
2177                        result = TRANSPORT_FAILED;
2178                        goto exit;
2179                }
2180        }
2181
2182exit:
2183        vfree(buf);
2184
2185        retval = card_power_off(chip, SPI_CARD);
2186        if (retval != STATUS_SUCCESS)
2187                return TRANSPORT_ERROR;
2188
2189        if (chip->asic_code) {
2190                retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2191                                             LDO3318_PWR_MASK, LDO_OFF);
2192                if (retval != STATUS_SUCCESS)
2193                        return TRANSPORT_ERROR;
2194
2195                wait_timeout(600);
2196
2197                retval = rtsx_write_phy_register(chip, 0x08, val);
2198                if (retval != STATUS_SUCCESS)
2199                        return TRANSPORT_ERROR;
2200
2201                retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2202                                             LDO3318_PWR_MASK, LDO_ON);
2203                if (retval != STATUS_SUCCESS)
2204                        return TRANSPORT_ERROR;
2205        }
2206
2207        return result;
2208}
2209
2210static int read_cfg_byte(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2211{
2212        int retval;
2213        bool func_max;
2214        u8 func;
2215        u16 addr, len;
2216        u8 *buf;
2217
2218        rtsx_disable_aspm(chip);
2219
2220        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2221                rtsx_exit_ss(chip);
2222                wait_timeout(100);
2223        }
2224        rtsx_set_stat(chip, RTSX_STAT_RUN);
2225
2226        func = srb->cmnd[3];
2227        addr = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
2228        len = ((u16)(srb->cmnd[6]) << 8) | srb->cmnd[7];
2229
2230        dev_dbg(rtsx_dev(chip), "%s: func = %d, addr = 0x%x, len = %d\n",
2231                __func__, func, addr, len);
2232
2233        if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip))
2234                func_max = true;
2235        else
2236                func_max = false;
2237
2238        if (func > func_max) {
2239                set_sense_type(chip, SCSI_LUN(srb),
2240                               SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2241                return TRANSPORT_FAILED;
2242        }
2243
2244        buf = vmalloc(len);
2245        if (!buf)
2246                return TRANSPORT_ERROR;
2247
2248        retval = rtsx_read_cfg_seq(chip, func, addr, buf, len);
2249        if (retval != STATUS_SUCCESS) {
2250                set_sense_type(chip, SCSI_LUN(srb),
2251                               SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2252                vfree(buf);
2253                return TRANSPORT_FAILED;
2254        }
2255
2256        len = (u16)min_t(unsigned int, scsi_bufflen(srb), len);
2257        rtsx_stor_set_xfer_buf(buf, len, srb);
2258        scsi_set_resid(srb, scsi_bufflen(srb) - len);
2259
2260        vfree(buf);
2261
2262        return TRANSPORT_GOOD;
2263}
2264
2265static int write_cfg_byte(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2266{
2267        int retval;
2268        bool func_max;
2269        u8 func;
2270        u16 addr, len;
2271        u8 *buf;
2272
2273        rtsx_disable_aspm(chip);
2274
2275        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2276                rtsx_exit_ss(chip);
2277                wait_timeout(100);
2278        }
2279        rtsx_set_stat(chip, RTSX_STAT_RUN);
2280
2281        func = srb->cmnd[3];
2282        addr = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
2283        len = ((u16)(srb->cmnd[6]) << 8) | srb->cmnd[7];
2284
2285        dev_dbg(rtsx_dev(chip), "%s: func = %d, addr = 0x%x\n",
2286                __func__, func, addr);
2287
2288        if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip))
2289                func_max = true;
2290        else
2291                func_max = false;
2292
2293        if (func > func_max) {
2294                set_sense_type(chip, SCSI_LUN(srb),
2295                               SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2296                return TRANSPORT_FAILED;
2297        }
2298
2299        len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
2300        buf = vmalloc(len);
2301        if (!buf)
2302                return TRANSPORT_ERROR;
2303
2304        rtsx_stor_get_xfer_buf(buf, len, srb);
2305        scsi_set_resid(srb, scsi_bufflen(srb) - len);
2306
2307        retval = rtsx_write_cfg_seq(chip, func, addr, buf, len);
2308        if (retval != STATUS_SUCCESS) {
2309                set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
2310                vfree(buf);
2311                return TRANSPORT_FAILED;
2312        }
2313
2314        vfree(buf);
2315
2316        return TRANSPORT_GOOD;
2317}
2318
2319static int app_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2320{
2321        int result;
2322
2323        switch (srb->cmnd[2]) {
2324        case PP_READ10:
2325        case PP_WRITE10:
2326                result = read_write(srb, chip);
2327                break;
2328
2329        case READ_HOST_REG:
2330                result = read_host_reg(srb, chip);
2331                break;
2332
2333        case WRITE_HOST_REG:
2334                result = write_host_reg(srb, chip);
2335                break;
2336
2337        case GET_VAR:
2338                result = get_variable(srb, chip);
2339                break;
2340
2341        case SET_VAR:
2342                result = set_variable(srb, chip);
2343                break;
2344
2345        case DMA_READ:
2346        case DMA_WRITE:
2347                result = dma_access_ring_buffer(srb, chip);
2348                break;
2349
2350        case READ_PHY:
2351                result = read_phy_register(srb, chip);
2352                break;
2353
2354        case WRITE_PHY:
2355                result = write_phy_register(srb, chip);
2356                break;
2357
2358        case ERASE_EEPROM2:
2359                result = erase_eeprom2(srb, chip);
2360                break;
2361
2362        case READ_EEPROM2:
2363                result = read_eeprom2(srb, chip);
2364                break;
2365
2366        case WRITE_EEPROM2:
2367                result = write_eeprom2(srb, chip);
2368                break;
2369
2370        case READ_EFUSE:
2371                result = read_efuse(srb, chip);
2372                break;
2373
2374        case WRITE_EFUSE:
2375                result = write_efuse(srb, chip);
2376                break;
2377
2378        case READ_CFG:
2379                result = read_cfg_byte(srb, chip);
2380                break;
2381
2382        case WRITE_CFG:
2383                result = write_cfg_byte(srb, chip);
2384                break;
2385
2386        case SET_CHIP_MODE:
2387                result = set_chip_mode(srb, chip);
2388                break;
2389
2390        case SUIT_CMD:
2391                result = suit_cmd(srb, chip);
2392                break;
2393
2394        case GET_DEV_STATUS:
2395                result = get_dev_status(srb, chip);
2396                break;
2397
2398        default:
2399                set_sense_type(chip, SCSI_LUN(srb),
2400                               SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2401                return TRANSPORT_FAILED;
2402        }
2403
2404        return result;
2405}
2406
2407static int read_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2408{
2409        u8 rtsx_status[16];
2410        int buf_len;
2411        unsigned int lun = SCSI_LUN(srb);
2412
2413        rtsx_status[0] = (u8)(chip->vendor_id >> 8);
2414        rtsx_status[1] = (u8)(chip->vendor_id);
2415
2416        rtsx_status[2] = (u8)(chip->product_id >> 8);
2417        rtsx_status[3] = (u8)(chip->product_id);
2418
2419        rtsx_status[4] = (u8)lun;
2420
2421        if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
2422                if (chip->lun2card[lun] == SD_CARD)
2423                        rtsx_status[5] = 2;
2424                else
2425                        rtsx_status[5] = 3;
2426        } else {
2427                if (chip->card_exist) {
2428                        if (chip->card_exist & XD_CARD)
2429                                rtsx_status[5] = 4;
2430                        else if (chip->card_exist & SD_CARD)
2431                                rtsx_status[5] = 2;
2432                        else if (chip->card_exist & MS_CARD)
2433                                rtsx_status[5] = 3;
2434                        else
2435                                rtsx_status[5] = 7;
2436                } else {
2437                        rtsx_status[5] = 7;
2438                }
2439        }
2440
2441        if (CHECK_LUN_MODE(chip, SD_MS_2LUN))
2442                rtsx_status[6] = 2;
2443        else
2444                rtsx_status[6] = 1;
2445
2446        rtsx_status[7] = (u8)(chip->product_id);
2447        rtsx_status[8] = chip->ic_version;
2448
2449        if (check_card_exist(chip, lun))
2450                rtsx_status[9] = 1;
2451        else
2452                rtsx_status[9] = 0;
2453
2454        if (CHECK_LUN_MODE(chip, SD_MS_2LUN))
2455                rtsx_status[10] = 0;
2456        else
2457                rtsx_status[10] = 1;
2458
2459        if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
2460                if (chip->lun2card[lun] == SD_CARD)
2461                        rtsx_status[11] = SD_CARD;
2462                else
2463                        rtsx_status[11] = MS_CARD;
2464        } else {
2465                rtsx_status[11] = XD_CARD | SD_CARD | MS_CARD;
2466        }
2467
2468        if (check_card_ready(chip, lun))
2469                rtsx_status[12] = 1;
2470        else
2471                rtsx_status[12] = 0;
2472
2473        if (get_lun_card(chip, lun) == XD_CARD) {
2474                rtsx_status[13] = 0x40;
2475        } else if (get_lun_card(chip, lun) == SD_CARD) {
2476                struct sd_info *sd_card = &chip->sd_card;
2477
2478                rtsx_status[13] = 0x20;
2479                if (CHK_SD(sd_card)) {
2480                        if (CHK_SD_HCXC(sd_card))
2481                                rtsx_status[13] |= 0x04;
2482                        if (CHK_SD_HS(sd_card))
2483                                rtsx_status[13] |= 0x02;
2484                } else {
2485                        rtsx_status[13] |= 0x08;
2486                        if (CHK_MMC_52M(sd_card))
2487                                rtsx_status[13] |= 0x02;
2488                        if (CHK_MMC_SECTOR_MODE(sd_card))
2489                                rtsx_status[13] |= 0x04;
2490                }
2491        } else if (get_lun_card(chip, lun) == MS_CARD) {
2492                struct ms_info *ms_card = &chip->ms_card;
2493
2494                if (CHK_MSPRO(ms_card)) {
2495                        rtsx_status[13] = 0x38;
2496                        if (CHK_HG8BIT(ms_card))
2497                                rtsx_status[13] |= 0x04;
2498#ifdef SUPPORT_MSXC
2499                        if (CHK_MSXC(ms_card))
2500                                rtsx_status[13] |= 0x01;
2501#endif
2502                } else {
2503                        rtsx_status[13] = 0x30;
2504                }
2505        } else {
2506                if (CHECK_LUN_MODE(chip, DEFAULT_SINGLE)) {
2507#ifdef SUPPORT_SDIO
2508                        if (chip->sd_io && chip->sd_int)
2509                                rtsx_status[13] = 0x60;
2510                        else
2511                                rtsx_status[13] = 0x70;
2512#else
2513                        rtsx_status[13] = 0x70;
2514#endif
2515                } else {
2516                        if (chip->lun2card[lun] == SD_CARD)
2517                                rtsx_status[13] = 0x20;
2518                        else
2519                                rtsx_status[13] = 0x30;
2520                }
2521        }
2522
2523        rtsx_status[14] = 0x78;
2524        if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip))
2525                rtsx_status[15] = 0x83;
2526        else
2527                rtsx_status[15] = 0x82;
2528
2529        buf_len = min_t(unsigned int, scsi_bufflen(srb), sizeof(rtsx_status));
2530        rtsx_stor_set_xfer_buf(rtsx_status, buf_len, srb);
2531        scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
2532
2533        return TRANSPORT_GOOD;
2534}
2535
2536static int get_card_bus_width(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2537{
2538        unsigned int lun = SCSI_LUN(srb);
2539        u8 card, bus_width;
2540
2541        if (!check_card_ready(chip, lun)) {
2542                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2543                return TRANSPORT_FAILED;
2544        }
2545
2546        card = get_lun_card(chip, lun);
2547        if ((card == SD_CARD) || (card == MS_CARD)) {
2548                bus_width = chip->card_bus_width[lun];
2549        } else {
2550                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2551                return TRANSPORT_FAILED;
2552        }
2553
2554        scsi_set_resid(srb, 0);
2555        rtsx_stor_set_xfer_buf(&bus_width, scsi_bufflen(srb), srb);
2556
2557        return TRANSPORT_GOOD;
2558}
2559
2560static int spi_vendor_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2561{
2562        int result;
2563        unsigned int lun = SCSI_LUN(srb);
2564        u8 gpio_dir;
2565
2566        if (CHECK_PID(chip, 0x5208) || CHECK_PID(chip, 0x5288)) {
2567                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2568                return TRANSPORT_FAILED;
2569        }
2570
2571        rtsx_disable_aspm(chip);
2572
2573        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2574                rtsx_exit_ss(chip);
2575                wait_timeout(100);
2576        }
2577        rtsx_set_stat(chip, RTSX_STAT_RUN);
2578
2579        rtsx_force_power_on(chip, SSC_PDCTL);
2580
2581        rtsx_read_register(chip, CARD_GPIO_DIR, &gpio_dir);
2582        rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir & 0x06);
2583
2584        switch (srb->cmnd[2]) {
2585        case SCSI_SPI_GETSTATUS:
2586                result = spi_get_status(srb, chip);
2587                break;
2588
2589        case SCSI_SPI_SETPARAMETER:
2590                result = spi_set_parameter(srb, chip);
2591                break;
2592
2593        case SCSI_SPI_READFALSHID:
2594                result = spi_read_flash_id(srb, chip);
2595                break;
2596
2597        case SCSI_SPI_READFLASH:
2598                result = spi_read_flash(srb, chip);
2599                break;
2600
2601        case SCSI_SPI_WRITEFLASH:
2602                result = spi_write_flash(srb, chip);
2603                break;
2604
2605        case SCSI_SPI_WRITEFLASHSTATUS:
2606                result = spi_write_flash_status(srb, chip);
2607                break;
2608
2609        case SCSI_SPI_ERASEFLASH:
2610                result = spi_erase_flash(srb, chip);
2611                break;
2612
2613        default:
2614                rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir);
2615
2616                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2617                return TRANSPORT_FAILED;
2618        }
2619
2620        rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir);
2621
2622        if (result != STATUS_SUCCESS)
2623                return TRANSPORT_FAILED;
2624
2625        return TRANSPORT_GOOD;
2626}
2627
2628static int vendor_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2629{
2630        int result;
2631
2632        switch (srb->cmnd[1]) {
2633        case READ_STATUS:
2634                result = read_status(srb, chip);
2635                break;
2636
2637        case READ_MEM:
2638                result = read_mem(srb, chip);
2639                break;
2640
2641        case WRITE_MEM:
2642                result = write_mem(srb, chip);
2643                break;
2644
2645        case READ_EEPROM:
2646                result = read_eeprom(srb, chip);
2647                break;
2648
2649        case WRITE_EEPROM:
2650                result = write_eeprom(srb, chip);
2651                break;
2652
2653        case TOGGLE_GPIO:
2654                result = toggle_gpio_cmd(srb, chip);
2655                break;
2656
2657        case GET_SD_CSD:
2658                result = get_sd_csd(srb, chip);
2659                break;
2660
2661        case GET_BUS_WIDTH:
2662                result = get_card_bus_width(srb, chip);
2663                break;
2664
2665        case SCSI_APP_CMD:
2666                result = app_cmd(srb, chip);
2667                break;
2668
2669        case SPI_VENDOR_COMMAND:
2670                result = spi_vendor_cmd(srb, chip);
2671                break;
2672
2673        default:
2674                set_sense_type(chip, SCSI_LUN(srb),
2675                               SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2676                return TRANSPORT_FAILED;
2677        }
2678
2679        return result;
2680}
2681
2682#if !defined(LED_AUTO_BLINK) && !defined(REGULAR_BLINK)
2683void led_shine(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2684{
2685        unsigned int lun = SCSI_LUN(srb);
2686        u16 sec_cnt;
2687
2688        if ((srb->cmnd[0] == READ_10) || (srb->cmnd[0] == WRITE_10)) {
2689                sec_cnt = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
2690        } else if ((srb->cmnd[0] == READ_6) || (srb->cmnd[0] == WRITE_6)) {
2691                sec_cnt = srb->cmnd[4];
2692                if (sec_cnt == 0)
2693                        sec_cnt = 256;
2694        } else {
2695                return;
2696        }
2697
2698        if (chip->rw_cap[lun] >= GPIO_TOGGLE_THRESHOLD) {
2699                toggle_gpio(chip, LED_GPIO);
2700                chip->rw_cap[lun] = 0;
2701        } else {
2702                chip->rw_cap[lun] += sec_cnt;
2703        }
2704}
2705#endif
2706
2707static int ms_format_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2708{
2709        struct ms_info *ms_card = &chip->ms_card;
2710        unsigned int lun = SCSI_LUN(srb);
2711        bool quick_format;
2712        int retval;
2713
2714        if (get_lun_card(chip, lun) != MS_CARD) {
2715                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2716                return TRANSPORT_FAILED;
2717        }
2718
2719        if ((srb->cmnd[3] != 0x4D) || (srb->cmnd[4] != 0x47) ||
2720            (srb->cmnd[5] != 0x66) || (srb->cmnd[6] != 0x6D) ||
2721                (srb->cmnd[7] != 0x74)) {
2722                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2723                return TRANSPORT_FAILED;
2724        }
2725
2726        rtsx_disable_aspm(chip);
2727
2728        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2729                rtsx_exit_ss(chip);
2730                wait_timeout(100);
2731
2732                if (!check_card_ready(chip, lun) ||
2733                    (get_card_size(chip, lun) == 0)) {
2734                        set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2735                        return TRANSPORT_FAILED;
2736                }
2737        }
2738        rtsx_set_stat(chip, RTSX_STAT_RUN);
2739
2740        if (srb->cmnd[8] & 0x01)
2741                quick_format = false;
2742        else
2743                quick_format = true;
2744
2745        if (!(chip->card_ready & MS_CARD)) {
2746                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2747                return TRANSPORT_FAILED;
2748        }
2749
2750        if (chip->card_wp & MS_CARD) {
2751                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
2752                return TRANSPORT_FAILED;
2753        }
2754
2755        if (!CHK_MSPRO(ms_card)) {
2756                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2757                return TRANSPORT_FAILED;
2758        }
2759
2760        retval = mspro_format(srb, chip, MS_SHORT_DATA_LEN, quick_format);
2761        if (retval != STATUS_SUCCESS) {
2762                set_sense_type(chip, lun, SENSE_TYPE_FORMAT_CMD_FAILED);
2763                return TRANSPORT_FAILED;
2764        }
2765
2766        scsi_set_resid(srb, 0);
2767        return TRANSPORT_GOOD;
2768}
2769
2770#ifdef SUPPORT_PCGL_1P18
2771static int get_ms_information(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2772{
2773        struct ms_info *ms_card = &chip->ms_card;
2774        unsigned int lun = SCSI_LUN(srb);
2775        u8 dev_info_id, data_len;
2776        u8 *buf;
2777        unsigned int buf_len;
2778        int i;
2779
2780        if (!check_card_ready(chip, lun)) {
2781                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2782                return TRANSPORT_FAILED;
2783        }
2784        if (get_lun_card(chip, lun) != MS_CARD) {
2785                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2786                return TRANSPORT_FAILED;
2787        }
2788
2789        if ((srb->cmnd[2] != 0xB0) || (srb->cmnd[4] != 0x4D) ||
2790            (srb->cmnd[5] != 0x53) || (srb->cmnd[6] != 0x49) ||
2791            (srb->cmnd[7] != 0x44)) {
2792                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2793                return TRANSPORT_FAILED;
2794        }
2795
2796        dev_info_id = srb->cmnd[3];
2797        if ((CHK_MSXC(ms_card) && (dev_info_id == 0x10)) ||
2798            (!CHK_MSXC(ms_card) && (dev_info_id == 0x13)) ||
2799            !CHK_MSPRO(ms_card)) {
2800                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2801                return TRANSPORT_FAILED;
2802        }
2803
2804        if (dev_info_id == 0x15) {
2805                buf_len = 0x3A;
2806                data_len = 0x3A;
2807        } else {
2808                buf_len = 0x6A;
2809                data_len = 0x6A;
2810        }
2811
2812        buf = kmalloc(buf_len, GFP_KERNEL);
2813        if (!buf)
2814                return TRANSPORT_ERROR;
2815
2816        i = 0;
2817        /*  GET Memory Stick Media Information Response Header */
2818        buf[i++] = 0x00;                /* Data length MSB */
2819        buf[i++] = data_len;            /* Data length LSB */
2820        /* Device Information Type Code */
2821        if (CHK_MSXC(ms_card))
2822                buf[i++] = 0x03;
2823        else
2824                buf[i++] = 0x02;
2825
2826        /* SGM bit */
2827        buf[i++] = 0x01;
2828        /* Reserved */
2829        buf[i++] = 0x00;
2830        buf[i++] = 0x00;
2831        buf[i++] = 0x00;
2832        /* Number of Device Information */
2833        buf[i++] = 0x01;
2834
2835        /*  Device Information Body */
2836
2837        /* Device Information ID Number */
2838        buf[i++] = dev_info_id;
2839        /* Device Information Length */
2840        if (dev_info_id == 0x15)
2841                data_len = 0x31;
2842        else
2843                data_len = 0x61;
2844
2845        buf[i++] = 0x00;                /* Data length MSB */
2846        buf[i++] = data_len;            /* Data length LSB */
2847        /* Valid Bit */
2848        buf[i++] = 0x80;
2849        if ((dev_info_id == 0x10) || (dev_info_id == 0x13)) {
2850                /* System Information */
2851                memcpy(buf + i, ms_card->raw_sys_info, 96);
2852        } else {
2853                /* Model Name */
2854                memcpy(buf + i, ms_card->raw_model_name, 48);
2855        }
2856
2857        rtsx_stor_set_xfer_buf(buf, buf_len, srb);
2858
2859        if (dev_info_id == 0x15)
2860                scsi_set_resid(srb, scsi_bufflen(srb) - 0x3C);
2861        else
2862                scsi_set_resid(srb, scsi_bufflen(srb) - 0x6C);
2863
2864        kfree(buf);
2865        return STATUS_SUCCESS;
2866}
2867#endif
2868
2869static int ms_sp_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2870{
2871        int retval = TRANSPORT_ERROR;
2872
2873        if (srb->cmnd[2] == MS_FORMAT)
2874                retval = ms_format_cmnd(srb, chip);
2875#ifdef SUPPORT_PCGL_1P18
2876        else if (srb->cmnd[2] == GET_MS_INFORMATION)
2877                retval = get_ms_information(srb, chip);
2878#endif
2879
2880        return retval;
2881}
2882
2883#ifdef SUPPORT_CPRM
2884static int sd_extension_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2885{
2886        unsigned int lun = SCSI_LUN(srb);
2887        int result;
2888
2889        rtsx_disable_aspm(chip);
2890
2891        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2892                rtsx_exit_ss(chip);
2893                wait_timeout(100);
2894        }
2895        rtsx_set_stat(chip, RTSX_STAT_RUN);
2896
2897        sd_cleanup_work(chip);
2898
2899        if (!check_card_ready(chip, lun)) {
2900                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2901                return TRANSPORT_FAILED;
2902        }
2903        if (get_lun_card(chip, lun) != SD_CARD) {
2904                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2905                return TRANSPORT_FAILED;
2906        }
2907
2908        switch (srb->cmnd[0]) {
2909        case SD_PASS_THRU_MODE:
2910                result = sd_pass_thru_mode(srb, chip);
2911                break;
2912
2913        case SD_EXECUTE_NO_DATA:
2914                result = sd_execute_no_data(srb, chip);
2915                break;
2916
2917        case SD_EXECUTE_READ:
2918                result = sd_execute_read_data(srb, chip);
2919                break;
2920
2921        case SD_EXECUTE_WRITE:
2922                result = sd_execute_write_data(srb, chip);
2923                break;
2924
2925        case SD_GET_RSP:
2926                result = sd_get_cmd_rsp(srb, chip);
2927                break;
2928
2929        case SD_HW_RST:
2930                result = sd_hw_rst(srb, chip);
2931                break;
2932
2933        default:
2934                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2935                return TRANSPORT_FAILED;
2936        }
2937
2938        return result;
2939}
2940#endif
2941
2942#ifdef SUPPORT_MAGIC_GATE
2943static int mg_report_key(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2944{
2945        struct ms_info *ms_card = &chip->ms_card;
2946        unsigned int lun = SCSI_LUN(srb);
2947        int retval;
2948        u8 key_format;
2949
2950        rtsx_disable_aspm(chip);
2951
2952        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2953                rtsx_exit_ss(chip);
2954                wait_timeout(100);
2955        }
2956        rtsx_set_stat(chip, RTSX_STAT_RUN);
2957
2958        ms_cleanup_work(chip);
2959
2960        if (!check_card_ready(chip, lun)) {
2961                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2962                return TRANSPORT_FAILED;
2963        }
2964        if (get_lun_card(chip, lun) != MS_CARD) {
2965                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2966                return TRANSPORT_FAILED;
2967        }
2968
2969        if (srb->cmnd[7] != KC_MG_R_PRO) {
2970                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2971                return TRANSPORT_FAILED;
2972        }
2973
2974        if (!CHK_MSPRO(ms_card)) {
2975                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
2976                return TRANSPORT_FAILED;
2977        }
2978
2979        key_format = srb->cmnd[10] & 0x3F;
2980        dev_dbg(rtsx_dev(chip), "key_format = 0x%x\n", key_format);
2981
2982        switch (key_format) {
2983        case KF_GET_LOC_EKB:
2984                if ((scsi_bufflen(srb) == 0x41C) &&
2985                    (srb->cmnd[8] == 0x04) &&
2986                    (srb->cmnd[9] == 0x1C)) {
2987                        retval = mg_get_local_EKB(srb, chip);
2988                        if (retval != STATUS_SUCCESS)
2989                                return TRANSPORT_FAILED;
2990
2991                } else {
2992                        set_sense_type(chip, lun,
2993                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2994                        return TRANSPORT_FAILED;
2995                }
2996                break;
2997
2998        case KF_RSP_CHG:
2999                if ((scsi_bufflen(srb) == 0x24) &&
3000                    (srb->cmnd[8] == 0x00) &&
3001                    (srb->cmnd[9] == 0x24)) {
3002                        retval = mg_get_rsp_chg(srb, chip);
3003                        if (retval != STATUS_SUCCESS)
3004                                return TRANSPORT_FAILED;
3005
3006                } else {
3007                        set_sense_type(chip, lun,
3008                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3009                        return TRANSPORT_FAILED;
3010                }
3011                break;
3012
3013        case KF_GET_ICV:
3014                ms_card->mg_entry_num = srb->cmnd[5];
3015                if ((scsi_bufflen(srb) == 0x404) &&
3016                    (srb->cmnd[8] == 0x04) &&
3017                    (srb->cmnd[9] == 0x04) &&
3018                    (srb->cmnd[2] == 0x00) &&
3019                    (srb->cmnd[3] == 0x00) &&
3020                    (srb->cmnd[4] == 0x00) &&
3021                    (srb->cmnd[5] < 32)) {
3022                        retval = mg_get_ICV(srb, chip);
3023                        if (retval != STATUS_SUCCESS)
3024                                return TRANSPORT_FAILED;
3025
3026                } else {
3027                        set_sense_type(chip, lun,
3028                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3029                        return TRANSPORT_FAILED;
3030                }
3031                break;
3032
3033        default:
3034                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3035                return TRANSPORT_FAILED;
3036        }
3037
3038        scsi_set_resid(srb, 0);
3039        return TRANSPORT_GOOD;
3040}
3041
3042static int mg_send_key(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3043{
3044        struct ms_info *ms_card = &chip->ms_card;
3045        unsigned int lun = SCSI_LUN(srb);
3046        int retval;
3047        u8 key_format;
3048
3049        rtsx_disable_aspm(chip);
3050
3051        if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
3052                rtsx_exit_ss(chip);
3053                wait_timeout(100);
3054        }
3055        rtsx_set_stat(chip, RTSX_STAT_RUN);
3056
3057        ms_cleanup_work(chip);
3058
3059        if (!check_card_ready(chip, lun)) {
3060                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
3061                return TRANSPORT_FAILED;
3062        }
3063        if (check_card_wp(chip, lun)) {
3064                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
3065                return TRANSPORT_FAILED;
3066        }
3067        if (get_lun_card(chip, lun) != MS_CARD) {
3068                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
3069                return TRANSPORT_FAILED;
3070        }
3071
3072        if (srb->cmnd[7] != KC_MG_R_PRO) {
3073                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3074                return TRANSPORT_FAILED;
3075        }
3076
3077        if (!CHK_MSPRO(ms_card)) {
3078                set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3079                return TRANSPORT_FAILED;
3080        }
3081
3082        key_format = srb->cmnd[10] & 0x3F;
3083        dev_dbg(rtsx_dev(chip), "key_format = 0x%x\n", key_format);
3084
3085        switch (key_format) {
3086        case KF_SET_LEAF_ID:
3087                if ((scsi_bufflen(srb) == 0x0C) &&
3088                    (srb->cmnd[8] == 0x00) &&
3089                    (srb->cmnd[9] == 0x0C)) {
3090                        retval = mg_set_leaf_id(srb, chip);
3091                        if (retval != STATUS_SUCCESS)
3092                                return TRANSPORT_FAILED;
3093
3094                } else {
3095                        set_sense_type(chip, lun,
3096                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3097                        return TRANSPORT_FAILED;
3098                }
3099                break;
3100
3101        case KF_CHG_HOST:
3102                if ((scsi_bufflen(srb) == 0x0C) &&
3103                    (srb->cmnd[8] == 0x00) &&
3104                    (srb->cmnd[9] == 0x0C)) {
3105                        retval = mg_chg(srb, chip);
3106                        if (retval != STATUS_SUCCESS)
3107                                return TRANSPORT_FAILED;
3108
3109                } else {
3110                        set_sense_type(chip, lun,
3111                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3112                        return TRANSPORT_FAILED;
3113                }
3114                break;
3115
3116        case KF_RSP_HOST:
3117                if ((scsi_bufflen(srb) == 0x0C) &&
3118                    (srb->cmnd[8] == 0x00) &&
3119                    (srb->cmnd[9] == 0x0C)) {
3120                        retval = mg_rsp(srb, chip);
3121                        if (retval != STATUS_SUCCESS)
3122                                return TRANSPORT_FAILED;
3123
3124                } else {
3125                        set_sense_type(chip, lun,
3126                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3127                        return TRANSPORT_FAILED;
3128                }
3129                break;
3130
3131        case KF_SET_ICV:
3132                ms_card->mg_entry_num = srb->cmnd[5];
3133                if ((scsi_bufflen(srb) == 0x404) &&
3134                    (srb->cmnd[8] == 0x04) &&
3135                    (srb->cmnd[9] == 0x04) &&
3136                    (srb->cmnd[2] == 0x00) &&
3137                    (srb->cmnd[3] == 0x00) &&
3138                    (srb->cmnd[4] == 0x00) &&
3139                    (srb->cmnd[5] < 32)) {
3140                        retval = mg_set_ICV(srb, chip);
3141                        if (retval != STATUS_SUCCESS)
3142                                return TRANSPORT_FAILED;
3143
3144                } else {
3145                        set_sense_type(chip, lun,
3146                                       SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3147                        return TRANSPORT_FAILED;
3148                }
3149                break;
3150
3151        default:
3152                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3153                return TRANSPORT_FAILED;
3154        }
3155
3156        scsi_set_resid(srb, 0);
3157        return TRANSPORT_GOOD;
3158}
3159#endif
3160
3161int rtsx_scsi_handler(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3162{
3163#ifdef SUPPORT_SD_LOCK
3164        struct sd_info *sd_card = &chip->sd_card;
3165#endif
3166        struct ms_info *ms_card = &chip->ms_card;
3167        unsigned int lun = SCSI_LUN(srb);
3168        int result;
3169
3170#ifdef SUPPORT_SD_LOCK
3171        if (sd_card->sd_erase_status) {
3172                /* Block all SCSI command except for
3173                 * REQUEST_SENSE and rs_ppstatus
3174                 */
3175                if (!((srb->cmnd[0] == VENDOR_CMND) &&
3176                      (srb->cmnd[1] == SCSI_APP_CMD) &&
3177                      (srb->cmnd[2] == GET_DEV_STATUS)) &&
3178                      (srb->cmnd[0] != REQUEST_SENSE)) {
3179                        /* Logical Unit Not Ready Format in Progress */
3180                        set_sense_data(chip, lun, CUR_ERR,
3181                                       0x02, 0, 0x04, 0x04, 0, 0);
3182                        return TRANSPORT_FAILED;
3183                }
3184        }
3185#endif
3186
3187        if ((get_lun_card(chip, lun) == MS_CARD) &&
3188            (ms_card->format_status == FORMAT_IN_PROGRESS)) {
3189                if ((srb->cmnd[0] != REQUEST_SENSE) &&
3190                    (srb->cmnd[0] != INQUIRY)) {
3191                        /* Logical Unit Not Ready Format in Progress */
3192                        set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04,
3193                                       0, (u16)(ms_card->progress));
3194                        return TRANSPORT_FAILED;
3195                }
3196        }
3197
3198        switch (srb->cmnd[0]) {
3199        case READ_10:
3200        case WRITE_10:
3201        case READ_6:
3202        case WRITE_6:
3203                result = read_write(srb, chip);
3204#if !defined(LED_AUTO_BLINK) && !defined(REGULAR_BLINK)
3205                led_shine(srb, chip);
3206#endif
3207                break;
3208
3209        case TEST_UNIT_READY:
3210                result = test_unit_ready(srb, chip);
3211                break;
3212
3213        case INQUIRY:
3214                result = inquiry(srb, chip);
3215                break;
3216
3217        case READ_CAPACITY:
3218                result = read_capacity(srb, chip);
3219                break;
3220
3221        case START_STOP:
3222                result = start_stop_unit(srb, chip);
3223                break;
3224
3225        case ALLOW_MEDIUM_REMOVAL:
3226                result = allow_medium_removal(srb, chip);
3227                break;
3228
3229        case REQUEST_SENSE:
3230                result = request_sense(srb, chip);
3231                break;
3232
3233        case MODE_SENSE:
3234        case MODE_SENSE_10:
3235                result = mode_sense(srb, chip);
3236                break;
3237
3238        case 0x23:
3239                result = read_format_capacity(srb, chip);
3240                break;
3241
3242        case VENDOR_CMND:
3243                result = vendor_cmnd(srb, chip);
3244                break;
3245
3246        case MS_SP_CMND:
3247                result = ms_sp_cmnd(srb, chip);
3248                break;
3249
3250#ifdef SUPPORT_CPRM
3251        case SD_PASS_THRU_MODE:
3252        case SD_EXECUTE_NO_DATA:
3253        case SD_EXECUTE_READ:
3254        case SD_EXECUTE_WRITE:
3255        case SD_GET_RSP:
3256        case SD_HW_RST:
3257                result = sd_extension_cmnd(srb, chip);
3258                break;
3259#endif
3260
3261#ifdef SUPPORT_MAGIC_GATE
3262        case CMD_MSPRO_MG_RKEY:
3263                result = mg_report_key(srb, chip);
3264                break;
3265
3266        case CMD_MSPRO_MG_SKEY:
3267                result = mg_send_key(srb, chip);
3268                break;
3269#endif
3270
3271        case FORMAT_UNIT:
3272        case MODE_SELECT:
3273        case VERIFY:
3274                result = TRANSPORT_GOOD;
3275                break;
3276
3277        default:
3278                set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3279                result = TRANSPORT_FAILED;
3280        }
3281
3282        return result;
3283}
3284