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);
443 if (sd_card->sd_lock_notify) {
444 sd_card->sd_lock_notify = 0;
445 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
446 return TRANSPORT_FAILED;
447 } else if (sd_card->sd_lock_status & SD_LOCKED) {
448 set_sense_type(chip, lun,
449 SENSE_TYPE_MEDIA_READ_FORBIDDEN);
450 return TRANSPORT_FAILED;
455 return TRANSPORT_GOOD;
458 static unsigned char formatter_inquiry_str[20] = {
459 'M', 'E', 'M', 'O', 'R', 'Y', 'S', 'T', 'I', 'C', 'K',
460 #ifdef SUPPORT_MAGIC_GATE
461 '-', 'M', 'G', /* Byte[47:49] */
463 0x20, 0x20, 0x20, /* Byte[47:49] */
466 #ifdef SUPPORT_MAGIC_GATE
467 0x0B, /* Byte[50]: MG, MS, MSPro, MSXC */
469 0x09, /* Byte[50]: MS, MSPro, MSXC */
471 0x00, /* Byte[51]: Category Specific Commands */
472 0x00, /* Byte[52]: Access Control and feature */
473 0x20, 0x20, 0x20, /* Byte[53:55] */
476 static int inquiry(struct scsi_cmnd *srb, struct rtsx_chip *chip)
478 unsigned int lun = SCSI_LUN(srb);
479 char *inquiry_default = (char *)"Generic-xD/SD/M.S. 1.00 ";
480 char *inquiry_sdms = (char *)"Generic-SD/MemoryStick 1.00 ";
481 char *inquiry_sd = (char *)"Generic-SD/MMC 1.00 ";
482 char *inquiry_ms = (char *)"Generic-MemoryStick 1.00 ";
483 char *inquiry_string;
484 unsigned char sendbytes;
486 u8 card = get_lun_card(chip, lun);
487 int pro_formatter_flag = 0;
488 unsigned char inquiry_buf[] = {
489 QULIFIRE|DRCT_ACCESS_DEV,
496 REL_ADR|WBUS_32|WBUS_16|SYNC|LINKED|CMD_QUE|SFT_RE,
499 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
500 if (chip->lun2card[lun] == SD_CARD)
501 inquiry_string = inquiry_sd;
503 inquiry_string = inquiry_ms;
505 } else if (CHECK_LUN_MODE(chip, SD_MS_1LUN)) {
506 inquiry_string = inquiry_sdms;
508 inquiry_string = inquiry_default;
511 buf = vmalloc(scsi_bufflen(srb));
513 TRACE_RET(chip, TRANSPORT_ERROR);
515 #ifdef SUPPORT_MAGIC_GATE
516 if ((chip->mspro_formatter_enable) &&
517 (chip->lun2card[lun] & MS_CARD))
519 if (chip->mspro_formatter_enable)
522 if (!card || (card == MS_CARD))
523 pro_formatter_flag = 1;
526 if (pro_formatter_flag) {
527 if (scsi_bufflen(srb) < 56)
528 sendbytes = (unsigned char)(scsi_bufflen(srb));
533 if (scsi_bufflen(srb) < 36)
534 sendbytes = (unsigned char)(scsi_bufflen(srb));
540 memcpy(buf, inquiry_buf, 8);
541 memcpy(buf + 8, inquiry_string, sendbytes - 8);
542 if (pro_formatter_flag) {
543 /* Additional Length */
547 memcpy(buf, inquiry_buf, sendbytes);
550 if (pro_formatter_flag) {
552 memcpy(buf + 36, formatter_inquiry_str, sendbytes - 36);
555 scsi_set_resid(srb, 0);
557 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
560 return TRANSPORT_GOOD;
564 static int start_stop_unit(struct scsi_cmnd *srb, struct rtsx_chip *chip)
566 unsigned int lun = SCSI_LUN(srb);
568 scsi_set_resid(srb, scsi_bufflen(srb));
570 if (srb->cmnd[1] == 1)
571 return TRANSPORT_GOOD;
573 switch (srb->cmnd[0x4]) {
576 return TRANSPORT_GOOD;
579 /* Media shall be unload */
580 if (check_card_ready(chip, lun))
581 eject_card(chip, lun);
582 return TRANSPORT_GOOD;
584 case MAKE_MEDIUM_READY:
586 if (check_card_ready(chip, lun)) {
587 return TRANSPORT_GOOD;
589 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
590 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;
749 len = (len < 96) ? len : 96;
751 memcpy(buf + sys_info_offset, ms_card->raw_sys_info, len);
755 static int mode_sense(struct scsi_cmnd *srb, struct rtsx_chip *chip)
757 unsigned int lun = SCSI_LUN(srb);
758 unsigned int dataSize;
760 int pro_formatter_flag;
761 unsigned char pageCode, *buf;
762 u8 card = get_lun_card(chip, lun);
764 #ifndef SUPPORT_MAGIC_GATE
765 if (!check_card_ready(chip, lun)) {
766 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
767 scsi_set_resid(srb, scsi_bufflen(srb));
768 TRACE_RET(chip, TRANSPORT_FAILED);
772 pro_formatter_flag = 0;
774 #ifdef SUPPORT_MAGIC_GATE
775 if ((chip->lun2card[lun] & MS_CARD)) {
776 if (!card || (card == MS_CARD)) {
778 if (chip->mspro_formatter_enable)
779 pro_formatter_flag = 1;
783 if (card == MS_CARD) {
784 if (chip->mspro_formatter_enable) {
785 pro_formatter_flag = 1;
791 buf = kmalloc(dataSize, GFP_KERNEL);
793 TRACE_RET(chip, TRANSPORT_ERROR);
795 pageCode = srb->cmnd[2] & 0x3f;
797 if ((pageCode == 0x3F) || (pageCode == 0x1C) ||
798 (pageCode == 0x00) ||
799 (pro_formatter_flag && (pageCode == 0x20))) {
800 if (srb->cmnd[0] == MODE_SENSE) {
801 if ((pageCode == 0x3F) || (pageCode == 0x20)) {
802 ms_mode_sense(chip, srb->cmnd[0],
808 if (check_card_wp(chip, lun))
816 if ((pageCode == 0x3F) || (pageCode == 0x20)) {
817 ms_mode_sense(chip, srb->cmnd[0],
824 if (check_card_wp(chip, lun))
834 status = TRANSPORT_GOOD;
836 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
837 scsi_set_resid(srb, scsi_bufflen(srb));
838 status = TRANSPORT_FAILED;
841 if (status == TRANSPORT_GOOD) {
842 unsigned int len = min_t(unsigned int, scsi_bufflen(srb),
844 rtsx_stor_set_xfer_buf(buf, len, srb);
845 scsi_set_resid(srb, scsi_bufflen(srb) - len);
852 static int read_write(struct scsi_cmnd *srb, struct rtsx_chip *chip)
854 #ifdef SUPPORT_SD_LOCK
855 struct sd_info *sd_card = &(chip->sd_card);
857 unsigned int lun = SCSI_LUN(srb);
862 rtsx_disable_aspm(chip);
864 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
868 rtsx_set_stat(chip, RTSX_STAT_RUN);
870 if (!check_card_ready(chip, lun) || (get_card_size(chip, lun) == 0)) {
871 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
872 TRACE_RET(chip, TRANSPORT_FAILED);
875 if (!(CHK_BIT(chip->lun_mc, lun))) {
876 SET_BIT(chip->lun_mc, lun);
877 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
878 return TRANSPORT_FAILED;
881 #ifdef SUPPORT_SD_LOCK
882 if (sd_card->sd_erase_status) {
883 /* Accessing to any card is forbidden
884 * until the erase procedure of SD is completed
886 dev_dbg(rtsx_dev(chip), "SD card being erased!\n");
887 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_READ_FORBIDDEN);
888 TRACE_RET(chip, TRANSPORT_FAILED);
891 if (get_lun_card(chip, lun) == SD_CARD) {
892 if (sd_card->sd_lock_status & SD_LOCKED) {
893 dev_dbg(rtsx_dev(chip), "SD card locked!\n");
894 set_sense_type(chip, lun,
895 SENSE_TYPE_MEDIA_READ_FORBIDDEN);
896 TRACE_RET(chip, TRANSPORT_FAILED);
901 if ((srb->cmnd[0] == READ_10) || (srb->cmnd[0] == WRITE_10)) {
902 start_sec = ((u32)srb->cmnd[2] << 24) |
903 ((u32)srb->cmnd[3] << 16) |
904 ((u32)srb->cmnd[4] << 8) | ((u32)srb->cmnd[5]);
905 sec_cnt = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
906 } else if ((srb->cmnd[0] == READ_6) || (srb->cmnd[0] == WRITE_6)) {
907 start_sec = ((u32)(srb->cmnd[1] & 0x1F) << 16) |
908 ((u32)srb->cmnd[2] << 8) | ((u32)srb->cmnd[3]);
909 sec_cnt = srb->cmnd[4];
910 } else if ((srb->cmnd[0] == VENDOR_CMND) &&
911 (srb->cmnd[1] == SCSI_APP_CMD) &&
912 ((srb->cmnd[2] == PP_READ10) || (srb->cmnd[2] == PP_WRITE10))) {
913 start_sec = ((u32)srb->cmnd[4] << 24) |
914 ((u32)srb->cmnd[5] << 16) |
915 ((u32)srb->cmnd[6] << 8) | ((u32)srb->cmnd[7]);
916 sec_cnt = ((u16)(srb->cmnd[9]) << 8) | srb->cmnd[10];
918 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
919 TRACE_RET(chip, TRANSPORT_FAILED);
922 /* In some test, we will receive a start_sec like 0xFFFFFFFF.
923 * In this situation, start_sec + sec_cnt will overflow, so we
924 * need to judge start_sec at first
926 if ((start_sec > get_card_size(chip, lun)) ||
927 ((start_sec + sec_cnt) > get_card_size(chip, lun))) {
928 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LBA_OVER_RANGE);
929 TRACE_RET(chip, TRANSPORT_FAILED);
933 scsi_set_resid(srb, 0);
934 return TRANSPORT_GOOD;
937 if (chip->rw_fail_cnt[lun] == 3) {
938 dev_dbg(rtsx_dev(chip), "read/write fail three times in succession\n");
939 if (srb->sc_data_direction == DMA_FROM_DEVICE)
940 set_sense_type(chip, lun,
941 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
943 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
945 TRACE_RET(chip, TRANSPORT_FAILED);
948 if (srb->sc_data_direction == DMA_TO_DEVICE) {
949 if (check_card_wp(chip, lun)) {
950 dev_dbg(rtsx_dev(chip), "Write protected card!\n");
951 set_sense_type(chip, lun,
952 SENSE_TYPE_MEDIA_WRITE_PROTECT);
953 TRACE_RET(chip, TRANSPORT_FAILED);
957 retval = card_rw(srb, chip, start_sec, sec_cnt);
958 if (retval != STATUS_SUCCESS) {
959 if (chip->need_release & chip->lun2card[lun]) {
960 chip->rw_fail_cnt[lun] = 0;
961 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
963 chip->rw_fail_cnt[lun]++;
964 if (srb->sc_data_direction == DMA_FROM_DEVICE)
965 set_sense_type(chip, lun,
966 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
968 set_sense_type(chip, lun,
969 SENSE_TYPE_MEDIA_WRITE_ERR);
971 retval = TRANSPORT_FAILED;
972 TRACE_GOTO(chip, Exit);
974 chip->rw_fail_cnt[lun] = 0;
975 retval = TRANSPORT_GOOD;
978 scsi_set_resid(srb, 0);
984 static int read_format_capacity(struct scsi_cmnd *srb, struct rtsx_chip *chip)
987 unsigned int lun = SCSI_LUN(srb);
988 unsigned int buf_len;
989 u8 card = get_lun_card(chip, lun);
994 if (!check_card_ready(chip, lun)) {
995 if (!chip->mspro_formatter_enable) {
996 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
997 TRACE_RET(chip, TRANSPORT_FAILED);
1001 buf_len = (scsi_bufflen(srb) > 12) ? 0x14 : 12;
1003 buf = kmalloc(buf_len, GFP_KERNEL);
1005 TRACE_RET(chip, TRANSPORT_ERROR);
1011 /* Capacity List Length */
1012 if ((buf_len > 12) && chip->mspro_formatter_enable &&
1013 (chip->lun2card[lun] & MS_CARD) &&
1014 (!card || (card == MS_CARD))) {
1023 if (check_card_ready(chip, lun)) {
1024 card_size = get_card_size(chip, lun);
1025 buf[i++] = (unsigned char)(card_size >> 24);
1026 buf[i++] = (unsigned char)(card_size >> 16);
1027 buf[i++] = (unsigned char)(card_size >> 8);
1028 buf[i++] = (unsigned char)card_size;
1053 buf_len = min_t(unsigned int, scsi_bufflen(srb), buf_len);
1054 rtsx_stor_set_xfer_buf(buf, buf_len, srb);
1057 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
1059 return TRANSPORT_GOOD;
1062 static int read_capacity(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1065 unsigned int lun = SCSI_LUN(srb);
1068 if (!check_card_ready(chip, lun)) {
1069 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1070 TRACE_RET(chip, TRANSPORT_FAILED);
1073 if (!(CHK_BIT(chip->lun_mc, lun))) {
1074 SET_BIT(chip->lun_mc, lun);
1075 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
1076 return TRANSPORT_FAILED;
1079 buf = kmalloc(8, GFP_KERNEL);
1081 TRACE_RET(chip, TRANSPORT_ERROR);
1083 card_size = get_card_size(chip, lun);
1084 buf[0] = (unsigned char)((card_size - 1) >> 24);
1085 buf[1] = (unsigned char)((card_size - 1) >> 16);
1086 buf[2] = (unsigned char)((card_size - 1) >> 8);
1087 buf[3] = (unsigned char)(card_size - 1);
1094 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
1097 scsi_set_resid(srb, 0);
1099 return TRANSPORT_GOOD;
1102 static int read_eeprom(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1104 unsigned short len, i;
1108 rtsx_disable_aspm(chip);
1110 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1114 rtsx_set_stat(chip, RTSX_STAT_RUN);
1116 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1120 TRACE_RET(chip, TRANSPORT_ERROR);
1122 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1123 if (retval != STATUS_SUCCESS) {
1125 set_sense_type(chip, SCSI_LUN(srb),
1126 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1127 TRACE_RET(chip, TRANSPORT_FAILED);
1130 for (i = 0; i < len; i++) {
1131 retval = spi_read_eeprom(chip, i, buf + i);
1132 if (retval != STATUS_SUCCESS) {
1134 set_sense_type(chip, SCSI_LUN(srb),
1135 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1136 TRACE_RET(chip, TRANSPORT_FAILED);
1140 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
1141 rtsx_stor_set_xfer_buf(buf, len, srb);
1142 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1146 return TRANSPORT_GOOD;
1149 static int write_eeprom(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1151 unsigned short len, i;
1155 rtsx_disable_aspm(chip);
1157 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1161 rtsx_set_stat(chip, RTSX_STAT_RUN);
1163 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1165 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1166 if (retval != STATUS_SUCCESS) {
1167 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1168 TRACE_RET(chip, TRANSPORT_FAILED);
1172 retval = spi_erase_eeprom_chip(chip);
1173 if (retval != STATUS_SUCCESS) {
1174 set_sense_type(chip, SCSI_LUN(srb),
1175 SENSE_TYPE_MEDIA_WRITE_ERR);
1176 TRACE_RET(chip, TRANSPORT_FAILED);
1179 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb),
1183 TRACE_RET(chip, TRANSPORT_ERROR);
1185 rtsx_stor_get_xfer_buf(buf, len, srb);
1186 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1188 for (i = 0; i < len; i++) {
1189 retval = spi_write_eeprom(chip, i, buf[i]);
1190 if (retval != STATUS_SUCCESS) {
1192 set_sense_type(chip, SCSI_LUN(srb),
1193 SENSE_TYPE_MEDIA_WRITE_ERR);
1194 TRACE_RET(chip, TRANSPORT_FAILED);
1201 return TRANSPORT_GOOD;
1204 static int read_mem(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1206 unsigned short addr, len, i;
1210 rtsx_disable_aspm(chip);
1212 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1216 rtsx_set_stat(chip, RTSX_STAT_RUN);
1218 addr = ((u16)srb->cmnd[2] << 8) | srb->cmnd[3];
1219 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1221 if (addr < 0xFC00) {
1222 set_sense_type(chip, SCSI_LUN(srb),
1223 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1224 TRACE_RET(chip, TRANSPORT_FAILED);
1229 TRACE_RET(chip, TRANSPORT_ERROR);
1231 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1232 if (retval != STATUS_SUCCESS) {
1234 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1235 TRACE_RET(chip, TRANSPORT_FAILED);
1238 for (i = 0; i < len; i++) {
1239 retval = rtsx_read_register(chip, addr + i, buf + i);
1240 if (retval != STATUS_SUCCESS) {
1242 set_sense_type(chip, SCSI_LUN(srb),
1243 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1244 TRACE_RET(chip, TRANSPORT_FAILED);
1248 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
1249 rtsx_stor_set_xfer_buf(buf, len, srb);
1250 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1254 return TRANSPORT_GOOD;
1257 static int write_mem(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1259 unsigned short addr, len, i;
1263 rtsx_disable_aspm(chip);
1265 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1269 rtsx_set_stat(chip, RTSX_STAT_RUN);
1271 addr = ((u16)srb->cmnd[2] << 8) | srb->cmnd[3];
1272 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1274 if (addr < 0xFC00) {
1275 set_sense_type(chip, SCSI_LUN(srb),
1276 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1277 TRACE_RET(chip, TRANSPORT_FAILED);
1280 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
1283 TRACE_RET(chip, TRANSPORT_ERROR);
1285 rtsx_stor_get_xfer_buf(buf, len, srb);
1286 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1288 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1289 if (retval != STATUS_SUCCESS) {
1291 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1292 TRACE_RET(chip, TRANSPORT_FAILED);
1295 for (i = 0; i < len; i++) {
1296 retval = rtsx_write_register(chip, addr + i, 0xFF, buf[i]);
1297 if (retval != STATUS_SUCCESS) {
1299 set_sense_type(chip, SCSI_LUN(srb),
1300 SENSE_TYPE_MEDIA_WRITE_ERR);
1301 TRACE_RET(chip, TRANSPORT_FAILED);
1307 return TRANSPORT_GOOD;
1310 static int get_sd_csd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1312 struct sd_info *sd_card = &(chip->sd_card);
1313 unsigned int lun = SCSI_LUN(srb);
1315 if (!check_card_ready(chip, lun)) {
1316 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1317 TRACE_RET(chip, TRANSPORT_FAILED);
1320 if (get_lun_card(chip, lun) != SD_CARD) {
1321 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1322 TRACE_RET(chip, TRANSPORT_FAILED);
1325 scsi_set_resid(srb, 0);
1326 rtsx_stor_set_xfer_buf(sd_card->raw_csd, scsi_bufflen(srb), srb);
1328 return TRANSPORT_GOOD;
1331 static int toggle_gpio_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1333 u8 gpio = srb->cmnd[2];
1335 rtsx_disable_aspm(chip);
1337 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1341 rtsx_set_stat(chip, RTSX_STAT_RUN);
1345 toggle_gpio(chip, gpio);
1347 return TRANSPORT_GOOD;
1351 static int trace_msg_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1353 unsigned char *ptr, *buf = NULL;
1356 unsigned int buf_len;
1358 buf_len = 4 + ((2 + MSG_FUNC_LEN + MSG_FILE_LEN + TIME_VAL_LEN) *
1361 if ((scsi_bufflen(srb) < buf_len) || (scsi_sglist(srb) == NULL)) {
1362 set_sense_type(chip, SCSI_LUN(srb),
1363 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1364 TRACE_RET(chip, TRANSPORT_FAILED);
1367 clear = srb->cmnd[2];
1369 buf = vmalloc(scsi_bufflen(srb));
1371 TRACE_RET(chip, TRANSPORT_ERROR);
1374 if (chip->trace_msg[chip->msg_idx].valid)
1375 msg_cnt = TRACE_ITEM_CNT;
1377 msg_cnt = chip->msg_idx;
1379 *(ptr++) = (u8)(msg_cnt >> 24);
1380 *(ptr++) = (u8)(msg_cnt >> 16);
1381 *(ptr++) = (u8)(msg_cnt >> 8);
1382 *(ptr++) = (u8)msg_cnt;
1383 dev_dbg(rtsx_dev(chip), "Trace message count is %d\n", msg_cnt);
1385 for (i = 1; i <= msg_cnt; i++) {
1388 idx = chip->msg_idx - i;
1390 idx += TRACE_ITEM_CNT;
1392 *(ptr++) = (u8)(chip->trace_msg[idx].line >> 8);
1393 *(ptr++) = (u8)(chip->trace_msg[idx].line);
1394 for (j = 0; j < MSG_FUNC_LEN; j++)
1395 *(ptr++) = chip->trace_msg[idx].func[j];
1397 for (j = 0; j < MSG_FILE_LEN; j++)
1398 *(ptr++) = chip->trace_msg[idx].file[j];
1400 for (j = 0; j < TIME_VAL_LEN; j++)
1401 *(ptr++) = chip->trace_msg[idx].timeval_buf[j];
1404 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
1409 for (i = 0; i < TRACE_ITEM_CNT; i++)
1410 chip->trace_msg[i].valid = 0;
1413 scsi_set_resid(srb, 0);
1414 return TRANSPORT_GOOD;
1418 static int read_host_reg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1424 rtsx_disable_aspm(chip);
1426 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1430 rtsx_set_stat(chip, RTSX_STAT_RUN);
1432 addr = srb->cmnd[4];
1434 val = rtsx_readl(chip, addr);
1435 dev_dbg(rtsx_dev(chip), "Host register (0x%x): 0x%x\n", addr, val);
1437 buf[0] = (u8)(val >> 24);
1438 buf[1] = (u8)(val >> 16);
1439 buf[2] = (u8)(val >> 8);
1442 len = min_t(unsigned int, scsi_bufflen(srb), 4);
1443 rtsx_stor_set_xfer_buf(buf, len, srb);
1444 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1446 return TRANSPORT_GOOD;
1449 static int write_host_reg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1455 rtsx_disable_aspm(chip);
1457 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1461 rtsx_set_stat(chip, RTSX_STAT_RUN);
1463 addr = srb->cmnd[4];
1465 len = min_t(unsigned int, scsi_bufflen(srb), 4);
1466 rtsx_stor_get_xfer_buf(buf, len, srb);
1467 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1469 val = ((u32)buf[0] << 24) | ((u32)buf[1] << 16) | ((u32)buf[2]
1472 rtsx_writel(chip, addr, val);
1474 return TRANSPORT_GOOD;
1477 static int set_variable(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1479 unsigned lun = SCSI_LUN(srb);
1481 if (srb->cmnd[3] == 1) {
1482 /* Variable Clock */
1483 struct xd_info *xd_card = &(chip->xd_card);
1484 struct sd_info *sd_card = &(chip->sd_card);
1485 struct ms_info *ms_card = &(chip->ms_card);
1487 switch (srb->cmnd[4]) {
1489 xd_card->xd_clock = srb->cmnd[5];
1493 sd_card->sd_clock = srb->cmnd[5];
1497 ms_card->ms_clock = srb->cmnd[5];
1501 set_sense_type(chip, lun,
1502 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1503 TRACE_RET(chip, TRANSPORT_FAILED);
1505 } else if (srb->cmnd[3] == 2) {
1507 chip->blink_led = 1;
1511 chip->blink_led = 0;
1513 rtsx_disable_aspm(chip);
1516 (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1520 rtsx_set_stat(chip, RTSX_STAT_RUN);
1522 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1523 if (retval != STATUS_SUCCESS) {
1524 set_sense_type(chip, SCSI_LUN(srb),
1525 SENSE_TYPE_MEDIA_WRITE_ERR);
1526 TRACE_RET(chip, TRANSPORT_FAILED);
1529 turn_off_led(chip, LED_GPIO);
1532 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1533 TRACE_RET(chip, TRANSPORT_FAILED);
1536 return TRANSPORT_GOOD;
1539 static int get_variable(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1541 unsigned int lun = SCSI_LUN(srb);
1543 if (srb->cmnd[3] == 1) {
1544 struct xd_info *xd_card = &(chip->xd_card);
1545 struct sd_info *sd_card = &(chip->sd_card);
1546 struct ms_info *ms_card = &(chip->ms_card);
1549 switch (srb->cmnd[4]) {
1551 tmp = (u8)(xd_card->xd_clock);
1555 tmp = (u8)(sd_card->sd_clock);
1559 tmp = (u8)(ms_card->ms_clock);
1563 set_sense_type(chip, lun,
1564 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1565 TRACE_RET(chip, TRANSPORT_FAILED);
1568 rtsx_stor_set_xfer_buf(&tmp, 1, srb);
1569 } else if (srb->cmnd[3] == 2) {
1570 u8 tmp = chip->blink_led;
1571 rtsx_stor_set_xfer_buf(&tmp, 1, srb);
1573 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1574 TRACE_RET(chip, TRANSPORT_FAILED);
1577 return TRANSPORT_GOOD;
1580 static int dma_access_ring_buffer(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1583 unsigned int lun = SCSI_LUN(srb);
1586 rtsx_disable_aspm(chip);
1588 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1592 rtsx_set_stat(chip, RTSX_STAT_RUN);
1594 len = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
1595 len = min_t(u16, len, scsi_bufflen(srb));
1597 if (srb->sc_data_direction == DMA_FROM_DEVICE)
1598 dev_dbg(rtsx_dev(chip), "Read from device\n");
1600 dev_dbg(rtsx_dev(chip), "Write to device\n");
1602 retval = rtsx_transfer_data(chip, 0, scsi_sglist(srb), len,
1603 scsi_sg_count(srb), srb->sc_data_direction, 1000);
1605 if (srb->sc_data_direction == DMA_FROM_DEVICE)
1606 set_sense_type(chip, lun,
1607 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1609 set_sense_type(chip, lun,
1610 SENSE_TYPE_MEDIA_WRITE_ERR);
1612 TRACE_RET(chip, TRANSPORT_FAILED);
1614 scsi_set_resid(srb, 0);
1616 return TRANSPORT_GOOD;
1619 static int get_dev_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1621 struct sd_info *sd_card = &(chip->sd_card);
1622 struct ms_info *ms_card = &(chip->ms_card);
1624 unsigned int lun = SCSI_LUN(srb);
1625 u8 card = get_lun_card(chip, lun);
1628 u8 oc_now_mask = 0, oc_ever_mask = 0;
1631 memset(status, 0, 32);
1633 status[0] = (u8)(chip->product_id);
1634 status[1] = chip->ic_version;
1636 if (chip->auto_delink_en)
1653 if (CHECK_LUN_MODE(chip,
1654 SD_MS_2LUN) && (chip->lun2card[lun] == MS_CARD)) {
1655 oc_now_mask = MS_OC_NOW;
1656 oc_ever_mask = MS_OC_EVER;
1658 oc_now_mask = SD_OC_NOW;
1659 oc_ever_mask = SD_OC_EVER;
1662 if (chip->ocp_stat & oc_now_mask)
1665 if (chip->ocp_stat & oc_ever_mask)
1669 if (card == SD_CARD) {
1670 if (CHK_SD(sd_card)) {
1671 if (CHK_SD_HCXC(sd_card)) {
1672 if (sd_card->capacity > 0x4000000)
1673 status[0x0E] = 0x02;
1675 status[0x0E] = 0x01;
1677 status[0x0E] = 0x00;
1680 if (CHK_SD_SDR104(sd_card))
1681 status[0x0F] = 0x03;
1682 else if (CHK_SD_DDR50(sd_card))
1683 status[0x0F] = 0x04;
1684 else if (CHK_SD_SDR50(sd_card))
1685 status[0x0F] = 0x02;
1686 else if (CHK_SD_HS(sd_card))
1687 status[0x0F] = 0x01;
1689 status[0x0F] = 0x00;
1691 if (CHK_MMC_SECTOR_MODE(sd_card))
1692 status[0x0E] = 0x01;
1694 status[0x0E] = 0x00;
1696 if (CHK_MMC_DDR52(sd_card))
1697 status[0x0F] = 0x03;
1698 else if (CHK_MMC_52M(sd_card))
1699 status[0x0F] = 0x02;
1700 else if (CHK_MMC_26M(sd_card))
1701 status[0x0F] = 0x01;
1703 status[0x0F] = 0x00;
1705 } else if (card == MS_CARD) {
1706 if (CHK_MSPRO(ms_card)) {
1707 if (CHK_MSXC(ms_card))
1708 status[0x0E] = 0x01;
1710 status[0x0E] = 0x00;
1712 if (CHK_HG8BIT(ms_card))
1713 status[0x0F] = 0x01;
1715 status[0x0F] = 0x00;
1719 #ifdef SUPPORT_SD_LOCK
1720 if (card == SD_CARD) {
1721 status[0x17] = 0x80;
1722 if (sd_card->sd_erase_status)
1723 status[0x17] |= 0x01;
1724 if (sd_card->sd_lock_status & SD_LOCKED) {
1725 status[0x17] |= 0x02;
1726 status[0x07] |= 0x40;
1728 if (sd_card->sd_lock_status & SD_PWD_EXIST)
1729 status[0x17] |= 0x04;
1731 status[0x17] = 0x00;
1734 dev_dbg(rtsx_dev(chip), "status[0x17] = 0x%x\n", status[0x17]);
1737 status[0x18] = 0x8A;
1738 status[0x1A] = 0x28;
1739 #ifdef SUPPORT_SD_LOCK
1740 status[0x1F] = 0x01;
1743 buf_len = min_t(unsigned int, scsi_bufflen(srb), sizeof(status));
1744 rtsx_stor_set_xfer_buf(status, buf_len, srb);
1745 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
1747 return TRANSPORT_GOOD;
1750 static int set_chip_mode(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1756 if (!CHECK_PID(chip, 0x5208)) {
1757 set_sense_type(chip, SCSI_LUN(srb),
1758 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1759 TRACE_RET(chip, TRANSPORT_FAILED);
1762 phy_debug_mode = (int)(srb->cmnd[3]);
1764 if (phy_debug_mode) {
1765 chip->phy_debug_mode = 1;
1766 retval = rtsx_write_register(chip, CDRESUMECTL, 0x77, 0);
1767 if (retval != STATUS_SUCCESS)
1768 TRACE_RET(chip, TRANSPORT_FAILED);
1770 rtsx_disable_bus_int(chip);
1772 retval = rtsx_read_phy_register(chip, 0x1C, ®);
1773 if (retval != STATUS_SUCCESS)
1774 TRACE_RET(chip, TRANSPORT_FAILED);
1777 retval = rtsx_write_phy_register(chip, 0x1C, reg);
1778 if (retval != STATUS_SUCCESS)
1779 TRACE_RET(chip, TRANSPORT_FAILED);
1781 chip->phy_debug_mode = 0;
1782 retval = rtsx_write_register(chip, CDRESUMECTL, 0x77, 0x77);
1783 if (retval != STATUS_SUCCESS)
1784 TRACE_RET(chip, TRANSPORT_FAILED);
1786 rtsx_enable_bus_int(chip);
1788 retval = rtsx_read_phy_register(chip, 0x1C, ®);
1789 if (retval != STATUS_SUCCESS)
1790 TRACE_RET(chip, TRANSPORT_FAILED);
1793 retval = rtsx_write_phy_register(chip, 0x1C, reg);
1794 if (retval != STATUS_SUCCESS)
1795 TRACE_RET(chip, TRANSPORT_FAILED);
1798 return TRANSPORT_GOOD;
1801 static int rw_mem_cmd_buf(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1803 int retval = STATUS_SUCCESS;
1804 unsigned int lun = SCSI_LUN(srb);
1805 u8 cmd_type, mask, value, idx;
1808 rtsx_disable_aspm(chip);
1810 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1814 rtsx_set_stat(chip, RTSX_STAT_RUN);
1816 switch (srb->cmnd[3]) {
1818 rtsx_init_cmd(chip);
1822 cmd_type = srb->cmnd[4];
1824 set_sense_type(chip, lun,
1825 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1826 TRACE_RET(chip, TRANSPORT_FAILED);
1828 addr = (srb->cmnd[5] << 8) | srb->cmnd[6];
1829 mask = srb->cmnd[7];
1830 value = srb->cmnd[8];
1831 rtsx_add_cmd(chip, cmd_type, addr, mask, value);
1835 retval = rtsx_send_cmd(chip, 0, 1000);
1840 value = *(rtsx_get_cmd_data(chip) + idx);
1841 if (scsi_bufflen(srb) < 1) {
1842 set_sense_type(chip, lun,
1843 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1844 TRACE_RET(chip, TRANSPORT_FAILED);
1846 rtsx_stor_set_xfer_buf(&value, 1, srb);
1847 scsi_set_resid(srb, 0);
1851 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1852 TRACE_RET(chip, TRANSPORT_FAILED);
1855 if (retval != STATUS_SUCCESS) {
1856 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
1857 TRACE_RET(chip, TRANSPORT_FAILED);
1860 return TRANSPORT_GOOD;
1863 static int suit_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1867 switch (srb->cmnd[3]) {
1872 result = rw_mem_cmd_buf(srb, chip);
1875 result = TRANSPORT_ERROR;
1881 static int read_phy_register(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1883 unsigned short addr, len, i;
1888 rtsx_disable_aspm(chip);
1890 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1894 rtsx_set_stat(chip, RTSX_STAT_RUN);
1896 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1897 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1905 TRACE_RET(chip, TRANSPORT_ERROR);
1907 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1908 if (retval != STATUS_SUCCESS) {
1910 set_sense_type(chip, SCSI_LUN(srb),
1911 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1912 TRACE_RET(chip, TRANSPORT_FAILED);
1915 for (i = 0; i < len / 2; i++) {
1916 retval = rtsx_read_phy_register(chip, addr + i, &val);
1917 if (retval != STATUS_SUCCESS) {
1919 set_sense_type(chip, SCSI_LUN(srb),
1920 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1921 TRACE_RET(chip, TRANSPORT_FAILED);
1924 buf[2*i] = (u8)(val >> 8);
1925 buf[2*i+1] = (u8)val;
1928 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb),
1930 rtsx_stor_set_xfer_buf(buf, len, srb);
1931 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1936 return TRANSPORT_GOOD;
1939 static int write_phy_register(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1941 unsigned short addr, len, i;
1946 rtsx_disable_aspm(chip);
1948 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1952 rtsx_set_stat(chip, RTSX_STAT_RUN);
1954 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1955 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1961 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb),
1966 TRACE_RET(chip, TRANSPORT_ERROR);
1968 rtsx_stor_get_xfer_buf(buf, len, srb);
1969 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1971 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1972 if (retval != STATUS_SUCCESS) {
1974 set_sense_type(chip, SCSI_LUN(srb),
1975 SENSE_TYPE_MEDIA_WRITE_ERR);
1976 TRACE_RET(chip, TRANSPORT_FAILED);
1979 for (i = 0; i < len / 2; i++) {
1980 val = ((u16)buf[2*i] << 8) | buf[2*i+1];
1981 retval = rtsx_write_phy_register(chip, addr + i, val);
1982 if (retval != STATUS_SUCCESS) {
1984 set_sense_type(chip, SCSI_LUN(srb),
1985 SENSE_TYPE_MEDIA_WRITE_ERR);
1986 TRACE_RET(chip, TRANSPORT_FAILED);
1993 return TRANSPORT_GOOD;
1996 static int erase_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1998 unsigned short addr;
2002 rtsx_disable_aspm(chip);
2004 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2008 rtsx_set_stat(chip, RTSX_STAT_RUN);
2010 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2011 if (retval != STATUS_SUCCESS) {
2012 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
2013 TRACE_RET(chip, TRANSPORT_FAILED);
2016 mode = srb->cmnd[3];
2017 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
2020 retval = spi_erase_eeprom_chip(chip);
2021 if (retval != STATUS_SUCCESS) {
2022 set_sense_type(chip, SCSI_LUN(srb),
2023 SENSE_TYPE_MEDIA_WRITE_ERR);
2024 TRACE_RET(chip, TRANSPORT_FAILED);
2026 } else if (mode == 1) {
2027 retval = spi_erase_eeprom_byte(chip, addr);
2028 if (retval != STATUS_SUCCESS) {
2029 set_sense_type(chip, SCSI_LUN(srb),
2030 SENSE_TYPE_MEDIA_WRITE_ERR);
2031 TRACE_RET(chip, TRANSPORT_FAILED);
2034 set_sense_type(chip, SCSI_LUN(srb),
2035 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2036 TRACE_RET(chip, TRANSPORT_FAILED);
2039 return TRANSPORT_GOOD;
2042 static int read_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2044 unsigned short addr, len, i;
2048 rtsx_disable_aspm(chip);
2050 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2054 rtsx_set_stat(chip, RTSX_STAT_RUN);
2056 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
2057 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
2061 TRACE_RET(chip, TRANSPORT_ERROR);
2063 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2064 if (retval != STATUS_SUCCESS) {
2066 set_sense_type(chip, SCSI_LUN(srb),
2067 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2068 TRACE_RET(chip, TRANSPORT_FAILED);
2071 for (i = 0; i < len; i++) {
2072 retval = spi_read_eeprom(chip, addr + i, buf + i);
2073 if (retval != STATUS_SUCCESS) {
2075 set_sense_type(chip, SCSI_LUN(srb),
2076 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2077 TRACE_RET(chip, TRANSPORT_FAILED);
2081 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
2082 rtsx_stor_set_xfer_buf(buf, len, srb);
2083 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2087 return TRANSPORT_GOOD;
2090 static int write_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2092 unsigned short addr, len, i;
2096 rtsx_disable_aspm(chip);
2098 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2102 rtsx_set_stat(chip, RTSX_STAT_RUN);
2104 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
2105 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
2107 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
2110 TRACE_RET(chip, TRANSPORT_ERROR);
2112 rtsx_stor_get_xfer_buf(buf, len, srb);
2113 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2115 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2116 if (retval != STATUS_SUCCESS) {
2118 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
2119 TRACE_RET(chip, TRANSPORT_FAILED);
2122 for (i = 0; i < len; i++) {
2123 retval = spi_write_eeprom(chip, addr + i, buf[i]);
2124 if (retval != STATUS_SUCCESS) {
2126 set_sense_type(chip, SCSI_LUN(srb),
2127 SENSE_TYPE_MEDIA_WRITE_ERR);
2128 TRACE_RET(chip, TRANSPORT_FAILED);
2134 return TRANSPORT_GOOD;
2137 static int read_efuse(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2143 rtsx_disable_aspm(chip);
2145 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2149 rtsx_set_stat(chip, RTSX_STAT_RUN);
2151 addr = srb->cmnd[4];
2156 TRACE_RET(chip, TRANSPORT_ERROR);
2158 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2159 if (retval != STATUS_SUCCESS) {
2161 set_sense_type(chip, SCSI_LUN(srb),
2162 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2163 TRACE_RET(chip, TRANSPORT_FAILED);
2166 for (i = 0; i < len; i++) {
2167 retval = rtsx_read_efuse(chip, addr + i, buf + i);
2168 if (retval != STATUS_SUCCESS) {
2170 set_sense_type(chip, SCSI_LUN(srb),
2171 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2172 TRACE_RET(chip, TRANSPORT_FAILED);
2176 len = (u8)min_t(unsigned int, scsi_bufflen(srb), len);
2177 rtsx_stor_set_xfer_buf(buf, len, srb);
2178 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2182 return TRANSPORT_GOOD;
2185 static int write_efuse(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2187 int retval, result = TRANSPORT_GOOD;
2192 rtsx_disable_aspm(chip);
2194 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2198 rtsx_set_stat(chip, RTSX_STAT_RUN);
2200 addr = srb->cmnd[4];
2203 len = (u8)min_t(unsigned int, scsi_bufflen(srb), len);
2206 TRACE_RET(chip, TRANSPORT_ERROR);
2208 rtsx_stor_get_xfer_buf(buf, len, srb);
2209 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2211 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2212 if (retval != STATUS_SUCCESS) {
2214 TRACE_RET(chip, TRANSPORT_ERROR);
2217 if (chip->asic_code) {
2218 retval = rtsx_read_phy_register(chip, 0x08, &val);
2219 if (retval != STATUS_SUCCESS) {
2221 TRACE_RET(chip, TRANSPORT_ERROR);
2224 retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2225 LDO3318_PWR_MASK, LDO_OFF);
2226 if (retval != STATUS_SUCCESS) {
2228 TRACE_RET(chip, TRANSPORT_ERROR);
2233 retval = rtsx_write_phy_register(chip, 0x08,
2234 0x4C00 | chip->phy_voltage);
2235 if (retval != STATUS_SUCCESS) {
2237 TRACE_RET(chip, TRANSPORT_ERROR);
2240 retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2241 LDO3318_PWR_MASK, LDO_ON);
2242 if (retval != STATUS_SUCCESS) {
2244 TRACE_RET(chip, TRANSPORT_ERROR);
2250 retval = card_power_on(chip, SPI_CARD);
2251 if (retval != STATUS_SUCCESS) {
2253 TRACE_RET(chip, TRANSPORT_ERROR);
2258 for (i = 0; i < len; i++) {
2259 retval = rtsx_write_efuse(chip, addr + i, buf[i]);
2260 if (retval != STATUS_SUCCESS) {
2261 set_sense_type(chip, SCSI_LUN(srb),
2262 SENSE_TYPE_MEDIA_WRITE_ERR);
2263 result = TRANSPORT_FAILED;
2264 TRACE_GOTO(chip, Exit);
2271 retval = card_power_off(chip, SPI_CARD);
2272 if (retval != STATUS_SUCCESS)
2273 TRACE_RET(chip, TRANSPORT_ERROR);
2275 if (chip->asic_code) {
2276 retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2277 LDO3318_PWR_MASK, LDO_OFF);
2278 if (retval != STATUS_SUCCESS)
2279 TRACE_RET(chip, TRANSPORT_ERROR);
2283 retval = rtsx_write_phy_register(chip, 0x08, val);
2284 if (retval != STATUS_SUCCESS)
2285 TRACE_RET(chip, TRANSPORT_ERROR);
2287 retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2288 LDO3318_PWR_MASK, LDO_ON);
2289 if (retval != STATUS_SUCCESS)
2290 TRACE_RET(chip, TRANSPORT_ERROR);
2296 static int read_cfg_byte(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2303 rtsx_disable_aspm(chip);
2305 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2309 rtsx_set_stat(chip, RTSX_STAT_RUN);
2311 func = srb->cmnd[3];
2312 addr = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
2313 len = ((u16)(srb->cmnd[6]) << 8) | srb->cmnd[7];
2315 dev_dbg(rtsx_dev(chip), "%s: func = %d, addr = 0x%x, len = %d\n",
2316 __func__, func, addr, len);
2318 if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip))
2323 if (func > func_max) {
2324 set_sense_type(chip, SCSI_LUN(srb),
2325 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2326 TRACE_RET(chip, TRANSPORT_FAILED);
2331 TRACE_RET(chip, TRANSPORT_ERROR);
2333 retval = rtsx_read_cfg_seq(chip, func, addr, buf, len);
2334 if (retval != STATUS_SUCCESS) {
2335 set_sense_type(chip, SCSI_LUN(srb),
2336 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2338 TRACE_RET(chip, TRANSPORT_FAILED);
2341 len = (u16)min_t(unsigned int, scsi_bufflen(srb), len);
2342 rtsx_stor_set_xfer_buf(buf, len, srb);
2343 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2347 return TRANSPORT_GOOD;
2350 static int write_cfg_byte(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2357 rtsx_disable_aspm(chip);
2359 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2363 rtsx_set_stat(chip, RTSX_STAT_RUN);
2365 func = srb->cmnd[3];
2366 addr = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
2367 len = ((u16)(srb->cmnd[6]) << 8) | srb->cmnd[7];
2369 dev_dbg(rtsx_dev(chip), "%s: func = %d, addr = 0x%x\n",
2370 __func__, func, addr);
2372 if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip))
2377 if (func > func_max) {
2378 set_sense_type(chip, SCSI_LUN(srb),
2379 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2380 TRACE_RET(chip, TRANSPORT_FAILED);
2383 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
2386 TRACE_RET(chip, TRANSPORT_ERROR);
2388 rtsx_stor_get_xfer_buf(buf, len, srb);
2389 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2391 retval = rtsx_write_cfg_seq(chip, func, addr, buf, len);
2392 if (retval != STATUS_SUCCESS) {
2393 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
2395 TRACE_RET(chip, TRANSPORT_FAILED);
2400 return TRANSPORT_GOOD;
2403 static int app_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2407 switch (srb->cmnd[2]) {
2410 result = read_write(srb, chip);
2414 result = read_host_reg(srb, chip);
2417 case WRITE_HOST_REG:
2418 result = write_host_reg(srb, chip);
2422 result = get_variable(srb, chip);
2426 result = set_variable(srb, chip);
2431 result = dma_access_ring_buffer(srb, chip);
2435 result = read_phy_register(srb, chip);
2439 result = write_phy_register(srb, chip);
2443 result = erase_eeprom2(srb, chip);
2447 result = read_eeprom2(srb, chip);
2451 result = write_eeprom2(srb, chip);
2455 result = read_efuse(srb, chip);
2459 result = write_efuse(srb, chip);
2463 result = read_cfg_byte(srb, chip);
2467 result = write_cfg_byte(srb, chip);
2471 result = set_chip_mode(srb, chip);
2475 result = suit_cmd(srb, chip);
2478 case GET_DEV_STATUS:
2479 result = get_dev_status(srb, chip);
2483 set_sense_type(chip, SCSI_LUN(srb),
2484 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2485 TRACE_RET(chip, TRANSPORT_FAILED);
2492 static int read_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2496 unsigned int lun = SCSI_LUN(srb);
2498 rtsx_status[0] = (u8)(chip->vendor_id >> 8);
2499 rtsx_status[1] = (u8)(chip->vendor_id);
2501 rtsx_status[2] = (u8)(chip->product_id >> 8);
2502 rtsx_status[3] = (u8)(chip->product_id);
2504 rtsx_status[4] = (u8)lun;
2506 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
2507 if (chip->lun2card[lun] == SD_CARD)
2512 if (chip->card_exist) {
2513 if (chip->card_exist & XD_CARD)
2515 else if (chip->card_exist & SD_CARD)
2517 else if (chip->card_exist & MS_CARD)
2526 if (CHECK_LUN_MODE(chip, SD_MS_2LUN))
2531 rtsx_status[7] = (u8)(chip->product_id);
2532 rtsx_status[8] = chip->ic_version;
2534 if (check_card_exist(chip, lun))
2539 if (CHECK_LUN_MODE(chip, SD_MS_2LUN))
2540 rtsx_status[10] = 0;
2542 rtsx_status[10] = 1;
2544 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
2545 if (chip->lun2card[lun] == SD_CARD)
2546 rtsx_status[11] = SD_CARD;
2548 rtsx_status[11] = MS_CARD;
2550 rtsx_status[11] = XD_CARD | SD_CARD | MS_CARD;
2553 if (check_card_ready(chip, lun))
2554 rtsx_status[12] = 1;
2556 rtsx_status[12] = 0;
2558 if (get_lun_card(chip, lun) == XD_CARD) {
2559 rtsx_status[13] = 0x40;
2560 } else if (get_lun_card(chip, lun) == SD_CARD) {
2561 struct sd_info *sd_card = &(chip->sd_card);
2563 rtsx_status[13] = 0x20;
2564 if (CHK_SD(sd_card)) {
2565 if (CHK_SD_HCXC(sd_card))
2566 rtsx_status[13] |= 0x04;
2567 if (CHK_SD_HS(sd_card))
2568 rtsx_status[13] |= 0x02;
2570 rtsx_status[13] |= 0x08;
2571 if (CHK_MMC_52M(sd_card))
2572 rtsx_status[13] |= 0x02;
2573 if (CHK_MMC_SECTOR_MODE(sd_card))
2574 rtsx_status[13] |= 0x04;
2576 } else if (get_lun_card(chip, lun) == MS_CARD) {
2577 struct ms_info *ms_card = &(chip->ms_card);
2579 if (CHK_MSPRO(ms_card)) {
2580 rtsx_status[13] = 0x38;
2581 if (CHK_HG8BIT(ms_card))
2582 rtsx_status[13] |= 0x04;
2584 if (CHK_MSXC(ms_card))
2585 rtsx_status[13] |= 0x01;
2588 rtsx_status[13] = 0x30;
2591 if (CHECK_LUN_MODE(chip, DEFAULT_SINGLE)) {
2593 if (chip->sd_io && chip->sd_int)
2594 rtsx_status[13] = 0x60;
2596 rtsx_status[13] = 0x70;
2598 rtsx_status[13] = 0x70;
2601 if (chip->lun2card[lun] == SD_CARD)
2602 rtsx_status[13] = 0x20;
2604 rtsx_status[13] = 0x30;
2608 rtsx_status[14] = 0x78;
2609 if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip))
2610 rtsx_status[15] = 0x83;
2612 rtsx_status[15] = 0x82;
2614 buf_len = min_t(unsigned int, scsi_bufflen(srb), sizeof(rtsx_status));
2615 rtsx_stor_set_xfer_buf(rtsx_status, buf_len, srb);
2616 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
2618 return TRANSPORT_GOOD;
2621 static int get_card_bus_width(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2623 unsigned int lun = SCSI_LUN(srb);
2626 if (!check_card_ready(chip, lun)) {
2627 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2628 TRACE_RET(chip, TRANSPORT_FAILED);
2631 card = get_lun_card(chip, lun);
2632 if ((card == SD_CARD) || (card == MS_CARD)) {
2633 bus_width = chip->card_bus_width[lun];
2635 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2636 TRACE_RET(chip, TRANSPORT_FAILED);
2639 scsi_set_resid(srb, 0);
2640 rtsx_stor_set_xfer_buf(&bus_width, scsi_bufflen(srb), srb);
2642 return TRANSPORT_GOOD;
2645 static int spi_vendor_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2648 unsigned int lun = SCSI_LUN(srb);
2651 if (CHECK_PID(chip, 0x5208) || CHECK_PID(chip, 0x5288)) {
2652 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2653 TRACE_RET(chip, TRANSPORT_FAILED);
2656 rtsx_disable_aspm(chip);
2658 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2662 rtsx_set_stat(chip, RTSX_STAT_RUN);
2664 rtsx_force_power_on(chip, SSC_PDCTL);
2666 rtsx_read_register(chip, CARD_GPIO_DIR, &gpio_dir);
2667 rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir & 0x06);
2669 switch (srb->cmnd[2]) {
2670 case SCSI_SPI_GETSTATUS:
2671 result = spi_get_status(srb, chip);
2674 case SCSI_SPI_SETPARAMETER:
2675 result = spi_set_parameter(srb, chip);
2678 case SCSI_SPI_READFALSHID:
2679 result = spi_read_flash_id(srb, chip);
2682 case SCSI_SPI_READFLASH:
2683 result = spi_read_flash(srb, chip);
2686 case SCSI_SPI_WRITEFLASH:
2687 result = spi_write_flash(srb, chip);
2690 case SCSI_SPI_WRITEFLASHSTATUS:
2691 result = spi_write_flash_status(srb, chip);
2694 case SCSI_SPI_ERASEFLASH:
2695 result = spi_erase_flash(srb, chip);
2699 rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir);
2701 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2702 TRACE_RET(chip, TRANSPORT_FAILED);
2705 rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir);
2707 if (result != STATUS_SUCCESS)
2708 TRACE_RET(chip, TRANSPORT_FAILED);
2710 return TRANSPORT_GOOD;
2713 static int vendor_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2717 switch (srb->cmnd[1]) {
2719 result = read_status(srb, chip);
2723 result = read_mem(srb, chip);
2727 result = write_mem(srb, chip);
2731 result = read_eeprom(srb, chip);
2735 result = write_eeprom(srb, chip);
2739 result = toggle_gpio_cmd(srb, chip);
2743 result = get_sd_csd(srb, chip);
2747 result = get_card_bus_width(srb, chip);
2752 result = trace_msg_cmd(srb, chip);
2757 result = app_cmd(srb, chip);
2760 case SPI_VENDOR_COMMAND:
2761 result = spi_vendor_cmd(srb, chip);
2765 set_sense_type(chip, SCSI_LUN(srb),
2766 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2767 TRACE_RET(chip, TRANSPORT_FAILED);
2773 #if !defined(LED_AUTO_BLINK) && !defined(REGULAR_BLINK)
2774 void led_shine(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2776 unsigned int lun = SCSI_LUN(srb);
2779 if ((srb->cmnd[0] == READ_10) || (srb->cmnd[0] == WRITE_10))
2780 sec_cnt = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
2781 else if ((srb->cmnd[0] == READ_6) || (srb->cmnd[0] == WRITE_6))
2782 sec_cnt = srb->cmnd[4];
2786 if (chip->rw_cap[lun] >= GPIO_TOGGLE_THRESHOLD) {
2787 toggle_gpio(chip, LED_GPIO);
2788 chip->rw_cap[lun] = 0;
2790 chip->rw_cap[lun] += sec_cnt;
2795 static int ms_format_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2797 struct ms_info *ms_card = &(chip->ms_card);
2798 unsigned int lun = SCSI_LUN(srb);
2799 int retval, quick_format;
2801 if (get_lun_card(chip, lun) != MS_CARD) {
2802 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2803 TRACE_RET(chip, TRANSPORT_FAILED);
2806 if ((srb->cmnd[3] != 0x4D) || (srb->cmnd[4] != 0x47) ||
2807 (srb->cmnd[5] != 0x66) || (srb->cmnd[6] != 0x6D) ||
2808 (srb->cmnd[7] != 0x74)) {
2809 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2810 TRACE_RET(chip, TRANSPORT_FAILED);
2813 rtsx_disable_aspm(chip);
2815 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2819 if (!check_card_ready(chip, lun) ||
2820 (get_card_size(chip, lun) == 0)) {
2821 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2822 TRACE_RET(chip, TRANSPORT_FAILED);
2825 rtsx_set_stat(chip, RTSX_STAT_RUN);
2827 if (srb->cmnd[8] & 0x01)
2832 if (!(chip->card_ready & MS_CARD)) {
2833 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2834 TRACE_RET(chip, TRANSPORT_FAILED);
2837 if (chip->card_wp & MS_CARD) {
2838 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
2839 TRACE_RET(chip, TRANSPORT_FAILED);
2842 if (!CHK_MSPRO(ms_card)) {
2843 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2844 TRACE_RET(chip, TRANSPORT_FAILED);
2847 retval = mspro_format(srb, chip, MS_SHORT_DATA_LEN, quick_format);
2848 if (retval != STATUS_SUCCESS) {
2849 set_sense_type(chip, lun, SENSE_TYPE_FORMAT_CMD_FAILED);
2850 TRACE_RET(chip, TRANSPORT_FAILED);
2853 scsi_set_resid(srb, 0);
2854 return TRANSPORT_GOOD;
2857 #ifdef SUPPORT_PCGL_1P18
2858 static int get_ms_information(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2860 struct ms_info *ms_card = &(chip->ms_card);
2861 unsigned int lun = SCSI_LUN(srb);
2862 u8 dev_info_id, data_len;
2864 unsigned int buf_len;
2867 if (!check_card_ready(chip, lun)) {
2868 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2869 TRACE_RET(chip, TRANSPORT_FAILED);
2871 if (get_lun_card(chip, lun) != MS_CARD) {
2872 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2873 TRACE_RET(chip, TRANSPORT_FAILED);
2876 if ((srb->cmnd[2] != 0xB0) || (srb->cmnd[4] != 0x4D) ||
2877 (srb->cmnd[5] != 0x53) || (srb->cmnd[6] != 0x49) ||
2878 (srb->cmnd[7] != 0x44)) {
2879 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2880 TRACE_RET(chip, TRANSPORT_FAILED);
2883 dev_info_id = srb->cmnd[3];
2884 if ((CHK_MSXC(ms_card) && (dev_info_id == 0x10)) ||
2885 (!CHK_MSXC(ms_card) && (dev_info_id == 0x13)) ||
2886 !CHK_MSPRO(ms_card)) {
2887 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2888 TRACE_RET(chip, TRANSPORT_FAILED);
2891 if (dev_info_id == 0x15)
2892 buf_len = data_len = 0x3A;
2894 buf_len = data_len = 0x6A;
2896 buf = kmalloc(buf_len, GFP_KERNEL);
2898 TRACE_RET(chip, TRANSPORT_ERROR);
2901 /* GET Memory Stick Media Information Response Header */
2902 buf[i++] = 0x00; /* Data length MSB */
2903 buf[i++] = data_len; /* Data length LSB */
2904 /* Device Information Type Code */
2905 if (CHK_MSXC(ms_card))
2916 /* Number of Device Information */
2919 /* Device Information Body */
2921 /* Device Information ID Number */
2922 buf[i++] = dev_info_id;
2923 /* Device Information Length */
2924 if (dev_info_id == 0x15)
2929 buf[i++] = 0x00; /* Data length MSB */
2930 buf[i++] = data_len; /* Data length LSB */
2933 if ((dev_info_id == 0x10) || (dev_info_id == 0x13)) {
2934 /* System Information */
2935 memcpy(buf+i, ms_card->raw_sys_info, 96);
2938 memcpy(buf+i, ms_card->raw_model_name, 48);
2941 rtsx_stor_set_xfer_buf(buf, buf_len, srb);
2943 if (dev_info_id == 0x15)
2944 scsi_set_resid(srb, scsi_bufflen(srb)-0x3C);
2946 scsi_set_resid(srb, scsi_bufflen(srb)-0x6C);
2949 return STATUS_SUCCESS;
2953 static int ms_sp_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2955 int retval = TRANSPORT_ERROR;
2957 if (srb->cmnd[2] == MS_FORMAT)
2958 retval = ms_format_cmnd(srb, chip);
2959 #ifdef SUPPORT_PCGL_1P18
2960 else if (srb->cmnd[2] == GET_MS_INFORMATION)
2961 retval = get_ms_information(srb, chip);
2968 static int sd_extention_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2970 unsigned int lun = SCSI_LUN(srb);
2973 rtsx_disable_aspm(chip);
2975 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2979 rtsx_set_stat(chip, RTSX_STAT_RUN);
2981 sd_cleanup_work(chip);
2983 if (!check_card_ready(chip, lun)) {
2984 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2985 TRACE_RET(chip, TRANSPORT_FAILED);
2987 if (get_lun_card(chip, lun) != SD_CARD) {
2988 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2989 TRACE_RET(chip, TRANSPORT_FAILED);
2992 switch (srb->cmnd[0]) {
2993 case SD_PASS_THRU_MODE:
2994 result = sd_pass_thru_mode(srb, chip);
2997 case SD_EXECUTE_NO_DATA:
2998 result = sd_execute_no_data(srb, chip);
3001 case SD_EXECUTE_READ:
3002 result = sd_execute_read_data(srb, chip);
3005 case SD_EXECUTE_WRITE:
3006 result = sd_execute_write_data(srb, chip);
3010 result = sd_get_cmd_rsp(srb, chip);
3014 result = sd_hw_rst(srb, chip);
3018 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3019 TRACE_RET(chip, TRANSPORT_FAILED);
3026 #ifdef SUPPORT_MAGIC_GATE
3027 static int mg_report_key(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3029 struct ms_info *ms_card = &(chip->ms_card);
3030 unsigned int lun = SCSI_LUN(srb);
3034 rtsx_disable_aspm(chip);
3036 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
3040 rtsx_set_stat(chip, RTSX_STAT_RUN);
3042 ms_cleanup_work(chip);
3044 if (!check_card_ready(chip, lun)) {
3045 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
3046 TRACE_RET(chip, TRANSPORT_FAILED);
3048 if (get_lun_card(chip, lun) != MS_CARD) {
3049 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
3050 TRACE_RET(chip, TRANSPORT_FAILED);
3053 if (srb->cmnd[7] != KC_MG_R_PRO) {
3054 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3055 TRACE_RET(chip, TRANSPORT_FAILED);
3058 if (!CHK_MSPRO(ms_card)) {
3059 set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3060 TRACE_RET(chip, TRANSPORT_FAILED);
3063 key_format = srb->cmnd[10] & 0x3F;
3064 dev_dbg(rtsx_dev(chip), "key_format = 0x%x\n", key_format);
3066 switch (key_format) {
3067 case KF_GET_LOC_EKB:
3068 if ((scsi_bufflen(srb) == 0x41C) &&
3069 (srb->cmnd[8] == 0x04) &&
3070 (srb->cmnd[9] == 0x1C)) {
3071 retval = mg_get_local_EKB(srb, chip);
3072 if (retval != STATUS_SUCCESS)
3073 TRACE_RET(chip, TRANSPORT_FAILED);
3076 set_sense_type(chip, lun,
3077 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3078 TRACE_RET(chip, TRANSPORT_FAILED);
3083 if ((scsi_bufflen(srb) == 0x24) &&
3084 (srb->cmnd[8] == 0x00) &&
3085 (srb->cmnd[9] == 0x24)) {
3086 retval = mg_get_rsp_chg(srb, chip);
3087 if (retval != STATUS_SUCCESS)
3088 TRACE_RET(chip, TRANSPORT_FAILED);
3091 set_sense_type(chip, lun,
3092 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3093 TRACE_RET(chip, TRANSPORT_FAILED);
3098 ms_card->mg_entry_num = srb->cmnd[5];
3099 if ((scsi_bufflen(srb) == 0x404) &&
3100 (srb->cmnd[8] == 0x04) &&
3101 (srb->cmnd[9] == 0x04) &&
3102 (srb->cmnd[2] == 0x00) &&
3103 (srb->cmnd[3] == 0x00) &&
3104 (srb->cmnd[4] == 0x00) &&
3105 (srb->cmnd[5] < 32)) {
3106 retval = mg_get_ICV(srb, chip);
3107 if (retval != STATUS_SUCCESS)
3108 TRACE_RET(chip, TRANSPORT_FAILED);
3111 set_sense_type(chip, lun,
3112 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3113 TRACE_RET(chip, TRANSPORT_FAILED);
3118 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3119 TRACE_RET(chip, TRANSPORT_FAILED);
3122 scsi_set_resid(srb, 0);
3123 return TRANSPORT_GOOD;
3126 static int mg_send_key(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3128 struct ms_info *ms_card = &(chip->ms_card);
3129 unsigned int lun = SCSI_LUN(srb);
3133 rtsx_disable_aspm(chip);
3135 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
3139 rtsx_set_stat(chip, RTSX_STAT_RUN);
3141 ms_cleanup_work(chip);
3143 if (!check_card_ready(chip, lun)) {
3144 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
3145 TRACE_RET(chip, TRANSPORT_FAILED);
3147 if (check_card_wp(chip, lun)) {
3148 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
3149 TRACE_RET(chip, TRANSPORT_FAILED);
3151 if (get_lun_card(chip, lun) != MS_CARD) {
3152 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
3153 TRACE_RET(chip, TRANSPORT_FAILED);
3156 if (srb->cmnd[7] != KC_MG_R_PRO) {
3157 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3158 TRACE_RET(chip, TRANSPORT_FAILED);
3161 if (!CHK_MSPRO(ms_card)) {
3162 set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3163 TRACE_RET(chip, TRANSPORT_FAILED);
3166 key_format = srb->cmnd[10] & 0x3F;
3167 dev_dbg(rtsx_dev(chip), "key_format = 0x%x\n", key_format);
3169 switch (key_format) {
3170 case KF_SET_LEAF_ID:
3171 if ((scsi_bufflen(srb) == 0x0C) &&
3172 (srb->cmnd[8] == 0x00) &&
3173 (srb->cmnd[9] == 0x0C)) {
3174 retval = mg_set_leaf_id(srb, chip);
3175 if (retval != STATUS_SUCCESS)
3176 TRACE_RET(chip, TRANSPORT_FAILED);
3179 set_sense_type(chip, lun,
3180 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3181 TRACE_RET(chip, TRANSPORT_FAILED);
3186 if ((scsi_bufflen(srb) == 0x0C) &&
3187 (srb->cmnd[8] == 0x00) &&
3188 (srb->cmnd[9] == 0x0C)) {
3189 retval = mg_chg(srb, chip);
3190 if (retval != STATUS_SUCCESS)
3191 TRACE_RET(chip, TRANSPORT_FAILED);
3194 set_sense_type(chip, lun,
3195 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3196 TRACE_RET(chip, TRANSPORT_FAILED);
3201 if ((scsi_bufflen(srb) == 0x0C) &&
3202 (srb->cmnd[8] == 0x00) &&
3203 (srb->cmnd[9] == 0x0C)) {
3204 retval = mg_rsp(srb, chip);
3205 if (retval != STATUS_SUCCESS)
3206 TRACE_RET(chip, TRANSPORT_FAILED);
3209 set_sense_type(chip, lun,
3210 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3211 TRACE_RET(chip, TRANSPORT_FAILED);
3216 ms_card->mg_entry_num = srb->cmnd[5];
3217 if ((scsi_bufflen(srb) == 0x404) &&
3218 (srb->cmnd[8] == 0x04) &&
3219 (srb->cmnd[9] == 0x04) &&
3220 (srb->cmnd[2] == 0x00) &&
3221 (srb->cmnd[3] == 0x00) &&
3222 (srb->cmnd[4] == 0x00) &&
3223 (srb->cmnd[5] < 32)) {
3224 retval = mg_set_ICV(srb, chip);
3225 if (retval != STATUS_SUCCESS)
3226 TRACE_RET(chip, TRANSPORT_FAILED);
3229 set_sense_type(chip, lun,
3230 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3231 TRACE_RET(chip, TRANSPORT_FAILED);
3236 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3237 TRACE_RET(chip, TRANSPORT_FAILED);
3240 scsi_set_resid(srb, 0);
3241 return TRANSPORT_GOOD;
3245 int rtsx_scsi_handler(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3247 #ifdef SUPPORT_SD_LOCK
3248 struct sd_info *sd_card = &(chip->sd_card);
3250 struct ms_info *ms_card = &(chip->ms_card);
3251 unsigned int lun = SCSI_LUN(srb);
3254 #ifdef SUPPORT_SD_LOCK
3255 if (sd_card->sd_erase_status) {
3256 /* Block all SCSI command except for
3257 * REQUEST_SENSE and rs_ppstatus
3259 if (!((srb->cmnd[0] == VENDOR_CMND) &&
3260 (srb->cmnd[1] == SCSI_APP_CMD) &&
3261 (srb->cmnd[2] == GET_DEV_STATUS)) &&
3262 (srb->cmnd[0] != REQUEST_SENSE)) {
3263 /* Logical Unit Not Ready Format in Progress */
3264 set_sense_data(chip, lun, CUR_ERR,
3265 0x02, 0, 0x04, 0x04, 0, 0);
3266 TRACE_RET(chip, TRANSPORT_FAILED);
3271 if ((get_lun_card(chip, lun) == MS_CARD) &&
3272 (ms_card->format_status == FORMAT_IN_PROGRESS)) {
3273 if ((srb->cmnd[0] != REQUEST_SENSE) &&
3274 (srb->cmnd[0] != INQUIRY)) {
3275 /* Logical Unit Not Ready Format in Progress */
3276 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04,
3277 0, (u16)(ms_card->progress));
3278 TRACE_RET(chip, TRANSPORT_FAILED);
3282 switch (srb->cmnd[0]) {
3287 result = read_write(srb, chip);
3288 #if !defined(LED_AUTO_BLINK) && !defined(REGULAR_BLINK)
3289 led_shine(srb, chip);
3293 case TEST_UNIT_READY:
3294 result = test_unit_ready(srb, chip);
3298 result = inquiry(srb, chip);
3302 result = read_capacity(srb, chip);
3306 result = start_stop_unit(srb, chip);
3309 case ALLOW_MEDIUM_REMOVAL:
3310 result = allow_medium_removal(srb, chip);
3314 result = request_sense(srb, chip);
3319 result = mode_sense(srb, chip);
3323 result = read_format_capacity(srb, chip);
3327 result = vendor_cmnd(srb, chip);
3331 result = ms_sp_cmnd(srb, chip);
3335 case SD_PASS_THRU_MODE:
3336 case SD_EXECUTE_NO_DATA:
3337 case SD_EXECUTE_READ:
3338 case SD_EXECUTE_WRITE:
3341 result = sd_extention_cmnd(srb, chip);
3345 #ifdef SUPPORT_MAGIC_GATE
3346 case CMD_MSPRO_MG_RKEY:
3347 result = mg_report_key(srb, chip);
3350 case CMD_MSPRO_MG_SKEY:
3351 result = mg_send_key(srb, chip);
3358 result = TRANSPORT_GOOD;
3362 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3363 result = TRANSPORT_FAILED;