root/drivers/staging/rts5208/rtsx_scsi.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. scsi_show_command
  2. set_sense_type
  3. set_sense_data
  4. test_unit_ready
  5. inquiry
  6. start_stop_unit
  7. allow_medium_removal
  8. request_sense
  9. ms_mode_sense
  10. mode_sense
  11. read_write
  12. read_format_capacity
  13. read_capacity
  14. read_eeprom
  15. write_eeprom
  16. read_mem
  17. write_mem
  18. get_sd_csd
  19. toggle_gpio_cmd
  20. read_host_reg
  21. write_host_reg
  22. set_variable
  23. get_variable
  24. dma_access_ring_buffer
  25. get_dev_status
  26. set_chip_mode
  27. rw_mem_cmd_buf
  28. suit_cmd
  29. read_phy_register
  30. write_phy_register
  31. erase_eeprom2
  32. read_eeprom2
  33. write_eeprom2
  34. read_efuse
  35. write_efuse
  36. read_cfg_byte
  37. write_cfg_byte
  38. app_cmd
  39. read_status
  40. get_card_bus_width
  41. spi_vendor_cmd
  42. vendor_cmnd
  43. led_shine
  44. ms_format_cmnd
  45. get_ms_information
  46. ms_sp_cmnd
  47. sd_extension_cmnd
  48. mg_report_key
  49. mg_send_key
  50. rtsx_scsi_handler

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

/* [<][>][^][v][top][bottom][index][help] */