1 /* Driver for Realtek PCI-Express card reader
3 * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2, or (at your option) any
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, see <http://www.gnu.org/licenses/>.
19 * Wei WANG (wei_wang@realsil.com.cn)
20 * Micky Ching (micky_ching@realsil.com.cn)
23 #include <linux/blkdev.h>
24 #include <linux/kthread.h>
25 #include <linux/sched.h>
26 #include <linux/vmalloc.h>
29 #include "rtsx_transport.h"
31 #include "rtsx_card.h"
32 #include "rtsx_chip.h"
33 #include "rtsx_scsi.h"
38 void scsi_show_command(struct rtsx_chip *chip)
40 struct scsi_cmnd *srb = chip->srb;
42 int unknown_cmd = 0, len;
44 switch (srb->cmnd[0]) {
46 what = "TEST_UNIT_READY";
52 what = "REQUEST_SENSE";
57 case READ_BLOCK_LIMITS:
58 what = "READ_BLOCK_LIMITS";
61 what = "REASSIGN_BLOCKS";
73 what = "READ_REVERSE";
76 what = "WRITE_FILEMARKS";
84 case RECOVER_BUFFERED_DATA:
85 what = "RECOVER_BUFFERED_DATA";
108 case RECEIVE_DIAGNOSTIC:
109 what = "RECEIVE_DIAGNOSTIC";
111 case SEND_DIAGNOSTIC:
112 what = "SEND_DIAGNOSTIC";
114 case ALLOW_MEDIUM_REMOVAL:
115 what = "ALLOW_MEDIUM_REMOVAL";
121 what = "READ_CAPACITY";
133 what = "WRITE_VERIFY";
139 what = "SEARCH_HIGH";
142 what = "SEARCH_EQUAL";
151 what = "READ_POSITION";
153 case SYNCHRONIZE_CACHE:
154 what = "SYNCHRONIZE_CACHE";
156 case LOCK_UNLOCK_CACHE:
157 what = "LOCK_UNLOCK_CACHE";
159 case READ_DEFECT_DATA:
160 what = "READ_DEFECT_DATA";
163 what = "MEDIUM_SCAN";
169 what = "COPY_VERIFY";
172 what = "WRITE_BUFFER";
175 what = "READ_BUFFER";
178 what = "UPDATE_BLOCK";
186 case CHANGE_DEFINITION:
187 what = "CHANGE_DEFINITION";
192 case GPCMD_READ_SUBCHANNEL:
193 what = "READ SUBCHANNEL";
198 case GPCMD_READ_HEADER:
199 what = "READ HEADER";
201 case GPCMD_PLAY_AUDIO_10:
202 what = "PLAY AUDIO (10)";
204 case GPCMD_PLAY_AUDIO_MSF:
205 what = "PLAY AUDIO MSF";
207 case GPCMD_GET_EVENT_STATUS_NOTIFICATION:
208 what = "GET EVENT/STATUS NOTIFICATION";
210 case GPCMD_PAUSE_RESUME:
211 what = "PAUSE/RESUME";
219 case GPCMD_STOP_PLAY_SCAN:
220 what = "STOP PLAY/SCAN";
222 case GPCMD_READ_DISC_INFO:
223 what = "READ DISC INFORMATION";
225 case GPCMD_READ_TRACK_RZONE_INFO:
226 what = "READ TRACK INFORMATION";
228 case GPCMD_RESERVE_RZONE_TRACK:
229 what = "RESERVE TRACK";
235 what = "MODE_SELECT_10";
237 case GPCMD_REPAIR_RZONE_TRACK:
238 what = "REPAIR TRACK";
241 what = "READ MASTER CUE";
244 what = "MODE_SENSE_10";
246 case GPCMD_CLOSE_TRACK:
247 what = "CLOSE TRACK/SESSION";
250 what = "READ BUFFER CAPACITY";
253 what = "SEND CUE SHEET";
259 what = "REPORT LUNS";
262 what = "MOVE_MEDIUM or PLAY AUDIO (12)";
270 case WRITE_VERIFY_12:
271 what = "WRITE_VERIFY_12";
274 what = "SEARCH_HIGH_12";
276 case SEARCH_EQUAL_12:
277 what = "SEARCH_EQUAL_12";
280 what = "SEARCH_LOW_12";
282 case SEND_VOLUME_TAG:
283 what = "SEND_VOLUME_TAG";
285 case READ_ELEMENT_STATUS:
286 what = "READ_ELEMENT_STATUS";
288 case GPCMD_READ_CD_MSF:
289 what = "READ CD MSF";
294 case GPCMD_SET_SPEED:
295 what = "SET CD SPEED";
297 case GPCMD_MECHANISM_STATUS:
298 what = "MECHANISM STATUS";
304 what = "WRITE CONTINUE";
307 what = "WRITE_LONG_2";
310 what = "Realtek's vendor command";
313 what = "(unknown command)"; unknown_cmd = 1;
317 if (srb->cmnd[0] != TEST_UNIT_READY)
318 dev_dbg(rtsx_dev(chip), "Command %s (%d bytes)\n",
322 len = min_t(unsigned short, srb->cmd_len, 16);
323 dev_dbg(rtsx_dev(chip), "%*ph\n", len, srb->cmnd);
327 void set_sense_type(struct rtsx_chip *chip, unsigned int lun, int sense_type)
329 switch (sense_type) {
330 case SENSE_TYPE_MEDIA_CHANGE:
331 set_sense_data(chip, lun, CUR_ERR, 0x06, 0, 0x28, 0, 0, 0);
334 case SENSE_TYPE_MEDIA_NOT_PRESENT:
335 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x3A, 0, 0, 0);
338 case SENSE_TYPE_MEDIA_LBA_OVER_RANGE:
339 set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x21, 0, 0, 0);
342 case SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT:
343 set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x25, 0, 0, 0);
346 case SENSE_TYPE_MEDIA_WRITE_PROTECT:
347 set_sense_data(chip, lun, CUR_ERR, 0x07, 0, 0x27, 0, 0, 0);
350 case SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR:
351 set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x11, 0, 0, 0);
354 case SENSE_TYPE_MEDIA_WRITE_ERR:
355 set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x0C, 0x02, 0, 0);
358 case SENSE_TYPE_MEDIA_INVALID_CMD_FIELD:
359 set_sense_data(chip, lun, CUR_ERR, ILGAL_REQ, 0,
360 ASC_INVLD_CDB, ASCQ_INVLD_CDB, CDB_ILLEGAL, 1);
363 case SENSE_TYPE_FORMAT_IN_PROGRESS:
364 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04, 0, 0);
367 case SENSE_TYPE_FORMAT_CMD_FAILED:
368 set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x31, 0x01, 0, 0);
371 #ifdef SUPPORT_MAGIC_GATE
372 case SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB:
373 set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x6F, 0x02, 0, 0);
376 case SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN:
377 set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x6F, 0x00, 0, 0);
380 case SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM:
381 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x30, 0x00, 0, 0);
384 case SENSE_TYPE_MG_WRITE_ERR:
385 set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x0C, 0x00, 0, 0);
389 #ifdef SUPPORT_SD_LOCK
390 case SENSE_TYPE_MEDIA_READ_FORBIDDEN:
391 set_sense_data(chip, lun, CUR_ERR, 0x07, 0, 0x11, 0x13, 0, 0);
395 case SENSE_TYPE_NO_SENSE:
397 set_sense_data(chip, lun, CUR_ERR, 0, 0, 0, 0, 0, 0);
402 void set_sense_data(struct rtsx_chip *chip, unsigned int lun, u8 err_code,
403 u8 sense_key, u32 info, u8 asc, u8 ascq, u8 sns_key_info0,
406 struct sense_data_t *sense = &(chip->sense_buffer[lun]);
408 sense->err_code = err_code;
409 sense->sense_key = sense_key;
410 sense->info[0] = (u8)(info >> 24);
411 sense->info[1] = (u8)(info >> 16);
412 sense->info[2] = (u8)(info >> 8);
413 sense->info[3] = (u8)info;
415 sense->ad_sense_len = sizeof(struct sense_data_t) - 8;
418 if (sns_key_info0 != 0) {
419 sense->sns_key_info[0] = SKSV | sns_key_info0;
420 sense->sns_key_info[1] = (sns_key_info1 & 0xf0) >> 8;
421 sense->sns_key_info[2] = sns_key_info1 & 0x0f;
425 static int test_unit_ready(struct scsi_cmnd *srb, struct rtsx_chip *chip)
427 unsigned int lun = SCSI_LUN(srb);
429 if (!check_card_ready(chip, lun)) {
430 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
431 return TRANSPORT_FAILED;
434 if (!(CHK_BIT(chip->lun_mc, lun))) {
435 SET_BIT(chip->lun_mc, lun);
436 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
437 return TRANSPORT_FAILED;
440 #ifdef SUPPORT_SD_LOCK
441 if (get_lun_card(chip, SCSI_LUN(srb)) == SD_CARD) {
442 struct sd_info *sd_card = &(chip->sd_card);
444 if (sd_card->sd_lock_notify) {
445 sd_card->sd_lock_notify = 0;
446 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
447 return TRANSPORT_FAILED;
448 } else if (sd_card->sd_lock_status & SD_LOCKED) {
449 set_sense_type(chip, lun,
450 SENSE_TYPE_MEDIA_READ_FORBIDDEN);
451 return TRANSPORT_FAILED;
456 return TRANSPORT_GOOD;
459 static unsigned char formatter_inquiry_str[20] = {
460 'M', 'E', 'M', 'O', 'R', 'Y', 'S', 'T', 'I', 'C', 'K',
461 #ifdef SUPPORT_MAGIC_GATE
462 '-', 'M', 'G', /* Byte[47:49] */
464 0x20, 0x20, 0x20, /* Byte[47:49] */
467 #ifdef SUPPORT_MAGIC_GATE
468 0x0B, /* Byte[50]: MG, MS, MSPro, MSXC */
470 0x09, /* Byte[50]: MS, MSPro, MSXC */
472 0x00, /* Byte[51]: Category Specific Commands */
473 0x00, /* Byte[52]: Access Control and feature */
474 0x20, 0x20, 0x20, /* Byte[53:55] */
477 static int inquiry(struct scsi_cmnd *srb, struct rtsx_chip *chip)
479 unsigned int lun = SCSI_LUN(srb);
480 char *inquiry_default = (char *)"Generic-xD/SD/M.S. 1.00 ";
481 char *inquiry_sdms = (char *)"Generic-SD/MemoryStick 1.00 ";
482 char *inquiry_sd = (char *)"Generic-SD/MMC 1.00 ";
483 char *inquiry_ms = (char *)"Generic-MemoryStick 1.00 ";
484 char *inquiry_string;
485 unsigned char sendbytes;
487 u8 card = get_lun_card(chip, lun);
488 int pro_formatter_flag = 0;
489 unsigned char inquiry_buf[] = {
490 QULIFIRE|DRCT_ACCESS_DEV,
497 REL_ADR|WBUS_32|WBUS_16|SYNC|LINKED|CMD_QUE|SFT_RE,
500 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
501 if (chip->lun2card[lun] == SD_CARD)
502 inquiry_string = inquiry_sd;
504 inquiry_string = inquiry_ms;
506 } else if (CHECK_LUN_MODE(chip, SD_MS_1LUN)) {
507 inquiry_string = inquiry_sdms;
509 inquiry_string = inquiry_default;
512 buf = vmalloc(scsi_bufflen(srb));
514 TRACE_RET(chip, TRANSPORT_ERROR);
516 #ifdef SUPPORT_MAGIC_GATE
517 if ((chip->mspro_formatter_enable) &&
518 (chip->lun2card[lun] & MS_CARD))
520 if (chip->mspro_formatter_enable)
523 if (!card || (card == MS_CARD))
524 pro_formatter_flag = 1;
527 if (pro_formatter_flag) {
528 if (scsi_bufflen(srb) < 56)
529 sendbytes = (unsigned char)(scsi_bufflen(srb));
534 if (scsi_bufflen(srb) < 36)
535 sendbytes = (unsigned char)(scsi_bufflen(srb));
541 memcpy(buf, inquiry_buf, 8);
542 memcpy(buf + 8, inquiry_string, sendbytes - 8);
543 if (pro_formatter_flag) {
544 /* Additional Length */
548 memcpy(buf, inquiry_buf, sendbytes);
551 if (pro_formatter_flag) {
553 memcpy(buf + 36, formatter_inquiry_str, sendbytes - 36);
556 scsi_set_resid(srb, 0);
558 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
561 return TRANSPORT_GOOD;
565 static int start_stop_unit(struct scsi_cmnd *srb, struct rtsx_chip *chip)
567 unsigned int lun = SCSI_LUN(srb);
569 scsi_set_resid(srb, scsi_bufflen(srb));
571 if (srb->cmnd[1] == 1)
572 return TRANSPORT_GOOD;
574 switch (srb->cmnd[0x4]) {
577 return TRANSPORT_GOOD;
580 /* Media shall be unload */
581 if (check_card_ready(chip, lun))
582 eject_card(chip, lun);
583 return TRANSPORT_GOOD;
585 case MAKE_MEDIUM_READY:
587 if (check_card_ready(chip, lun)) {
588 return TRANSPORT_GOOD;
590 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
591 TRACE_RET(chip, TRANSPORT_FAILED);
596 TRACE_RET(chip, TRANSPORT_ERROR);
600 static int allow_medium_removal(struct scsi_cmnd *srb, struct rtsx_chip *chip)
604 prevent = srb->cmnd[4] & 0x1;
606 scsi_set_resid(srb, 0);
609 set_sense_type(chip, SCSI_LUN(srb),
610 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
611 TRACE_RET(chip, TRANSPORT_FAILED);
614 return TRANSPORT_GOOD;
618 static int request_sense(struct scsi_cmnd *srb, struct rtsx_chip *chip)
620 struct sense_data_t *sense;
621 unsigned int lun = SCSI_LUN(srb);
622 struct ms_info *ms_card = &(chip->ms_card);
623 unsigned char *tmp, *buf;
625 sense = &(chip->sense_buffer[lun]);
627 if ((get_lun_card(chip, lun) == MS_CARD) &&
628 ms_card->pro_under_formatting) {
629 if (ms_card->format_status == FORMAT_SUCCESS) {
630 set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
631 ms_card->pro_under_formatting = 0;
632 ms_card->progress = 0;
633 } else if (ms_card->format_status == FORMAT_IN_PROGRESS) {
634 /* Logical Unit Not Ready Format in Progress */
635 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04,
636 0, (u16)(ms_card->progress));
638 /* Format Command Failed */
639 set_sense_type(chip, lun, SENSE_TYPE_FORMAT_CMD_FAILED);
640 ms_card->pro_under_formatting = 0;
641 ms_card->progress = 0;
644 rtsx_set_stat(chip, RTSX_STAT_RUN);
647 buf = vmalloc(scsi_bufflen(srb));
649 TRACE_RET(chip, TRANSPORT_ERROR);
651 tmp = (unsigned char *)sense;
652 memcpy(buf, tmp, scsi_bufflen(srb));
654 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
657 scsi_set_resid(srb, 0);
658 /* Reset Sense Data */
659 set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
660 return TRANSPORT_GOOD;
663 static void ms_mode_sense(struct rtsx_chip *chip, u8 cmd,
664 int lun, u8 *buf, int buf_len)
666 struct ms_info *ms_card = &(chip->ms_card);
668 int data_size = buf_len;
669 int support_format = 0;
672 if (cmd == MODE_SENSE) {
674 if (data_size > 0x68)
677 buf[i++] = 0x67; /* Mode Data Length */
679 sys_info_offset = 12;
680 if (data_size > 0x6C)
683 buf[i++] = 0x00; /* Mode Data Length (MSB) */
684 buf[i++] = 0x6A; /* Mode Data Length (LSB) */
687 /* Medium Type Code */
688 if (check_card_ready(chip, lun)) {
689 if (CHK_MSXC(ms_card)) {
692 } else if (CHK_MSPRO(ms_card)) {
700 if (check_card_wp(chip, lun))
706 buf[i++] = 0x00; /* MediaType */
707 buf[i++] = 0x00; /* WP */
710 buf[i++] = 0x00; /* Reserved */
712 if (cmd == MODE_SENSE_10) {
713 buf[i++] = 0x00; /* Reserved */
714 buf[i++] = 0x00; /* Block descriptor length(MSB) */
715 buf[i++] = 0x00; /* Block descriptor length(LSB) */
717 /* The Following Data is the content of "Page 0x20" */
719 buf[i++] = 0x20; /* Page Code */
721 buf[i++] = 0x62; /* Page Length */
723 buf[i++] = 0x00; /* No Access Control */
724 if (data_size >= 12) {
726 buf[i++] = 0xC0; /* SF, SGM */
731 /* The Following Data is the content of "Page 0x20" */
733 buf[i++] = 0x20; /* Page Code */
735 buf[i++] = 0x62; /* Page Length */
737 buf[i++] = 0x00; /* No Access Control */
738 if (data_size >= 8) {
740 buf[i++] = 0xC0; /* SF, SGM */
746 if (data_size > sys_info_offset) {
747 /* 96 Bytes Attribute Data */
748 int len = data_size - sys_info_offset;
750 len = (len < 96) ? len : 96;
752 memcpy(buf + sys_info_offset, ms_card->raw_sys_info, len);
756 static int mode_sense(struct scsi_cmnd *srb, struct rtsx_chip *chip)
758 unsigned int lun = SCSI_LUN(srb);
759 unsigned int dataSize;
761 int pro_formatter_flag;
762 unsigned char pageCode, *buf;
763 u8 card = get_lun_card(chip, lun);
765 #ifndef SUPPORT_MAGIC_GATE
766 if (!check_card_ready(chip, lun)) {
767 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
768 scsi_set_resid(srb, scsi_bufflen(srb));
769 TRACE_RET(chip, TRANSPORT_FAILED);
773 pro_formatter_flag = 0;
775 #ifdef SUPPORT_MAGIC_GATE
776 if ((chip->lun2card[lun] & MS_CARD)) {
777 if (!card || (card == MS_CARD)) {
779 if (chip->mspro_formatter_enable)
780 pro_formatter_flag = 1;
784 if (card == MS_CARD) {
785 if (chip->mspro_formatter_enable) {
786 pro_formatter_flag = 1;
792 buf = kmalloc(dataSize, GFP_KERNEL);
794 TRACE_RET(chip, TRANSPORT_ERROR);
796 pageCode = srb->cmnd[2] & 0x3f;
798 if ((pageCode == 0x3F) || (pageCode == 0x1C) ||
799 (pageCode == 0x00) ||
800 (pro_formatter_flag && (pageCode == 0x20))) {
801 if (srb->cmnd[0] == MODE_SENSE) {
802 if ((pageCode == 0x3F) || (pageCode == 0x20)) {
803 ms_mode_sense(chip, srb->cmnd[0],
809 if (check_card_wp(chip, lun))
817 if ((pageCode == 0x3F) || (pageCode == 0x20)) {
818 ms_mode_sense(chip, srb->cmnd[0],
825 if (check_card_wp(chip, lun))
835 status = TRANSPORT_GOOD;
837 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
838 scsi_set_resid(srb, scsi_bufflen(srb));
839 status = TRANSPORT_FAILED;
842 if (status == TRANSPORT_GOOD) {
843 unsigned int len = min_t(unsigned int, scsi_bufflen(srb),
845 rtsx_stor_set_xfer_buf(buf, len, srb);
846 scsi_set_resid(srb, scsi_bufflen(srb) - len);
853 static int read_write(struct scsi_cmnd *srb, struct rtsx_chip *chip)
855 #ifdef SUPPORT_SD_LOCK
856 struct sd_info *sd_card = &(chip->sd_card);
858 unsigned int lun = SCSI_LUN(srb);
863 rtsx_disable_aspm(chip);
865 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
869 rtsx_set_stat(chip, RTSX_STAT_RUN);
871 if (!check_card_ready(chip, lun) || (get_card_size(chip, lun) == 0)) {
872 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
873 TRACE_RET(chip, TRANSPORT_FAILED);
876 if (!(CHK_BIT(chip->lun_mc, lun))) {
877 SET_BIT(chip->lun_mc, lun);
878 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
879 return TRANSPORT_FAILED;
882 #ifdef SUPPORT_SD_LOCK
883 if (sd_card->sd_erase_status) {
884 /* Accessing to any card is forbidden
885 * until the erase procedure of SD is completed
887 dev_dbg(rtsx_dev(chip), "SD card being erased!\n");
888 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_READ_FORBIDDEN);
889 TRACE_RET(chip, TRANSPORT_FAILED);
892 if (get_lun_card(chip, lun) == SD_CARD) {
893 if (sd_card->sd_lock_status & SD_LOCKED) {
894 dev_dbg(rtsx_dev(chip), "SD card locked!\n");
895 set_sense_type(chip, lun,
896 SENSE_TYPE_MEDIA_READ_FORBIDDEN);
897 TRACE_RET(chip, TRANSPORT_FAILED);
902 if ((srb->cmnd[0] == READ_10) || (srb->cmnd[0] == WRITE_10)) {
903 start_sec = ((u32)srb->cmnd[2] << 24) |
904 ((u32)srb->cmnd[3] << 16) |
905 ((u32)srb->cmnd[4] << 8) | ((u32)srb->cmnd[5]);
906 sec_cnt = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
907 } else if ((srb->cmnd[0] == READ_6) || (srb->cmnd[0] == WRITE_6)) {
908 start_sec = ((u32)(srb->cmnd[1] & 0x1F) << 16) |
909 ((u32)srb->cmnd[2] << 8) | ((u32)srb->cmnd[3]);
910 sec_cnt = srb->cmnd[4];
911 } else if ((srb->cmnd[0] == VENDOR_CMND) &&
912 (srb->cmnd[1] == SCSI_APP_CMD) &&
913 ((srb->cmnd[2] == PP_READ10) || (srb->cmnd[2] == PP_WRITE10))) {
914 start_sec = ((u32)srb->cmnd[4] << 24) |
915 ((u32)srb->cmnd[5] << 16) |
916 ((u32)srb->cmnd[6] << 8) | ((u32)srb->cmnd[7]);
917 sec_cnt = ((u16)(srb->cmnd[9]) << 8) | srb->cmnd[10];
919 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
920 TRACE_RET(chip, TRANSPORT_FAILED);
923 /* In some test, we will receive a start_sec like 0xFFFFFFFF.
924 * In this situation, start_sec + sec_cnt will overflow, so we
925 * need to judge start_sec at first
927 if ((start_sec > get_card_size(chip, lun)) ||
928 ((start_sec + sec_cnt) > get_card_size(chip, lun))) {
929 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LBA_OVER_RANGE);
930 TRACE_RET(chip, TRANSPORT_FAILED);
934 scsi_set_resid(srb, 0);
935 return TRANSPORT_GOOD;
938 if (chip->rw_fail_cnt[lun] == 3) {
939 dev_dbg(rtsx_dev(chip), "read/write fail three times in succession\n");
940 if (srb->sc_data_direction == DMA_FROM_DEVICE)
941 set_sense_type(chip, lun,
942 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
944 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
946 TRACE_RET(chip, TRANSPORT_FAILED);
949 if (srb->sc_data_direction == DMA_TO_DEVICE) {
950 if (check_card_wp(chip, lun)) {
951 dev_dbg(rtsx_dev(chip), "Write protected card!\n");
952 set_sense_type(chip, lun,
953 SENSE_TYPE_MEDIA_WRITE_PROTECT);
954 TRACE_RET(chip, TRANSPORT_FAILED);
958 retval = card_rw(srb, chip, start_sec, sec_cnt);
959 if (retval != STATUS_SUCCESS) {
960 if (chip->need_release & chip->lun2card[lun]) {
961 chip->rw_fail_cnt[lun] = 0;
962 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
964 chip->rw_fail_cnt[lun]++;
965 if (srb->sc_data_direction == DMA_FROM_DEVICE)
966 set_sense_type(chip, lun,
967 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
969 set_sense_type(chip, lun,
970 SENSE_TYPE_MEDIA_WRITE_ERR);
972 retval = TRANSPORT_FAILED;
973 TRACE_GOTO(chip, Exit);
975 chip->rw_fail_cnt[lun] = 0;
976 retval = TRANSPORT_GOOD;
979 scsi_set_resid(srb, 0);
985 static int read_format_capacity(struct scsi_cmnd *srb, struct rtsx_chip *chip)
988 unsigned int lun = SCSI_LUN(srb);
989 unsigned int buf_len;
990 u8 card = get_lun_card(chip, lun);
995 if (!check_card_ready(chip, lun)) {
996 if (!chip->mspro_formatter_enable) {
997 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
998 TRACE_RET(chip, TRANSPORT_FAILED);
1002 buf_len = (scsi_bufflen(srb) > 12) ? 0x14 : 12;
1004 buf = kmalloc(buf_len, GFP_KERNEL);
1006 TRACE_RET(chip, TRANSPORT_ERROR);
1012 /* Capacity List Length */
1013 if ((buf_len > 12) && chip->mspro_formatter_enable &&
1014 (chip->lun2card[lun] & MS_CARD) &&
1015 (!card || (card == MS_CARD))) {
1024 if (check_card_ready(chip, lun)) {
1025 card_size = get_card_size(chip, lun);
1026 buf[i++] = (unsigned char)(card_size >> 24);
1027 buf[i++] = (unsigned char)(card_size >> 16);
1028 buf[i++] = (unsigned char)(card_size >> 8);
1029 buf[i++] = (unsigned char)card_size;
1054 buf_len = min_t(unsigned int, scsi_bufflen(srb), buf_len);
1055 rtsx_stor_set_xfer_buf(buf, buf_len, srb);
1058 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
1060 return TRANSPORT_GOOD;
1063 static int read_capacity(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1066 unsigned int lun = SCSI_LUN(srb);
1069 if (!check_card_ready(chip, lun)) {
1070 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1071 TRACE_RET(chip, TRANSPORT_FAILED);
1074 if (!(CHK_BIT(chip->lun_mc, lun))) {
1075 SET_BIT(chip->lun_mc, lun);
1076 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
1077 return TRANSPORT_FAILED;
1080 buf = kmalloc(8, GFP_KERNEL);
1082 TRACE_RET(chip, TRANSPORT_ERROR);
1084 card_size = get_card_size(chip, lun);
1085 buf[0] = (unsigned char)((card_size - 1) >> 24);
1086 buf[1] = (unsigned char)((card_size - 1) >> 16);
1087 buf[2] = (unsigned char)((card_size - 1) >> 8);
1088 buf[3] = (unsigned char)(card_size - 1);
1095 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
1098 scsi_set_resid(srb, 0);
1100 return TRANSPORT_GOOD;
1103 static int read_eeprom(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1105 unsigned short len, i;
1109 rtsx_disable_aspm(chip);
1111 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1115 rtsx_set_stat(chip, RTSX_STAT_RUN);
1117 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1121 TRACE_RET(chip, TRANSPORT_ERROR);
1123 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1124 if (retval != STATUS_SUCCESS) {
1126 set_sense_type(chip, SCSI_LUN(srb),
1127 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1128 TRACE_RET(chip, TRANSPORT_FAILED);
1131 for (i = 0; i < len; i++) {
1132 retval = spi_read_eeprom(chip, i, buf + i);
1133 if (retval != STATUS_SUCCESS) {
1135 set_sense_type(chip, SCSI_LUN(srb),
1136 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1137 TRACE_RET(chip, TRANSPORT_FAILED);
1141 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
1142 rtsx_stor_set_xfer_buf(buf, len, srb);
1143 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1147 return TRANSPORT_GOOD;
1150 static int write_eeprom(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1152 unsigned short len, i;
1156 rtsx_disable_aspm(chip);
1158 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1162 rtsx_set_stat(chip, RTSX_STAT_RUN);
1164 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1166 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1167 if (retval != STATUS_SUCCESS) {
1168 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1169 TRACE_RET(chip, TRANSPORT_FAILED);
1173 retval = spi_erase_eeprom_chip(chip);
1174 if (retval != STATUS_SUCCESS) {
1175 set_sense_type(chip, SCSI_LUN(srb),
1176 SENSE_TYPE_MEDIA_WRITE_ERR);
1177 TRACE_RET(chip, TRANSPORT_FAILED);
1180 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb),
1184 TRACE_RET(chip, TRANSPORT_ERROR);
1186 rtsx_stor_get_xfer_buf(buf, len, srb);
1187 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1189 for (i = 0; i < len; i++) {
1190 retval = spi_write_eeprom(chip, i, buf[i]);
1191 if (retval != STATUS_SUCCESS) {
1193 set_sense_type(chip, SCSI_LUN(srb),
1194 SENSE_TYPE_MEDIA_WRITE_ERR);
1195 TRACE_RET(chip, TRANSPORT_FAILED);
1202 return TRANSPORT_GOOD;
1205 static int read_mem(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1207 unsigned short addr, len, i;
1211 rtsx_disable_aspm(chip);
1213 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1217 rtsx_set_stat(chip, RTSX_STAT_RUN);
1219 addr = ((u16)srb->cmnd[2] << 8) | srb->cmnd[3];
1220 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1222 if (addr < 0xFC00) {
1223 set_sense_type(chip, SCSI_LUN(srb),
1224 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1225 TRACE_RET(chip, TRANSPORT_FAILED);
1230 TRACE_RET(chip, TRANSPORT_ERROR);
1232 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1233 if (retval != STATUS_SUCCESS) {
1235 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1236 TRACE_RET(chip, TRANSPORT_FAILED);
1239 for (i = 0; i < len; i++) {
1240 retval = rtsx_read_register(chip, addr + i, buf + i);
1241 if (retval != STATUS_SUCCESS) {
1243 set_sense_type(chip, SCSI_LUN(srb),
1244 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1245 TRACE_RET(chip, TRANSPORT_FAILED);
1249 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
1250 rtsx_stor_set_xfer_buf(buf, len, srb);
1251 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1255 return TRANSPORT_GOOD;
1258 static int write_mem(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1260 unsigned short addr, len, i;
1264 rtsx_disable_aspm(chip);
1266 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1270 rtsx_set_stat(chip, RTSX_STAT_RUN);
1272 addr = ((u16)srb->cmnd[2] << 8) | srb->cmnd[3];
1273 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1275 if (addr < 0xFC00) {
1276 set_sense_type(chip, SCSI_LUN(srb),
1277 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1278 TRACE_RET(chip, TRANSPORT_FAILED);
1281 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
1284 TRACE_RET(chip, TRANSPORT_ERROR);
1286 rtsx_stor_get_xfer_buf(buf, len, srb);
1287 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1289 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1290 if (retval != STATUS_SUCCESS) {
1292 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1293 TRACE_RET(chip, TRANSPORT_FAILED);
1296 for (i = 0; i < len; i++) {
1297 retval = rtsx_write_register(chip, addr + i, 0xFF, buf[i]);
1298 if (retval != STATUS_SUCCESS) {
1300 set_sense_type(chip, SCSI_LUN(srb),
1301 SENSE_TYPE_MEDIA_WRITE_ERR);
1302 TRACE_RET(chip, TRANSPORT_FAILED);
1308 return TRANSPORT_GOOD;
1311 static int get_sd_csd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1313 struct sd_info *sd_card = &(chip->sd_card);
1314 unsigned int lun = SCSI_LUN(srb);
1316 if (!check_card_ready(chip, lun)) {
1317 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1318 TRACE_RET(chip, TRANSPORT_FAILED);
1321 if (get_lun_card(chip, lun) != SD_CARD) {
1322 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1323 TRACE_RET(chip, TRANSPORT_FAILED);
1326 scsi_set_resid(srb, 0);
1327 rtsx_stor_set_xfer_buf(sd_card->raw_csd, scsi_bufflen(srb), srb);
1329 return TRANSPORT_GOOD;
1332 static int toggle_gpio_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1334 u8 gpio = srb->cmnd[2];
1336 rtsx_disable_aspm(chip);
1338 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1342 rtsx_set_stat(chip, RTSX_STAT_RUN);
1346 toggle_gpio(chip, gpio);
1348 return TRANSPORT_GOOD;
1352 static int trace_msg_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1354 unsigned char *ptr, *buf = NULL;
1357 unsigned int buf_len;
1359 buf_len = 4 + ((2 + MSG_FUNC_LEN + MSG_FILE_LEN + TIME_VAL_LEN) *
1362 if ((scsi_bufflen(srb) < buf_len) || (scsi_sglist(srb) == NULL)) {
1363 set_sense_type(chip, SCSI_LUN(srb),
1364 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1365 TRACE_RET(chip, TRANSPORT_FAILED);
1368 clear = srb->cmnd[2];
1370 buf = vmalloc(scsi_bufflen(srb));
1372 TRACE_RET(chip, TRANSPORT_ERROR);
1375 if (chip->trace_msg[chip->msg_idx].valid)
1376 msg_cnt = TRACE_ITEM_CNT;
1378 msg_cnt = chip->msg_idx;
1380 *(ptr++) = (u8)(msg_cnt >> 24);
1381 *(ptr++) = (u8)(msg_cnt >> 16);
1382 *(ptr++) = (u8)(msg_cnt >> 8);
1383 *(ptr++) = (u8)msg_cnt;
1384 dev_dbg(rtsx_dev(chip), "Trace message count is %d\n", msg_cnt);
1386 for (i = 1; i <= msg_cnt; i++) {
1389 idx = chip->msg_idx - i;
1391 idx += TRACE_ITEM_CNT;
1393 *(ptr++) = (u8)(chip->trace_msg[idx].line >> 8);
1394 *(ptr++) = (u8)(chip->trace_msg[idx].line);
1395 for (j = 0; j < MSG_FUNC_LEN; j++)
1396 *(ptr++) = chip->trace_msg[idx].func[j];
1398 for (j = 0; j < MSG_FILE_LEN; j++)
1399 *(ptr++) = chip->trace_msg[idx].file[j];
1401 for (j = 0; j < TIME_VAL_LEN; j++)
1402 *(ptr++) = chip->trace_msg[idx].timeval_buf[j];
1405 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
1410 for (i = 0; i < TRACE_ITEM_CNT; i++)
1411 chip->trace_msg[i].valid = 0;
1414 scsi_set_resid(srb, 0);
1415 return TRANSPORT_GOOD;
1419 static int read_host_reg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1425 rtsx_disable_aspm(chip);
1427 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1431 rtsx_set_stat(chip, RTSX_STAT_RUN);
1433 addr = srb->cmnd[4];
1435 val = rtsx_readl(chip, addr);
1436 dev_dbg(rtsx_dev(chip), "Host register (0x%x): 0x%x\n", addr, val);
1438 buf[0] = (u8)(val >> 24);
1439 buf[1] = (u8)(val >> 16);
1440 buf[2] = (u8)(val >> 8);
1443 len = min_t(unsigned int, scsi_bufflen(srb), 4);
1444 rtsx_stor_set_xfer_buf(buf, len, srb);
1445 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1447 return TRANSPORT_GOOD;
1450 static int write_host_reg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1456 rtsx_disable_aspm(chip);
1458 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1462 rtsx_set_stat(chip, RTSX_STAT_RUN);
1464 addr = srb->cmnd[4];
1466 len = min_t(unsigned int, scsi_bufflen(srb), 4);
1467 rtsx_stor_get_xfer_buf(buf, len, srb);
1468 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1470 val = ((u32)buf[0] << 24) | ((u32)buf[1] << 16) | ((u32)buf[2]
1473 rtsx_writel(chip, addr, val);
1475 return TRANSPORT_GOOD;
1478 static int set_variable(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1480 unsigned lun = SCSI_LUN(srb);
1482 if (srb->cmnd[3] == 1) {
1483 /* Variable Clock */
1484 struct xd_info *xd_card = &(chip->xd_card);
1485 struct sd_info *sd_card = &(chip->sd_card);
1486 struct ms_info *ms_card = &(chip->ms_card);
1488 switch (srb->cmnd[4]) {
1490 xd_card->xd_clock = srb->cmnd[5];
1494 sd_card->sd_clock = srb->cmnd[5];
1498 ms_card->ms_clock = srb->cmnd[5];
1502 set_sense_type(chip, lun,
1503 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1504 TRACE_RET(chip, TRANSPORT_FAILED);
1506 } else if (srb->cmnd[3] == 2) {
1508 chip->blink_led = 1;
1512 chip->blink_led = 0;
1514 rtsx_disable_aspm(chip);
1517 (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1521 rtsx_set_stat(chip, RTSX_STAT_RUN);
1523 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1524 if (retval != STATUS_SUCCESS) {
1525 set_sense_type(chip, SCSI_LUN(srb),
1526 SENSE_TYPE_MEDIA_WRITE_ERR);
1527 TRACE_RET(chip, TRANSPORT_FAILED);
1530 turn_off_led(chip, LED_GPIO);
1533 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1534 TRACE_RET(chip, TRANSPORT_FAILED);
1537 return TRANSPORT_GOOD;
1540 static int get_variable(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1542 unsigned int lun = SCSI_LUN(srb);
1544 if (srb->cmnd[3] == 1) {
1545 struct xd_info *xd_card = &(chip->xd_card);
1546 struct sd_info *sd_card = &(chip->sd_card);
1547 struct ms_info *ms_card = &(chip->ms_card);
1550 switch (srb->cmnd[4]) {
1552 tmp = (u8)(xd_card->xd_clock);
1556 tmp = (u8)(sd_card->sd_clock);
1560 tmp = (u8)(ms_card->ms_clock);
1564 set_sense_type(chip, lun,
1565 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1566 TRACE_RET(chip, TRANSPORT_FAILED);
1569 rtsx_stor_set_xfer_buf(&tmp, 1, srb);
1570 } else if (srb->cmnd[3] == 2) {
1571 u8 tmp = chip->blink_led;
1573 rtsx_stor_set_xfer_buf(&tmp, 1, srb);
1575 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1576 TRACE_RET(chip, TRANSPORT_FAILED);
1579 return TRANSPORT_GOOD;
1582 static int dma_access_ring_buffer(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1585 unsigned int lun = SCSI_LUN(srb);
1588 rtsx_disable_aspm(chip);
1590 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1594 rtsx_set_stat(chip, RTSX_STAT_RUN);
1596 len = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
1597 len = min_t(u16, len, scsi_bufflen(srb));
1599 if (srb->sc_data_direction == DMA_FROM_DEVICE)
1600 dev_dbg(rtsx_dev(chip), "Read from device\n");
1602 dev_dbg(rtsx_dev(chip), "Write to device\n");
1604 retval = rtsx_transfer_data(chip, 0, scsi_sglist(srb), len,
1605 scsi_sg_count(srb), srb->sc_data_direction, 1000);
1607 if (srb->sc_data_direction == DMA_FROM_DEVICE)
1608 set_sense_type(chip, lun,
1609 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1611 set_sense_type(chip, lun,
1612 SENSE_TYPE_MEDIA_WRITE_ERR);
1614 TRACE_RET(chip, TRANSPORT_FAILED);
1616 scsi_set_resid(srb, 0);
1618 return TRANSPORT_GOOD;
1621 static int get_dev_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1623 struct sd_info *sd_card = &(chip->sd_card);
1624 struct ms_info *ms_card = &(chip->ms_card);
1626 unsigned int lun = SCSI_LUN(srb);
1627 u8 card = get_lun_card(chip, lun);
1630 u8 oc_now_mask = 0, oc_ever_mask = 0;
1633 memset(status, 0, 32);
1635 status[0] = (u8)(chip->product_id);
1636 status[1] = chip->ic_version;
1638 if (chip->auto_delink_en)
1655 if (CHECK_LUN_MODE(chip,
1656 SD_MS_2LUN) && (chip->lun2card[lun] == MS_CARD)) {
1657 oc_now_mask = MS_OC_NOW;
1658 oc_ever_mask = MS_OC_EVER;
1660 oc_now_mask = SD_OC_NOW;
1661 oc_ever_mask = SD_OC_EVER;
1664 if (chip->ocp_stat & oc_now_mask)
1667 if (chip->ocp_stat & oc_ever_mask)
1671 if (card == SD_CARD) {
1672 if (CHK_SD(sd_card)) {
1673 if (CHK_SD_HCXC(sd_card)) {
1674 if (sd_card->capacity > 0x4000000)
1675 status[0x0E] = 0x02;
1677 status[0x0E] = 0x01;
1679 status[0x0E] = 0x00;
1682 if (CHK_SD_SDR104(sd_card))
1683 status[0x0F] = 0x03;
1684 else if (CHK_SD_DDR50(sd_card))
1685 status[0x0F] = 0x04;
1686 else if (CHK_SD_SDR50(sd_card))
1687 status[0x0F] = 0x02;
1688 else if (CHK_SD_HS(sd_card))
1689 status[0x0F] = 0x01;
1691 status[0x0F] = 0x00;
1693 if (CHK_MMC_SECTOR_MODE(sd_card))
1694 status[0x0E] = 0x01;
1696 status[0x0E] = 0x00;
1698 if (CHK_MMC_DDR52(sd_card))
1699 status[0x0F] = 0x03;
1700 else if (CHK_MMC_52M(sd_card))
1701 status[0x0F] = 0x02;
1702 else if (CHK_MMC_26M(sd_card))
1703 status[0x0F] = 0x01;
1705 status[0x0F] = 0x00;
1707 } else if (card == MS_CARD) {
1708 if (CHK_MSPRO(ms_card)) {
1709 if (CHK_MSXC(ms_card))
1710 status[0x0E] = 0x01;
1712 status[0x0E] = 0x00;
1714 if (CHK_HG8BIT(ms_card))
1715 status[0x0F] = 0x01;
1717 status[0x0F] = 0x00;
1721 #ifdef SUPPORT_SD_LOCK
1722 if (card == SD_CARD) {
1723 status[0x17] = 0x80;
1724 if (sd_card->sd_erase_status)
1725 status[0x17] |= 0x01;
1726 if (sd_card->sd_lock_status & SD_LOCKED) {
1727 status[0x17] |= 0x02;
1728 status[0x07] |= 0x40;
1730 if (sd_card->sd_lock_status & SD_PWD_EXIST)
1731 status[0x17] |= 0x04;
1733 status[0x17] = 0x00;
1736 dev_dbg(rtsx_dev(chip), "status[0x17] = 0x%x\n", status[0x17]);
1739 status[0x18] = 0x8A;
1740 status[0x1A] = 0x28;
1741 #ifdef SUPPORT_SD_LOCK
1742 status[0x1F] = 0x01;
1745 buf_len = min_t(unsigned int, scsi_bufflen(srb), sizeof(status));
1746 rtsx_stor_set_xfer_buf(status, buf_len, srb);
1747 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
1749 return TRANSPORT_GOOD;
1752 static int set_chip_mode(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1758 if (!CHECK_PID(chip, 0x5208)) {
1759 set_sense_type(chip, SCSI_LUN(srb),
1760 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1761 TRACE_RET(chip, TRANSPORT_FAILED);
1764 phy_debug_mode = (int)(srb->cmnd[3]);
1766 if (phy_debug_mode) {
1767 chip->phy_debug_mode = 1;
1768 retval = rtsx_write_register(chip, CDRESUMECTL, 0x77, 0);
1769 if (retval != STATUS_SUCCESS)
1770 TRACE_RET(chip, TRANSPORT_FAILED);
1772 rtsx_disable_bus_int(chip);
1774 retval = rtsx_read_phy_register(chip, 0x1C, ®);
1775 if (retval != STATUS_SUCCESS)
1776 TRACE_RET(chip, TRANSPORT_FAILED);
1779 retval = rtsx_write_phy_register(chip, 0x1C, reg);
1780 if (retval != STATUS_SUCCESS)
1781 TRACE_RET(chip, TRANSPORT_FAILED);
1783 chip->phy_debug_mode = 0;
1784 retval = rtsx_write_register(chip, CDRESUMECTL, 0x77, 0x77);
1785 if (retval != STATUS_SUCCESS)
1786 TRACE_RET(chip, TRANSPORT_FAILED);
1788 rtsx_enable_bus_int(chip);
1790 retval = rtsx_read_phy_register(chip, 0x1C, ®);
1791 if (retval != STATUS_SUCCESS)
1792 TRACE_RET(chip, TRANSPORT_FAILED);
1795 retval = rtsx_write_phy_register(chip, 0x1C, reg);
1796 if (retval != STATUS_SUCCESS)
1797 TRACE_RET(chip, TRANSPORT_FAILED);
1800 return TRANSPORT_GOOD;
1803 static int rw_mem_cmd_buf(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1805 int retval = STATUS_SUCCESS;
1806 unsigned int lun = SCSI_LUN(srb);
1807 u8 cmd_type, mask, value, idx;
1810 rtsx_disable_aspm(chip);
1812 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1816 rtsx_set_stat(chip, RTSX_STAT_RUN);
1818 switch (srb->cmnd[3]) {
1820 rtsx_init_cmd(chip);
1824 cmd_type = srb->cmnd[4];
1826 set_sense_type(chip, lun,
1827 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1828 TRACE_RET(chip, TRANSPORT_FAILED);
1830 addr = (srb->cmnd[5] << 8) | srb->cmnd[6];
1831 mask = srb->cmnd[7];
1832 value = srb->cmnd[8];
1833 rtsx_add_cmd(chip, cmd_type, addr, mask, value);
1837 retval = rtsx_send_cmd(chip, 0, 1000);
1842 value = *(rtsx_get_cmd_data(chip) + idx);
1843 if (scsi_bufflen(srb) < 1) {
1844 set_sense_type(chip, lun,
1845 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1846 TRACE_RET(chip, TRANSPORT_FAILED);
1848 rtsx_stor_set_xfer_buf(&value, 1, srb);
1849 scsi_set_resid(srb, 0);
1853 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1854 TRACE_RET(chip, TRANSPORT_FAILED);
1857 if (retval != STATUS_SUCCESS) {
1858 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
1859 TRACE_RET(chip, TRANSPORT_FAILED);
1862 return TRANSPORT_GOOD;
1865 static int suit_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1869 switch (srb->cmnd[3]) {
1874 result = rw_mem_cmd_buf(srb, chip);
1877 result = TRANSPORT_ERROR;
1883 static int read_phy_register(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1885 unsigned short addr, len, i;
1890 rtsx_disable_aspm(chip);
1892 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1896 rtsx_set_stat(chip, RTSX_STAT_RUN);
1898 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1899 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1907 TRACE_RET(chip, TRANSPORT_ERROR);
1909 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1910 if (retval != STATUS_SUCCESS) {
1912 set_sense_type(chip, SCSI_LUN(srb),
1913 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1914 TRACE_RET(chip, TRANSPORT_FAILED);
1917 for (i = 0; i < len / 2; i++) {
1918 retval = rtsx_read_phy_register(chip, addr + i, &val);
1919 if (retval != STATUS_SUCCESS) {
1921 set_sense_type(chip, SCSI_LUN(srb),
1922 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1923 TRACE_RET(chip, TRANSPORT_FAILED);
1926 buf[2*i] = (u8)(val >> 8);
1927 buf[2*i+1] = (u8)val;
1930 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb),
1932 rtsx_stor_set_xfer_buf(buf, len, srb);
1933 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1938 return TRANSPORT_GOOD;
1941 static int write_phy_register(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1943 unsigned short addr, len, i;
1948 rtsx_disable_aspm(chip);
1950 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1954 rtsx_set_stat(chip, RTSX_STAT_RUN);
1956 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1957 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1963 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb),
1968 TRACE_RET(chip, TRANSPORT_ERROR);
1970 rtsx_stor_get_xfer_buf(buf, len, srb);
1971 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1973 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1974 if (retval != STATUS_SUCCESS) {
1976 set_sense_type(chip, SCSI_LUN(srb),
1977 SENSE_TYPE_MEDIA_WRITE_ERR);
1978 TRACE_RET(chip, TRANSPORT_FAILED);
1981 for (i = 0; i < len / 2; i++) {
1982 val = ((u16)buf[2*i] << 8) | buf[2*i+1];
1983 retval = rtsx_write_phy_register(chip, addr + i, val);
1984 if (retval != STATUS_SUCCESS) {
1986 set_sense_type(chip, SCSI_LUN(srb),
1987 SENSE_TYPE_MEDIA_WRITE_ERR);
1988 TRACE_RET(chip, TRANSPORT_FAILED);
1995 return TRANSPORT_GOOD;
1998 static int erase_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2000 unsigned short addr;
2004 rtsx_disable_aspm(chip);
2006 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2010 rtsx_set_stat(chip, RTSX_STAT_RUN);
2012 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2013 if (retval != STATUS_SUCCESS) {
2014 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
2015 TRACE_RET(chip, TRANSPORT_FAILED);
2018 mode = srb->cmnd[3];
2019 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
2022 retval = spi_erase_eeprom_chip(chip);
2023 if (retval != STATUS_SUCCESS) {
2024 set_sense_type(chip, SCSI_LUN(srb),
2025 SENSE_TYPE_MEDIA_WRITE_ERR);
2026 TRACE_RET(chip, TRANSPORT_FAILED);
2028 } else if (mode == 1) {
2029 retval = spi_erase_eeprom_byte(chip, addr);
2030 if (retval != STATUS_SUCCESS) {
2031 set_sense_type(chip, SCSI_LUN(srb),
2032 SENSE_TYPE_MEDIA_WRITE_ERR);
2033 TRACE_RET(chip, TRANSPORT_FAILED);
2036 set_sense_type(chip, SCSI_LUN(srb),
2037 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2038 TRACE_RET(chip, TRANSPORT_FAILED);
2041 return TRANSPORT_GOOD;
2044 static int read_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2046 unsigned short addr, len, i;
2050 rtsx_disable_aspm(chip);
2052 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2056 rtsx_set_stat(chip, RTSX_STAT_RUN);
2058 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
2059 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
2063 TRACE_RET(chip, TRANSPORT_ERROR);
2065 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2066 if (retval != STATUS_SUCCESS) {
2068 set_sense_type(chip, SCSI_LUN(srb),
2069 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2070 TRACE_RET(chip, TRANSPORT_FAILED);
2073 for (i = 0; i < len; i++) {
2074 retval = spi_read_eeprom(chip, addr + i, buf + i);
2075 if (retval != STATUS_SUCCESS) {
2077 set_sense_type(chip, SCSI_LUN(srb),
2078 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2079 TRACE_RET(chip, TRANSPORT_FAILED);
2083 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
2084 rtsx_stor_set_xfer_buf(buf, len, srb);
2085 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2089 return TRANSPORT_GOOD;
2092 static int write_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2094 unsigned short addr, len, i;
2098 rtsx_disable_aspm(chip);
2100 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2104 rtsx_set_stat(chip, RTSX_STAT_RUN);
2106 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
2107 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
2109 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
2112 TRACE_RET(chip, TRANSPORT_ERROR);
2114 rtsx_stor_get_xfer_buf(buf, len, srb);
2115 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2117 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2118 if (retval != STATUS_SUCCESS) {
2120 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
2121 TRACE_RET(chip, TRANSPORT_FAILED);
2124 for (i = 0; i < len; i++) {
2125 retval = spi_write_eeprom(chip, addr + i, buf[i]);
2126 if (retval != STATUS_SUCCESS) {
2128 set_sense_type(chip, SCSI_LUN(srb),
2129 SENSE_TYPE_MEDIA_WRITE_ERR);
2130 TRACE_RET(chip, TRANSPORT_FAILED);
2136 return TRANSPORT_GOOD;
2139 static int read_efuse(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2145 rtsx_disable_aspm(chip);
2147 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2151 rtsx_set_stat(chip, RTSX_STAT_RUN);
2153 addr = srb->cmnd[4];
2158 TRACE_RET(chip, TRANSPORT_ERROR);
2160 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2161 if (retval != STATUS_SUCCESS) {
2163 set_sense_type(chip, SCSI_LUN(srb),
2164 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2165 TRACE_RET(chip, TRANSPORT_FAILED);
2168 for (i = 0; i < len; i++) {
2169 retval = rtsx_read_efuse(chip, addr + i, buf + i);
2170 if (retval != STATUS_SUCCESS) {
2172 set_sense_type(chip, SCSI_LUN(srb),
2173 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2174 TRACE_RET(chip, TRANSPORT_FAILED);
2178 len = (u8)min_t(unsigned int, scsi_bufflen(srb), len);
2179 rtsx_stor_set_xfer_buf(buf, len, srb);
2180 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2184 return TRANSPORT_GOOD;
2187 static int write_efuse(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2189 int retval, result = TRANSPORT_GOOD;
2194 rtsx_disable_aspm(chip);
2196 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2200 rtsx_set_stat(chip, RTSX_STAT_RUN);
2202 addr = srb->cmnd[4];
2205 len = (u8)min_t(unsigned int, scsi_bufflen(srb), len);
2208 TRACE_RET(chip, TRANSPORT_ERROR);
2210 rtsx_stor_get_xfer_buf(buf, len, srb);
2211 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2213 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2214 if (retval != STATUS_SUCCESS) {
2216 TRACE_RET(chip, TRANSPORT_ERROR);
2219 if (chip->asic_code) {
2220 retval = rtsx_read_phy_register(chip, 0x08, &val);
2221 if (retval != STATUS_SUCCESS) {
2223 TRACE_RET(chip, TRANSPORT_ERROR);
2226 retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2227 LDO3318_PWR_MASK, LDO_OFF);
2228 if (retval != STATUS_SUCCESS) {
2230 TRACE_RET(chip, TRANSPORT_ERROR);
2235 retval = rtsx_write_phy_register(chip, 0x08,
2236 0x4C00 | chip->phy_voltage);
2237 if (retval != STATUS_SUCCESS) {
2239 TRACE_RET(chip, TRANSPORT_ERROR);
2242 retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2243 LDO3318_PWR_MASK, LDO_ON);
2244 if (retval != STATUS_SUCCESS) {
2246 TRACE_RET(chip, TRANSPORT_ERROR);
2252 retval = card_power_on(chip, SPI_CARD);
2253 if (retval != STATUS_SUCCESS) {
2255 TRACE_RET(chip, TRANSPORT_ERROR);
2260 for (i = 0; i < len; i++) {
2261 retval = rtsx_write_efuse(chip, addr + i, buf[i]);
2262 if (retval != STATUS_SUCCESS) {
2263 set_sense_type(chip, SCSI_LUN(srb),
2264 SENSE_TYPE_MEDIA_WRITE_ERR);
2265 result = TRANSPORT_FAILED;
2266 TRACE_GOTO(chip, Exit);
2273 retval = card_power_off(chip, SPI_CARD);
2274 if (retval != STATUS_SUCCESS)
2275 TRACE_RET(chip, TRANSPORT_ERROR);
2277 if (chip->asic_code) {
2278 retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2279 LDO3318_PWR_MASK, LDO_OFF);
2280 if (retval != STATUS_SUCCESS)
2281 TRACE_RET(chip, TRANSPORT_ERROR);
2285 retval = rtsx_write_phy_register(chip, 0x08, val);
2286 if (retval != STATUS_SUCCESS)
2287 TRACE_RET(chip, TRANSPORT_ERROR);
2289 retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2290 LDO3318_PWR_MASK, LDO_ON);
2291 if (retval != STATUS_SUCCESS)
2292 TRACE_RET(chip, TRANSPORT_ERROR);
2298 static int read_cfg_byte(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2305 rtsx_disable_aspm(chip);
2307 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2311 rtsx_set_stat(chip, RTSX_STAT_RUN);
2313 func = srb->cmnd[3];
2314 addr = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
2315 len = ((u16)(srb->cmnd[6]) << 8) | srb->cmnd[7];
2317 dev_dbg(rtsx_dev(chip), "%s: func = %d, addr = 0x%x, len = %d\n",
2318 __func__, func, addr, len);
2320 if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip))
2325 if (func > func_max) {
2326 set_sense_type(chip, SCSI_LUN(srb),
2327 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2328 TRACE_RET(chip, TRANSPORT_FAILED);
2333 TRACE_RET(chip, TRANSPORT_ERROR);
2335 retval = rtsx_read_cfg_seq(chip, func, addr, buf, len);
2336 if (retval != STATUS_SUCCESS) {
2337 set_sense_type(chip, SCSI_LUN(srb),
2338 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2340 TRACE_RET(chip, TRANSPORT_FAILED);
2343 len = (u16)min_t(unsigned int, scsi_bufflen(srb), len);
2344 rtsx_stor_set_xfer_buf(buf, len, srb);
2345 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2349 return TRANSPORT_GOOD;
2352 static int write_cfg_byte(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2359 rtsx_disable_aspm(chip);
2361 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2365 rtsx_set_stat(chip, RTSX_STAT_RUN);
2367 func = srb->cmnd[3];
2368 addr = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
2369 len = ((u16)(srb->cmnd[6]) << 8) | srb->cmnd[7];
2371 dev_dbg(rtsx_dev(chip), "%s: func = %d, addr = 0x%x\n",
2372 __func__, func, addr);
2374 if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip))
2379 if (func > func_max) {
2380 set_sense_type(chip, SCSI_LUN(srb),
2381 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2382 TRACE_RET(chip, TRANSPORT_FAILED);
2385 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
2388 TRACE_RET(chip, TRANSPORT_ERROR);
2390 rtsx_stor_get_xfer_buf(buf, len, srb);
2391 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2393 retval = rtsx_write_cfg_seq(chip, func, addr, buf, len);
2394 if (retval != STATUS_SUCCESS) {
2395 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
2397 TRACE_RET(chip, TRANSPORT_FAILED);
2402 return TRANSPORT_GOOD;
2405 static int app_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2409 switch (srb->cmnd[2]) {
2412 result = read_write(srb, chip);
2416 result = read_host_reg(srb, chip);
2419 case WRITE_HOST_REG:
2420 result = write_host_reg(srb, chip);
2424 result = get_variable(srb, chip);
2428 result = set_variable(srb, chip);
2433 result = dma_access_ring_buffer(srb, chip);
2437 result = read_phy_register(srb, chip);
2441 result = write_phy_register(srb, chip);
2445 result = erase_eeprom2(srb, chip);
2449 result = read_eeprom2(srb, chip);
2453 result = write_eeprom2(srb, chip);
2457 result = read_efuse(srb, chip);
2461 result = write_efuse(srb, chip);
2465 result = read_cfg_byte(srb, chip);
2469 result = write_cfg_byte(srb, chip);
2473 result = set_chip_mode(srb, chip);
2477 result = suit_cmd(srb, chip);
2480 case GET_DEV_STATUS:
2481 result = get_dev_status(srb, chip);
2485 set_sense_type(chip, SCSI_LUN(srb),
2486 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2487 TRACE_RET(chip, TRANSPORT_FAILED);
2494 static int read_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2498 unsigned int lun = SCSI_LUN(srb);
2500 rtsx_status[0] = (u8)(chip->vendor_id >> 8);
2501 rtsx_status[1] = (u8)(chip->vendor_id);
2503 rtsx_status[2] = (u8)(chip->product_id >> 8);
2504 rtsx_status[3] = (u8)(chip->product_id);
2506 rtsx_status[4] = (u8)lun;
2508 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
2509 if (chip->lun2card[lun] == SD_CARD)
2514 if (chip->card_exist) {
2515 if (chip->card_exist & XD_CARD)
2517 else if (chip->card_exist & SD_CARD)
2519 else if (chip->card_exist & MS_CARD)
2528 if (CHECK_LUN_MODE(chip, SD_MS_2LUN))
2533 rtsx_status[7] = (u8)(chip->product_id);
2534 rtsx_status[8] = chip->ic_version;
2536 if (check_card_exist(chip, lun))
2541 if (CHECK_LUN_MODE(chip, SD_MS_2LUN))
2542 rtsx_status[10] = 0;
2544 rtsx_status[10] = 1;
2546 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
2547 if (chip->lun2card[lun] == SD_CARD)
2548 rtsx_status[11] = SD_CARD;
2550 rtsx_status[11] = MS_CARD;
2552 rtsx_status[11] = XD_CARD | SD_CARD | MS_CARD;
2555 if (check_card_ready(chip, lun))
2556 rtsx_status[12] = 1;
2558 rtsx_status[12] = 0;
2560 if (get_lun_card(chip, lun) == XD_CARD) {
2561 rtsx_status[13] = 0x40;
2562 } else if (get_lun_card(chip, lun) == SD_CARD) {
2563 struct sd_info *sd_card = &(chip->sd_card);
2565 rtsx_status[13] = 0x20;
2566 if (CHK_SD(sd_card)) {
2567 if (CHK_SD_HCXC(sd_card))
2568 rtsx_status[13] |= 0x04;
2569 if (CHK_SD_HS(sd_card))
2570 rtsx_status[13] |= 0x02;
2572 rtsx_status[13] |= 0x08;
2573 if (CHK_MMC_52M(sd_card))
2574 rtsx_status[13] |= 0x02;
2575 if (CHK_MMC_SECTOR_MODE(sd_card))
2576 rtsx_status[13] |= 0x04;
2578 } else if (get_lun_card(chip, lun) == MS_CARD) {
2579 struct ms_info *ms_card = &(chip->ms_card);
2581 if (CHK_MSPRO(ms_card)) {
2582 rtsx_status[13] = 0x38;
2583 if (CHK_HG8BIT(ms_card))
2584 rtsx_status[13] |= 0x04;
2586 if (CHK_MSXC(ms_card))
2587 rtsx_status[13] |= 0x01;
2590 rtsx_status[13] = 0x30;
2593 if (CHECK_LUN_MODE(chip, DEFAULT_SINGLE)) {
2595 if (chip->sd_io && chip->sd_int)
2596 rtsx_status[13] = 0x60;
2598 rtsx_status[13] = 0x70;
2600 rtsx_status[13] = 0x70;
2603 if (chip->lun2card[lun] == SD_CARD)
2604 rtsx_status[13] = 0x20;
2606 rtsx_status[13] = 0x30;
2610 rtsx_status[14] = 0x78;
2611 if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip))
2612 rtsx_status[15] = 0x83;
2614 rtsx_status[15] = 0x82;
2616 buf_len = min_t(unsigned int, scsi_bufflen(srb), sizeof(rtsx_status));
2617 rtsx_stor_set_xfer_buf(rtsx_status, buf_len, srb);
2618 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
2620 return TRANSPORT_GOOD;
2623 static int get_card_bus_width(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2625 unsigned int lun = SCSI_LUN(srb);
2628 if (!check_card_ready(chip, lun)) {
2629 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2630 TRACE_RET(chip, TRANSPORT_FAILED);
2633 card = get_lun_card(chip, lun);
2634 if ((card == SD_CARD) || (card == MS_CARD)) {
2635 bus_width = chip->card_bus_width[lun];
2637 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2638 TRACE_RET(chip, TRANSPORT_FAILED);
2641 scsi_set_resid(srb, 0);
2642 rtsx_stor_set_xfer_buf(&bus_width, scsi_bufflen(srb), srb);
2644 return TRANSPORT_GOOD;
2647 static int spi_vendor_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2650 unsigned int lun = SCSI_LUN(srb);
2653 if (CHECK_PID(chip, 0x5208) || CHECK_PID(chip, 0x5288)) {
2654 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2655 TRACE_RET(chip, TRANSPORT_FAILED);
2658 rtsx_disable_aspm(chip);
2660 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2664 rtsx_set_stat(chip, RTSX_STAT_RUN);
2666 rtsx_force_power_on(chip, SSC_PDCTL);
2668 rtsx_read_register(chip, CARD_GPIO_DIR, &gpio_dir);
2669 rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir & 0x06);
2671 switch (srb->cmnd[2]) {
2672 case SCSI_SPI_GETSTATUS:
2673 result = spi_get_status(srb, chip);
2676 case SCSI_SPI_SETPARAMETER:
2677 result = spi_set_parameter(srb, chip);
2680 case SCSI_SPI_READFALSHID:
2681 result = spi_read_flash_id(srb, chip);
2684 case SCSI_SPI_READFLASH:
2685 result = spi_read_flash(srb, chip);
2688 case SCSI_SPI_WRITEFLASH:
2689 result = spi_write_flash(srb, chip);
2692 case SCSI_SPI_WRITEFLASHSTATUS:
2693 result = spi_write_flash_status(srb, chip);
2696 case SCSI_SPI_ERASEFLASH:
2697 result = spi_erase_flash(srb, chip);
2701 rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir);
2703 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2704 TRACE_RET(chip, TRANSPORT_FAILED);
2707 rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir);
2709 if (result != STATUS_SUCCESS)
2710 TRACE_RET(chip, TRANSPORT_FAILED);
2712 return TRANSPORT_GOOD;
2715 static int vendor_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2719 switch (srb->cmnd[1]) {
2721 result = read_status(srb, chip);
2725 result = read_mem(srb, chip);
2729 result = write_mem(srb, chip);
2733 result = read_eeprom(srb, chip);
2737 result = write_eeprom(srb, chip);
2741 result = toggle_gpio_cmd(srb, chip);
2745 result = get_sd_csd(srb, chip);
2749 result = get_card_bus_width(srb, chip);
2754 result = trace_msg_cmd(srb, chip);
2759 result = app_cmd(srb, chip);
2762 case SPI_VENDOR_COMMAND:
2763 result = spi_vendor_cmd(srb, chip);
2767 set_sense_type(chip, SCSI_LUN(srb),
2768 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2769 TRACE_RET(chip, TRANSPORT_FAILED);
2775 #if !defined(LED_AUTO_BLINK) && !defined(REGULAR_BLINK)
2776 void led_shine(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2778 unsigned int lun = SCSI_LUN(srb);
2781 if ((srb->cmnd[0] == READ_10) || (srb->cmnd[0] == WRITE_10))
2782 sec_cnt = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
2783 else if ((srb->cmnd[0] == READ_6) || (srb->cmnd[0] == WRITE_6))
2784 sec_cnt = srb->cmnd[4];
2788 if (chip->rw_cap[lun] >= GPIO_TOGGLE_THRESHOLD) {
2789 toggle_gpio(chip, LED_GPIO);
2790 chip->rw_cap[lun] = 0;
2792 chip->rw_cap[lun] += sec_cnt;
2797 static int ms_format_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2799 struct ms_info *ms_card = &(chip->ms_card);
2800 unsigned int lun = SCSI_LUN(srb);
2801 int retval, quick_format;
2803 if (get_lun_card(chip, lun) != MS_CARD) {
2804 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2805 TRACE_RET(chip, TRANSPORT_FAILED);
2808 if ((srb->cmnd[3] != 0x4D) || (srb->cmnd[4] != 0x47) ||
2809 (srb->cmnd[5] != 0x66) || (srb->cmnd[6] != 0x6D) ||
2810 (srb->cmnd[7] != 0x74)) {
2811 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2812 TRACE_RET(chip, TRANSPORT_FAILED);
2815 rtsx_disable_aspm(chip);
2817 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2821 if (!check_card_ready(chip, lun) ||
2822 (get_card_size(chip, lun) == 0)) {
2823 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2824 TRACE_RET(chip, TRANSPORT_FAILED);
2827 rtsx_set_stat(chip, RTSX_STAT_RUN);
2829 if (srb->cmnd[8] & 0x01)
2834 if (!(chip->card_ready & MS_CARD)) {
2835 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2836 TRACE_RET(chip, TRANSPORT_FAILED);
2839 if (chip->card_wp & MS_CARD) {
2840 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
2841 TRACE_RET(chip, TRANSPORT_FAILED);
2844 if (!CHK_MSPRO(ms_card)) {
2845 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2846 TRACE_RET(chip, TRANSPORT_FAILED);
2849 retval = mspro_format(srb, chip, MS_SHORT_DATA_LEN, quick_format);
2850 if (retval != STATUS_SUCCESS) {
2851 set_sense_type(chip, lun, SENSE_TYPE_FORMAT_CMD_FAILED);
2852 TRACE_RET(chip, TRANSPORT_FAILED);
2855 scsi_set_resid(srb, 0);
2856 return TRANSPORT_GOOD;
2859 #ifdef SUPPORT_PCGL_1P18
2860 static int get_ms_information(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2862 struct ms_info *ms_card = &(chip->ms_card);
2863 unsigned int lun = SCSI_LUN(srb);
2864 u8 dev_info_id, data_len;
2866 unsigned int buf_len;
2869 if (!check_card_ready(chip, lun)) {
2870 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2871 TRACE_RET(chip, TRANSPORT_FAILED);
2873 if (get_lun_card(chip, lun) != MS_CARD) {
2874 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2875 TRACE_RET(chip, TRANSPORT_FAILED);
2878 if ((srb->cmnd[2] != 0xB0) || (srb->cmnd[4] != 0x4D) ||
2879 (srb->cmnd[5] != 0x53) || (srb->cmnd[6] != 0x49) ||
2880 (srb->cmnd[7] != 0x44)) {
2881 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2882 TRACE_RET(chip, TRANSPORT_FAILED);
2885 dev_info_id = srb->cmnd[3];
2886 if ((CHK_MSXC(ms_card) && (dev_info_id == 0x10)) ||
2887 (!CHK_MSXC(ms_card) && (dev_info_id == 0x13)) ||
2888 !CHK_MSPRO(ms_card)) {
2889 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2890 TRACE_RET(chip, TRANSPORT_FAILED);
2893 if (dev_info_id == 0x15)
2894 buf_len = data_len = 0x3A;
2896 buf_len = data_len = 0x6A;
2898 buf = kmalloc(buf_len, GFP_KERNEL);
2900 TRACE_RET(chip, TRANSPORT_ERROR);
2903 /* GET Memory Stick Media Information Response Header */
2904 buf[i++] = 0x00; /* Data length MSB */
2905 buf[i++] = data_len; /* Data length LSB */
2906 /* Device Information Type Code */
2907 if (CHK_MSXC(ms_card))
2918 /* Number of Device Information */
2921 /* Device Information Body */
2923 /* Device Information ID Number */
2924 buf[i++] = dev_info_id;
2925 /* Device Information Length */
2926 if (dev_info_id == 0x15)
2931 buf[i++] = 0x00; /* Data length MSB */
2932 buf[i++] = data_len; /* Data length LSB */
2935 if ((dev_info_id == 0x10) || (dev_info_id == 0x13)) {
2936 /* System Information */
2937 memcpy(buf+i, ms_card->raw_sys_info, 96);
2940 memcpy(buf+i, ms_card->raw_model_name, 48);
2943 rtsx_stor_set_xfer_buf(buf, buf_len, srb);
2945 if (dev_info_id == 0x15)
2946 scsi_set_resid(srb, scsi_bufflen(srb)-0x3C);
2948 scsi_set_resid(srb, scsi_bufflen(srb)-0x6C);
2951 return STATUS_SUCCESS;
2955 static int ms_sp_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2957 int retval = TRANSPORT_ERROR;
2959 if (srb->cmnd[2] == MS_FORMAT)
2960 retval = ms_format_cmnd(srb, chip);
2961 #ifdef SUPPORT_PCGL_1P18
2962 else if (srb->cmnd[2] == GET_MS_INFORMATION)
2963 retval = get_ms_information(srb, chip);
2970 static int sd_extention_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2972 unsigned int lun = SCSI_LUN(srb);
2975 rtsx_disable_aspm(chip);
2977 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2981 rtsx_set_stat(chip, RTSX_STAT_RUN);
2983 sd_cleanup_work(chip);
2985 if (!check_card_ready(chip, lun)) {
2986 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2987 TRACE_RET(chip, TRANSPORT_FAILED);
2989 if (get_lun_card(chip, lun) != SD_CARD) {
2990 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2991 TRACE_RET(chip, TRANSPORT_FAILED);
2994 switch (srb->cmnd[0]) {
2995 case SD_PASS_THRU_MODE:
2996 result = sd_pass_thru_mode(srb, chip);
2999 case SD_EXECUTE_NO_DATA:
3000 result = sd_execute_no_data(srb, chip);
3003 case SD_EXECUTE_READ:
3004 result = sd_execute_read_data(srb, chip);
3007 case SD_EXECUTE_WRITE:
3008 result = sd_execute_write_data(srb, chip);
3012 result = sd_get_cmd_rsp(srb, chip);
3016 result = sd_hw_rst(srb, chip);
3020 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3021 TRACE_RET(chip, TRANSPORT_FAILED);
3028 #ifdef SUPPORT_MAGIC_GATE
3029 static int mg_report_key(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3031 struct ms_info *ms_card = &(chip->ms_card);
3032 unsigned int lun = SCSI_LUN(srb);
3036 rtsx_disable_aspm(chip);
3038 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
3042 rtsx_set_stat(chip, RTSX_STAT_RUN);
3044 ms_cleanup_work(chip);
3046 if (!check_card_ready(chip, lun)) {
3047 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
3048 TRACE_RET(chip, TRANSPORT_FAILED);
3050 if (get_lun_card(chip, lun) != MS_CARD) {
3051 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
3052 TRACE_RET(chip, TRANSPORT_FAILED);
3055 if (srb->cmnd[7] != KC_MG_R_PRO) {
3056 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3057 TRACE_RET(chip, TRANSPORT_FAILED);
3060 if (!CHK_MSPRO(ms_card)) {
3061 set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3062 TRACE_RET(chip, TRANSPORT_FAILED);
3065 key_format = srb->cmnd[10] & 0x3F;
3066 dev_dbg(rtsx_dev(chip), "key_format = 0x%x\n", key_format);
3068 switch (key_format) {
3069 case KF_GET_LOC_EKB:
3070 if ((scsi_bufflen(srb) == 0x41C) &&
3071 (srb->cmnd[8] == 0x04) &&
3072 (srb->cmnd[9] == 0x1C)) {
3073 retval = mg_get_local_EKB(srb, chip);
3074 if (retval != STATUS_SUCCESS)
3075 TRACE_RET(chip, TRANSPORT_FAILED);
3078 set_sense_type(chip, lun,
3079 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3080 TRACE_RET(chip, TRANSPORT_FAILED);
3085 if ((scsi_bufflen(srb) == 0x24) &&
3086 (srb->cmnd[8] == 0x00) &&
3087 (srb->cmnd[9] == 0x24)) {
3088 retval = mg_get_rsp_chg(srb, chip);
3089 if (retval != STATUS_SUCCESS)
3090 TRACE_RET(chip, TRANSPORT_FAILED);
3093 set_sense_type(chip, lun,
3094 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3095 TRACE_RET(chip, TRANSPORT_FAILED);
3100 ms_card->mg_entry_num = srb->cmnd[5];
3101 if ((scsi_bufflen(srb) == 0x404) &&
3102 (srb->cmnd[8] == 0x04) &&
3103 (srb->cmnd[9] == 0x04) &&
3104 (srb->cmnd[2] == 0x00) &&
3105 (srb->cmnd[3] == 0x00) &&
3106 (srb->cmnd[4] == 0x00) &&
3107 (srb->cmnd[5] < 32)) {
3108 retval = mg_get_ICV(srb, chip);
3109 if (retval != STATUS_SUCCESS)
3110 TRACE_RET(chip, TRANSPORT_FAILED);
3113 set_sense_type(chip, lun,
3114 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3115 TRACE_RET(chip, TRANSPORT_FAILED);
3120 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3121 TRACE_RET(chip, TRANSPORT_FAILED);
3124 scsi_set_resid(srb, 0);
3125 return TRANSPORT_GOOD;
3128 static int mg_send_key(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3130 struct ms_info *ms_card = &(chip->ms_card);
3131 unsigned int lun = SCSI_LUN(srb);
3135 rtsx_disable_aspm(chip);
3137 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
3141 rtsx_set_stat(chip, RTSX_STAT_RUN);
3143 ms_cleanup_work(chip);
3145 if (!check_card_ready(chip, lun)) {
3146 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
3147 TRACE_RET(chip, TRANSPORT_FAILED);
3149 if (check_card_wp(chip, lun)) {
3150 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
3151 TRACE_RET(chip, TRANSPORT_FAILED);
3153 if (get_lun_card(chip, lun) != MS_CARD) {
3154 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
3155 TRACE_RET(chip, TRANSPORT_FAILED);
3158 if (srb->cmnd[7] != KC_MG_R_PRO) {
3159 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3160 TRACE_RET(chip, TRANSPORT_FAILED);
3163 if (!CHK_MSPRO(ms_card)) {
3164 set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3165 TRACE_RET(chip, TRANSPORT_FAILED);
3168 key_format = srb->cmnd[10] & 0x3F;
3169 dev_dbg(rtsx_dev(chip), "key_format = 0x%x\n", key_format);
3171 switch (key_format) {
3172 case KF_SET_LEAF_ID:
3173 if ((scsi_bufflen(srb) == 0x0C) &&
3174 (srb->cmnd[8] == 0x00) &&
3175 (srb->cmnd[9] == 0x0C)) {
3176 retval = mg_set_leaf_id(srb, chip);
3177 if (retval != STATUS_SUCCESS)
3178 TRACE_RET(chip, TRANSPORT_FAILED);
3181 set_sense_type(chip, lun,
3182 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3183 TRACE_RET(chip, TRANSPORT_FAILED);
3188 if ((scsi_bufflen(srb) == 0x0C) &&
3189 (srb->cmnd[8] == 0x00) &&
3190 (srb->cmnd[9] == 0x0C)) {
3191 retval = mg_chg(srb, chip);
3192 if (retval != STATUS_SUCCESS)
3193 TRACE_RET(chip, TRANSPORT_FAILED);
3196 set_sense_type(chip, lun,
3197 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3198 TRACE_RET(chip, TRANSPORT_FAILED);
3203 if ((scsi_bufflen(srb) == 0x0C) &&
3204 (srb->cmnd[8] == 0x00) &&
3205 (srb->cmnd[9] == 0x0C)) {
3206 retval = mg_rsp(srb, chip);
3207 if (retval != STATUS_SUCCESS)
3208 TRACE_RET(chip, TRANSPORT_FAILED);
3211 set_sense_type(chip, lun,
3212 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3213 TRACE_RET(chip, TRANSPORT_FAILED);
3218 ms_card->mg_entry_num = srb->cmnd[5];
3219 if ((scsi_bufflen(srb) == 0x404) &&
3220 (srb->cmnd[8] == 0x04) &&
3221 (srb->cmnd[9] == 0x04) &&
3222 (srb->cmnd[2] == 0x00) &&
3223 (srb->cmnd[3] == 0x00) &&
3224 (srb->cmnd[4] == 0x00) &&
3225 (srb->cmnd[5] < 32)) {
3226 retval = mg_set_ICV(srb, chip);
3227 if (retval != STATUS_SUCCESS)
3228 TRACE_RET(chip, TRANSPORT_FAILED);
3231 set_sense_type(chip, lun,
3232 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3233 TRACE_RET(chip, TRANSPORT_FAILED);
3238 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3239 TRACE_RET(chip, TRANSPORT_FAILED);
3242 scsi_set_resid(srb, 0);
3243 return TRANSPORT_GOOD;
3247 int rtsx_scsi_handler(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3249 #ifdef SUPPORT_SD_LOCK
3250 struct sd_info *sd_card = &(chip->sd_card);
3252 struct ms_info *ms_card = &(chip->ms_card);
3253 unsigned int lun = SCSI_LUN(srb);
3256 #ifdef SUPPORT_SD_LOCK
3257 if (sd_card->sd_erase_status) {
3258 /* Block all SCSI command except for
3259 * REQUEST_SENSE and rs_ppstatus
3261 if (!((srb->cmnd[0] == VENDOR_CMND) &&
3262 (srb->cmnd[1] == SCSI_APP_CMD) &&
3263 (srb->cmnd[2] == GET_DEV_STATUS)) &&
3264 (srb->cmnd[0] != REQUEST_SENSE)) {
3265 /* Logical Unit Not Ready Format in Progress */
3266 set_sense_data(chip, lun, CUR_ERR,
3267 0x02, 0, 0x04, 0x04, 0, 0);
3268 TRACE_RET(chip, TRANSPORT_FAILED);
3273 if ((get_lun_card(chip, lun) == MS_CARD) &&
3274 (ms_card->format_status == FORMAT_IN_PROGRESS)) {
3275 if ((srb->cmnd[0] != REQUEST_SENSE) &&
3276 (srb->cmnd[0] != INQUIRY)) {
3277 /* Logical Unit Not Ready Format in Progress */
3278 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04,
3279 0, (u16)(ms_card->progress));
3280 TRACE_RET(chip, TRANSPORT_FAILED);
3284 switch (srb->cmnd[0]) {
3289 result = read_write(srb, chip);
3290 #if !defined(LED_AUTO_BLINK) && !defined(REGULAR_BLINK)
3291 led_shine(srb, chip);
3295 case TEST_UNIT_READY:
3296 result = test_unit_ready(srb, chip);
3300 result = inquiry(srb, chip);
3304 result = read_capacity(srb, chip);
3308 result = start_stop_unit(srb, chip);
3311 case ALLOW_MEDIUM_REMOVAL:
3312 result = allow_medium_removal(srb, chip);
3316 result = request_sense(srb, chip);
3321 result = mode_sense(srb, chip);
3325 result = read_format_capacity(srb, chip);
3329 result = vendor_cmnd(srb, chip);
3333 result = ms_sp_cmnd(srb, chip);
3337 case SD_PASS_THRU_MODE:
3338 case SD_EXECUTE_NO_DATA:
3339 case SD_EXECUTE_READ:
3340 case SD_EXECUTE_WRITE:
3343 result = sd_extention_cmnd(srb, chip);
3347 #ifdef SUPPORT_MAGIC_GATE
3348 case CMD_MSPRO_MG_RKEY:
3349 result = mg_report_key(srb, chip);
3352 case CMD_MSPRO_MG_SKEY:
3353 result = mg_send_key(srb, chip);
3360 result = TRANSPORT_GOOD;
3364 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3365 result = TRANSPORT_FAILED;