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