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);
597 TRACE_RET(chip, TRANSPORT_ERROR);
601 static int allow_medium_removal(struct scsi_cmnd *srb, struct rtsx_chip *chip)
605 prevent = srb->cmnd[4] & 0x1;
607 scsi_set_resid(srb, 0);
610 set_sense_type(chip, SCSI_LUN(srb),
611 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
612 TRACE_RET(chip, TRANSPORT_FAILED);
615 return TRANSPORT_GOOD;
619 static int request_sense(struct scsi_cmnd *srb, struct rtsx_chip *chip)
621 struct sense_data_t *sense;
622 unsigned int lun = SCSI_LUN(srb);
623 struct ms_info *ms_card = &(chip->ms_card);
624 unsigned char *tmp, *buf;
626 sense = &(chip->sense_buffer[lun]);
628 if ((get_lun_card(chip, lun) == MS_CARD) &&
629 ms_card->pro_under_formatting) {
630 if (ms_card->format_status == FORMAT_SUCCESS) {
631 set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
632 ms_card->pro_under_formatting = 0;
633 ms_card->progress = 0;
634 } else if (ms_card->format_status == FORMAT_IN_PROGRESS) {
635 /* Logical Unit Not Ready Format in Progress */
636 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04,
637 0, (u16)(ms_card->progress));
639 /* Format Command Failed */
640 set_sense_type(chip, lun, SENSE_TYPE_FORMAT_CMD_FAILED);
641 ms_card->pro_under_formatting = 0;
642 ms_card->progress = 0;
645 rtsx_set_stat(chip, RTSX_STAT_RUN);
648 buf = vmalloc(scsi_bufflen(srb));
650 TRACE_RET(chip, TRANSPORT_ERROR);
652 tmp = (unsigned char *)sense;
653 memcpy(buf, tmp, scsi_bufflen(srb));
655 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
658 scsi_set_resid(srb, 0);
659 /* Reset Sense Data */
660 set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
661 return TRANSPORT_GOOD;
664 static void ms_mode_sense(struct rtsx_chip *chip, u8 cmd,
665 int lun, u8 *buf, int buf_len)
667 struct ms_info *ms_card = &(chip->ms_card);
669 int data_size = buf_len;
670 int support_format = 0;
673 if (cmd == MODE_SENSE) {
675 if (data_size > 0x68)
678 buf[i++] = 0x67; /* Mode Data Length */
680 sys_info_offset = 12;
681 if (data_size > 0x6C)
684 buf[i++] = 0x00; /* Mode Data Length (MSB) */
685 buf[i++] = 0x6A; /* Mode Data Length (LSB) */
688 /* Medium Type Code */
689 if (check_card_ready(chip, lun)) {
690 if (CHK_MSXC(ms_card)) {
693 } else if (CHK_MSPRO(ms_card)) {
701 if (check_card_wp(chip, lun))
707 buf[i++] = 0x00; /* MediaType */
708 buf[i++] = 0x00; /* WP */
711 buf[i++] = 0x00; /* Reserved */
713 if (cmd == MODE_SENSE_10) {
714 buf[i++] = 0x00; /* Reserved */
715 buf[i++] = 0x00; /* Block descriptor length(MSB) */
716 buf[i++] = 0x00; /* Block descriptor length(LSB) */
718 /* The Following Data is the content of "Page 0x20" */
720 buf[i++] = 0x20; /* Page Code */
722 buf[i++] = 0x62; /* Page Length */
724 buf[i++] = 0x00; /* No Access Control */
725 if (data_size >= 12) {
727 buf[i++] = 0xC0; /* SF, SGM */
732 /* The Following Data is the content of "Page 0x20" */
734 buf[i++] = 0x20; /* Page Code */
736 buf[i++] = 0x62; /* Page Length */
738 buf[i++] = 0x00; /* No Access Control */
739 if (data_size >= 8) {
741 buf[i++] = 0xC0; /* SF, SGM */
747 if (data_size > sys_info_offset) {
748 /* 96 Bytes Attribute Data */
749 int len = data_size - sys_info_offset;
751 len = (len < 96) ? len : 96;
753 memcpy(buf + sys_info_offset, ms_card->raw_sys_info, len);
757 static int mode_sense(struct scsi_cmnd *srb, struct rtsx_chip *chip)
759 unsigned int lun = SCSI_LUN(srb);
760 unsigned int dataSize;
762 int pro_formatter_flag;
763 unsigned char pageCode, *buf;
764 u8 card = get_lun_card(chip, lun);
766 #ifndef SUPPORT_MAGIC_GATE
767 if (!check_card_ready(chip, lun)) {
768 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
769 scsi_set_resid(srb, scsi_bufflen(srb));
770 TRACE_RET(chip, TRANSPORT_FAILED);
774 pro_formatter_flag = 0;
776 #ifdef SUPPORT_MAGIC_GATE
777 if ((chip->lun2card[lun] & MS_CARD)) {
778 if (!card || (card == MS_CARD)) {
780 if (chip->mspro_formatter_enable)
781 pro_formatter_flag = 1;
785 if (card == MS_CARD) {
786 if (chip->mspro_formatter_enable) {
787 pro_formatter_flag = 1;
793 buf = kmalloc(dataSize, GFP_KERNEL);
795 TRACE_RET(chip, TRANSPORT_ERROR);
797 pageCode = srb->cmnd[2] & 0x3f;
799 if ((pageCode == 0x3F) || (pageCode == 0x1C) ||
800 (pageCode == 0x00) ||
801 (pro_formatter_flag && (pageCode == 0x20))) {
802 if (srb->cmnd[0] == MODE_SENSE) {
803 if ((pageCode == 0x3F) || (pageCode == 0x20)) {
804 ms_mode_sense(chip, srb->cmnd[0],
810 if (check_card_wp(chip, lun))
818 if ((pageCode == 0x3F) || (pageCode == 0x20)) {
819 ms_mode_sense(chip, srb->cmnd[0],
826 if (check_card_wp(chip, lun))
836 status = TRANSPORT_GOOD;
838 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
839 scsi_set_resid(srb, scsi_bufflen(srb));
840 status = TRANSPORT_FAILED;
843 if (status == TRANSPORT_GOOD) {
844 unsigned int len = min_t(unsigned int, scsi_bufflen(srb),
846 rtsx_stor_set_xfer_buf(buf, len, srb);
847 scsi_set_resid(srb, scsi_bufflen(srb) - len);
854 static int read_write(struct scsi_cmnd *srb, struct rtsx_chip *chip)
856 #ifdef SUPPORT_SD_LOCK
857 struct sd_info *sd_card = &(chip->sd_card);
859 unsigned int lun = SCSI_LUN(srb);
864 rtsx_disable_aspm(chip);
866 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
870 rtsx_set_stat(chip, RTSX_STAT_RUN);
872 if (!check_card_ready(chip, lun) || (get_card_size(chip, lun) == 0)) {
873 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
874 TRACE_RET(chip, TRANSPORT_FAILED);
877 if (!(CHK_BIT(chip->lun_mc, lun))) {
878 SET_BIT(chip->lun_mc, lun);
879 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
880 return TRANSPORT_FAILED;
883 #ifdef SUPPORT_SD_LOCK
884 if (sd_card->sd_erase_status) {
885 /* Accessing to any card is forbidden
886 * until the erase procedure of SD is completed
888 dev_dbg(rtsx_dev(chip), "SD card being erased!\n");
889 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_READ_FORBIDDEN);
890 TRACE_RET(chip, TRANSPORT_FAILED);
893 if (get_lun_card(chip, lun) == SD_CARD) {
894 if (sd_card->sd_lock_status & SD_LOCKED) {
895 dev_dbg(rtsx_dev(chip), "SD card locked!\n");
896 set_sense_type(chip, lun,
897 SENSE_TYPE_MEDIA_READ_FORBIDDEN);
898 TRACE_RET(chip, TRANSPORT_FAILED);
903 if ((srb->cmnd[0] == READ_10) || (srb->cmnd[0] == WRITE_10)) {
904 start_sec = ((u32)srb->cmnd[2] << 24) |
905 ((u32)srb->cmnd[3] << 16) |
906 ((u32)srb->cmnd[4] << 8) | ((u32)srb->cmnd[5]);
907 sec_cnt = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
908 } else if ((srb->cmnd[0] == READ_6) || (srb->cmnd[0] == WRITE_6)) {
909 start_sec = ((u32)(srb->cmnd[1] & 0x1F) << 16) |
910 ((u32)srb->cmnd[2] << 8) | ((u32)srb->cmnd[3]);
911 sec_cnt = srb->cmnd[4];
912 } else if ((srb->cmnd[0] == VENDOR_CMND) &&
913 (srb->cmnd[1] == SCSI_APP_CMD) &&
914 ((srb->cmnd[2] == PP_READ10) || (srb->cmnd[2] == PP_WRITE10))) {
915 start_sec = ((u32)srb->cmnd[4] << 24) |
916 ((u32)srb->cmnd[5] << 16) |
917 ((u32)srb->cmnd[6] << 8) | ((u32)srb->cmnd[7]);
918 sec_cnt = ((u16)(srb->cmnd[9]) << 8) | srb->cmnd[10];
920 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
921 TRACE_RET(chip, TRANSPORT_FAILED);
924 /* In some test, we will receive a start_sec like 0xFFFFFFFF.
925 * In this situation, start_sec + sec_cnt will overflow, so we
926 * need to judge start_sec at first
928 if ((start_sec > get_card_size(chip, lun)) ||
929 ((start_sec + sec_cnt) > get_card_size(chip, lun))) {
930 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LBA_OVER_RANGE);
931 TRACE_RET(chip, TRANSPORT_FAILED);
935 scsi_set_resid(srb, 0);
936 return TRANSPORT_GOOD;
939 if (chip->rw_fail_cnt[lun] == 3) {
940 dev_dbg(rtsx_dev(chip), "read/write fail three times in succession\n");
941 if (srb->sc_data_direction == DMA_FROM_DEVICE)
942 set_sense_type(chip, lun,
943 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
945 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
947 TRACE_RET(chip, TRANSPORT_FAILED);
950 if (srb->sc_data_direction == DMA_TO_DEVICE) {
951 if (check_card_wp(chip, lun)) {
952 dev_dbg(rtsx_dev(chip), "Write protected card!\n");
953 set_sense_type(chip, lun,
954 SENSE_TYPE_MEDIA_WRITE_PROTECT);
955 TRACE_RET(chip, TRANSPORT_FAILED);
959 retval = card_rw(srb, chip, start_sec, sec_cnt);
960 if (retval != STATUS_SUCCESS) {
961 if (chip->need_release & chip->lun2card[lun]) {
962 chip->rw_fail_cnt[lun] = 0;
963 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
965 chip->rw_fail_cnt[lun]++;
966 if (srb->sc_data_direction == DMA_FROM_DEVICE)
967 set_sense_type(chip, lun,
968 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
970 set_sense_type(chip, lun,
971 SENSE_TYPE_MEDIA_WRITE_ERR);
973 retval = TRANSPORT_FAILED;
974 TRACE_GOTO(chip, Exit);
976 chip->rw_fail_cnt[lun] = 0;
977 retval = TRANSPORT_GOOD;
980 scsi_set_resid(srb, 0);
986 static int read_format_capacity(struct scsi_cmnd *srb, struct rtsx_chip *chip)
989 unsigned int lun = SCSI_LUN(srb);
990 unsigned int buf_len;
991 u8 card = get_lun_card(chip, lun);
996 if (!check_card_ready(chip, lun)) {
997 if (!chip->mspro_formatter_enable) {
998 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
999 TRACE_RET(chip, TRANSPORT_FAILED);
1003 buf_len = (scsi_bufflen(srb) > 12) ? 0x14 : 12;
1005 buf = kmalloc(buf_len, GFP_KERNEL);
1007 TRACE_RET(chip, TRANSPORT_ERROR);
1013 /* Capacity List Length */
1014 if ((buf_len > 12) && chip->mspro_formatter_enable &&
1015 (chip->lun2card[lun] & MS_CARD) &&
1016 (!card || (card == MS_CARD))) {
1025 if (check_card_ready(chip, lun)) {
1026 card_size = get_card_size(chip, lun);
1027 buf[i++] = (unsigned char)(card_size >> 24);
1028 buf[i++] = (unsigned char)(card_size >> 16);
1029 buf[i++] = (unsigned char)(card_size >> 8);
1030 buf[i++] = (unsigned char)card_size;
1055 buf_len = min_t(unsigned int, scsi_bufflen(srb), buf_len);
1056 rtsx_stor_set_xfer_buf(buf, buf_len, srb);
1059 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
1061 return TRANSPORT_GOOD;
1064 static int read_capacity(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1067 unsigned int lun = SCSI_LUN(srb);
1070 if (!check_card_ready(chip, lun)) {
1071 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1072 TRACE_RET(chip, TRANSPORT_FAILED);
1075 if (!(CHK_BIT(chip->lun_mc, lun))) {
1076 SET_BIT(chip->lun_mc, lun);
1077 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
1078 return TRANSPORT_FAILED;
1081 buf = kmalloc(8, GFP_KERNEL);
1083 TRACE_RET(chip, TRANSPORT_ERROR);
1085 card_size = get_card_size(chip, lun);
1086 buf[0] = (unsigned char)((card_size - 1) >> 24);
1087 buf[1] = (unsigned char)((card_size - 1) >> 16);
1088 buf[2] = (unsigned char)((card_size - 1) >> 8);
1089 buf[3] = (unsigned char)(card_size - 1);
1096 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
1099 scsi_set_resid(srb, 0);
1101 return TRANSPORT_GOOD;
1104 static int read_eeprom(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1106 unsigned short len, i;
1110 rtsx_disable_aspm(chip);
1112 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1116 rtsx_set_stat(chip, RTSX_STAT_RUN);
1118 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1122 TRACE_RET(chip, TRANSPORT_ERROR);
1124 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1125 if (retval != STATUS_SUCCESS) {
1127 set_sense_type(chip, SCSI_LUN(srb),
1128 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1129 TRACE_RET(chip, TRANSPORT_FAILED);
1132 for (i = 0; i < len; i++) {
1133 retval = spi_read_eeprom(chip, i, buf + i);
1134 if (retval != STATUS_SUCCESS) {
1136 set_sense_type(chip, SCSI_LUN(srb),
1137 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1138 TRACE_RET(chip, TRANSPORT_FAILED);
1142 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
1143 rtsx_stor_set_xfer_buf(buf, len, srb);
1144 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1148 return TRANSPORT_GOOD;
1151 static int write_eeprom(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1153 unsigned short len, i;
1157 rtsx_disable_aspm(chip);
1159 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1163 rtsx_set_stat(chip, RTSX_STAT_RUN);
1165 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1167 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1168 if (retval != STATUS_SUCCESS) {
1169 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1170 TRACE_RET(chip, TRANSPORT_FAILED);
1174 retval = spi_erase_eeprom_chip(chip);
1175 if (retval != STATUS_SUCCESS) {
1176 set_sense_type(chip, SCSI_LUN(srb),
1177 SENSE_TYPE_MEDIA_WRITE_ERR);
1178 TRACE_RET(chip, TRANSPORT_FAILED);
1181 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb),
1185 TRACE_RET(chip, TRANSPORT_ERROR);
1187 rtsx_stor_get_xfer_buf(buf, len, srb);
1188 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1190 for (i = 0; i < len; i++) {
1191 retval = spi_write_eeprom(chip, i, buf[i]);
1192 if (retval != STATUS_SUCCESS) {
1194 set_sense_type(chip, SCSI_LUN(srb),
1195 SENSE_TYPE_MEDIA_WRITE_ERR);
1196 TRACE_RET(chip, TRANSPORT_FAILED);
1203 return TRANSPORT_GOOD;
1206 static int read_mem(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1208 unsigned short addr, len, i;
1212 rtsx_disable_aspm(chip);
1214 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1218 rtsx_set_stat(chip, RTSX_STAT_RUN);
1220 addr = ((u16)srb->cmnd[2] << 8) | srb->cmnd[3];
1221 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1223 if (addr < 0xFC00) {
1224 set_sense_type(chip, SCSI_LUN(srb),
1225 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1226 TRACE_RET(chip, TRANSPORT_FAILED);
1231 TRACE_RET(chip, TRANSPORT_ERROR);
1233 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1234 if (retval != STATUS_SUCCESS) {
1236 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1237 TRACE_RET(chip, TRANSPORT_FAILED);
1240 for (i = 0; i < len; i++) {
1241 retval = rtsx_read_register(chip, addr + i, buf + i);
1242 if (retval != STATUS_SUCCESS) {
1244 set_sense_type(chip, SCSI_LUN(srb),
1245 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1246 TRACE_RET(chip, TRANSPORT_FAILED);
1250 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
1251 rtsx_stor_set_xfer_buf(buf, len, srb);
1252 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1256 return TRANSPORT_GOOD;
1259 static int write_mem(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1261 unsigned short addr, len, i;
1265 rtsx_disable_aspm(chip);
1267 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1271 rtsx_set_stat(chip, RTSX_STAT_RUN);
1273 addr = ((u16)srb->cmnd[2] << 8) | srb->cmnd[3];
1274 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1276 if (addr < 0xFC00) {
1277 set_sense_type(chip, SCSI_LUN(srb),
1278 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1279 TRACE_RET(chip, TRANSPORT_FAILED);
1282 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
1285 TRACE_RET(chip, TRANSPORT_ERROR);
1287 rtsx_stor_get_xfer_buf(buf, len, srb);
1288 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1290 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1291 if (retval != STATUS_SUCCESS) {
1293 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1294 TRACE_RET(chip, TRANSPORT_FAILED);
1297 for (i = 0; i < len; i++) {
1298 retval = rtsx_write_register(chip, addr + i, 0xFF, buf[i]);
1299 if (retval != STATUS_SUCCESS) {
1301 set_sense_type(chip, SCSI_LUN(srb),
1302 SENSE_TYPE_MEDIA_WRITE_ERR);
1303 TRACE_RET(chip, TRANSPORT_FAILED);
1309 return TRANSPORT_GOOD;
1312 static int get_sd_csd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1314 struct sd_info *sd_card = &(chip->sd_card);
1315 unsigned int lun = SCSI_LUN(srb);
1317 if (!check_card_ready(chip, lun)) {
1318 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1319 TRACE_RET(chip, TRANSPORT_FAILED);
1322 if (get_lun_card(chip, lun) != SD_CARD) {
1323 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1324 TRACE_RET(chip, TRANSPORT_FAILED);
1327 scsi_set_resid(srb, 0);
1328 rtsx_stor_set_xfer_buf(sd_card->raw_csd, scsi_bufflen(srb), srb);
1330 return TRANSPORT_GOOD;
1333 static int toggle_gpio_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1335 u8 gpio = srb->cmnd[2];
1337 rtsx_disable_aspm(chip);
1339 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1343 rtsx_set_stat(chip, RTSX_STAT_RUN);
1347 toggle_gpio(chip, gpio);
1349 return TRANSPORT_GOOD;
1353 static int trace_msg_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1355 unsigned char *ptr, *buf = NULL;
1358 unsigned int buf_len;
1360 buf_len = 4 + ((2 + MSG_FUNC_LEN + MSG_FILE_LEN + TIME_VAL_LEN) *
1363 if ((scsi_bufflen(srb) < buf_len) || (scsi_sglist(srb) == NULL)) {
1364 set_sense_type(chip, SCSI_LUN(srb),
1365 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1366 TRACE_RET(chip, TRANSPORT_FAILED);
1369 clear = srb->cmnd[2];
1371 buf = vmalloc(scsi_bufflen(srb));
1373 TRACE_RET(chip, TRANSPORT_ERROR);
1376 if (chip->trace_msg[chip->msg_idx].valid)
1377 msg_cnt = TRACE_ITEM_CNT;
1379 msg_cnt = chip->msg_idx;
1381 *(ptr++) = (u8)(msg_cnt >> 24);
1382 *(ptr++) = (u8)(msg_cnt >> 16);
1383 *(ptr++) = (u8)(msg_cnt >> 8);
1384 *(ptr++) = (u8)msg_cnt;
1385 dev_dbg(rtsx_dev(chip), "Trace message count is %d\n", msg_cnt);
1387 for (i = 1; i <= msg_cnt; i++) {
1390 idx = chip->msg_idx - i;
1392 idx += TRACE_ITEM_CNT;
1394 *(ptr++) = (u8)(chip->trace_msg[idx].line >> 8);
1395 *(ptr++) = (u8)(chip->trace_msg[idx].line);
1396 for (j = 0; j < MSG_FUNC_LEN; j++)
1397 *(ptr++) = chip->trace_msg[idx].func[j];
1399 for (j = 0; j < MSG_FILE_LEN; j++)
1400 *(ptr++) = chip->trace_msg[idx].file[j];
1402 for (j = 0; j < TIME_VAL_LEN; j++)
1403 *(ptr++) = chip->trace_msg[idx].timeval_buf[j];
1406 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
1411 for (i = 0; i < TRACE_ITEM_CNT; i++)
1412 chip->trace_msg[i].valid = 0;
1415 scsi_set_resid(srb, 0);
1416 return TRANSPORT_GOOD;
1420 static int read_host_reg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1426 rtsx_disable_aspm(chip);
1428 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1432 rtsx_set_stat(chip, RTSX_STAT_RUN);
1434 addr = srb->cmnd[4];
1436 val = rtsx_readl(chip, addr);
1437 dev_dbg(rtsx_dev(chip), "Host register (0x%x): 0x%x\n", addr, val);
1439 buf[0] = (u8)(val >> 24);
1440 buf[1] = (u8)(val >> 16);
1441 buf[2] = (u8)(val >> 8);
1444 len = min_t(unsigned int, scsi_bufflen(srb), 4);
1445 rtsx_stor_set_xfer_buf(buf, len, srb);
1446 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1448 return TRANSPORT_GOOD;
1451 static int write_host_reg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1457 rtsx_disable_aspm(chip);
1459 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1463 rtsx_set_stat(chip, RTSX_STAT_RUN);
1465 addr = srb->cmnd[4];
1467 len = min_t(unsigned int, scsi_bufflen(srb), 4);
1468 rtsx_stor_get_xfer_buf(buf, len, srb);
1469 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1471 val = ((u32)buf[0] << 24) | ((u32)buf[1] << 16) | ((u32)buf[2]
1474 rtsx_writel(chip, addr, val);
1476 return TRANSPORT_GOOD;
1479 static int set_variable(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1481 unsigned lun = SCSI_LUN(srb);
1483 if (srb->cmnd[3] == 1) {
1484 /* Variable Clock */
1485 struct xd_info *xd_card = &(chip->xd_card);
1486 struct sd_info *sd_card = &(chip->sd_card);
1487 struct ms_info *ms_card = &(chip->ms_card);
1489 switch (srb->cmnd[4]) {
1491 xd_card->xd_clock = srb->cmnd[5];
1495 sd_card->sd_clock = srb->cmnd[5];
1499 ms_card->ms_clock = srb->cmnd[5];
1503 set_sense_type(chip, lun,
1504 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1505 TRACE_RET(chip, TRANSPORT_FAILED);
1507 } else if (srb->cmnd[3] == 2) {
1509 chip->blink_led = 1;
1513 chip->blink_led = 0;
1515 rtsx_disable_aspm(chip);
1518 (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1522 rtsx_set_stat(chip, RTSX_STAT_RUN);
1524 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1525 if (retval != STATUS_SUCCESS) {
1526 set_sense_type(chip, SCSI_LUN(srb),
1527 SENSE_TYPE_MEDIA_WRITE_ERR);
1528 TRACE_RET(chip, TRANSPORT_FAILED);
1531 turn_off_led(chip, LED_GPIO);
1534 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1535 TRACE_RET(chip, TRANSPORT_FAILED);
1538 return TRANSPORT_GOOD;
1541 static int get_variable(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1543 unsigned int lun = SCSI_LUN(srb);
1545 if (srb->cmnd[3] == 1) {
1546 struct xd_info *xd_card = &(chip->xd_card);
1547 struct sd_info *sd_card = &(chip->sd_card);
1548 struct ms_info *ms_card = &(chip->ms_card);
1551 switch (srb->cmnd[4]) {
1553 tmp = (u8)(xd_card->xd_clock);
1557 tmp = (u8)(sd_card->sd_clock);
1561 tmp = (u8)(ms_card->ms_clock);
1565 set_sense_type(chip, lun,
1566 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1567 TRACE_RET(chip, TRANSPORT_FAILED);
1570 rtsx_stor_set_xfer_buf(&tmp, 1, srb);
1571 } else if (srb->cmnd[3] == 2) {
1572 u8 tmp = chip->blink_led;
1574 rtsx_stor_set_xfer_buf(&tmp, 1, srb);
1576 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1577 TRACE_RET(chip, TRANSPORT_FAILED);
1580 return TRANSPORT_GOOD;
1583 static int dma_access_ring_buffer(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1586 unsigned int lun = SCSI_LUN(srb);
1589 rtsx_disable_aspm(chip);
1591 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1595 rtsx_set_stat(chip, RTSX_STAT_RUN);
1597 len = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
1598 len = min_t(u16, len, scsi_bufflen(srb));
1600 if (srb->sc_data_direction == DMA_FROM_DEVICE)
1601 dev_dbg(rtsx_dev(chip), "Read from device\n");
1603 dev_dbg(rtsx_dev(chip), "Write to device\n");
1605 retval = rtsx_transfer_data(chip, 0, scsi_sglist(srb), len,
1606 scsi_sg_count(srb), srb->sc_data_direction, 1000);
1608 if (srb->sc_data_direction == DMA_FROM_DEVICE)
1609 set_sense_type(chip, lun,
1610 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1612 set_sense_type(chip, lun,
1613 SENSE_TYPE_MEDIA_WRITE_ERR);
1615 TRACE_RET(chip, TRANSPORT_FAILED);
1617 scsi_set_resid(srb, 0);
1619 return TRANSPORT_GOOD;
1622 static int get_dev_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1624 struct sd_info *sd_card = &(chip->sd_card);
1625 struct ms_info *ms_card = &(chip->ms_card);
1627 unsigned int lun = SCSI_LUN(srb);
1628 u8 card = get_lun_card(chip, lun);
1631 u8 oc_now_mask = 0, oc_ever_mask = 0;
1634 memset(status, 0, 32);
1636 status[0] = (u8)(chip->product_id);
1637 status[1] = chip->ic_version;
1639 if (chip->auto_delink_en)
1656 if (CHECK_LUN_MODE(chip,
1657 SD_MS_2LUN) && (chip->lun2card[lun] == MS_CARD)) {
1658 oc_now_mask = MS_OC_NOW;
1659 oc_ever_mask = MS_OC_EVER;
1661 oc_now_mask = SD_OC_NOW;
1662 oc_ever_mask = SD_OC_EVER;
1665 if (chip->ocp_stat & oc_now_mask)
1668 if (chip->ocp_stat & oc_ever_mask)
1672 if (card == SD_CARD) {
1673 if (CHK_SD(sd_card)) {
1674 if (CHK_SD_HCXC(sd_card)) {
1675 if (sd_card->capacity > 0x4000000)
1676 status[0x0E] = 0x02;
1678 status[0x0E] = 0x01;
1680 status[0x0E] = 0x00;
1683 if (CHK_SD_SDR104(sd_card))
1684 status[0x0F] = 0x03;
1685 else if (CHK_SD_DDR50(sd_card))
1686 status[0x0F] = 0x04;
1687 else if (CHK_SD_SDR50(sd_card))
1688 status[0x0F] = 0x02;
1689 else if (CHK_SD_HS(sd_card))
1690 status[0x0F] = 0x01;
1692 status[0x0F] = 0x00;
1694 if (CHK_MMC_SECTOR_MODE(sd_card))
1695 status[0x0E] = 0x01;
1697 status[0x0E] = 0x00;
1699 if (CHK_MMC_DDR52(sd_card))
1700 status[0x0F] = 0x03;
1701 else if (CHK_MMC_52M(sd_card))
1702 status[0x0F] = 0x02;
1703 else if (CHK_MMC_26M(sd_card))
1704 status[0x0F] = 0x01;
1706 status[0x0F] = 0x00;
1708 } else if (card == MS_CARD) {
1709 if (CHK_MSPRO(ms_card)) {
1710 if (CHK_MSXC(ms_card))
1711 status[0x0E] = 0x01;
1713 status[0x0E] = 0x00;
1715 if (CHK_HG8BIT(ms_card))
1716 status[0x0F] = 0x01;
1718 status[0x0F] = 0x00;
1722 #ifdef SUPPORT_SD_LOCK
1723 if (card == SD_CARD) {
1724 status[0x17] = 0x80;
1725 if (sd_card->sd_erase_status)
1726 status[0x17] |= 0x01;
1727 if (sd_card->sd_lock_status & SD_LOCKED) {
1728 status[0x17] |= 0x02;
1729 status[0x07] |= 0x40;
1731 if (sd_card->sd_lock_status & SD_PWD_EXIST)
1732 status[0x17] |= 0x04;
1734 status[0x17] = 0x00;
1737 dev_dbg(rtsx_dev(chip), "status[0x17] = 0x%x\n", status[0x17]);
1740 status[0x18] = 0x8A;
1741 status[0x1A] = 0x28;
1742 #ifdef SUPPORT_SD_LOCK
1743 status[0x1F] = 0x01;
1746 buf_len = min_t(unsigned int, scsi_bufflen(srb), sizeof(status));
1747 rtsx_stor_set_xfer_buf(status, buf_len, srb);
1748 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
1750 return TRANSPORT_GOOD;
1753 static int set_chip_mode(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1759 if (!CHECK_PID(chip, 0x5208)) {
1760 set_sense_type(chip, SCSI_LUN(srb),
1761 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1762 TRACE_RET(chip, TRANSPORT_FAILED);
1765 phy_debug_mode = (int)(srb->cmnd[3]);
1767 if (phy_debug_mode) {
1768 chip->phy_debug_mode = 1;
1769 retval = rtsx_write_register(chip, CDRESUMECTL, 0x77, 0);
1770 if (retval != STATUS_SUCCESS)
1771 TRACE_RET(chip, TRANSPORT_FAILED);
1773 rtsx_disable_bus_int(chip);
1775 retval = rtsx_read_phy_register(chip, 0x1C, ®);
1776 if (retval != STATUS_SUCCESS)
1777 TRACE_RET(chip, TRANSPORT_FAILED);
1780 retval = rtsx_write_phy_register(chip, 0x1C, reg);
1781 if (retval != STATUS_SUCCESS)
1782 TRACE_RET(chip, TRANSPORT_FAILED);
1784 chip->phy_debug_mode = 0;
1785 retval = rtsx_write_register(chip, CDRESUMECTL, 0x77, 0x77);
1786 if (retval != STATUS_SUCCESS)
1787 TRACE_RET(chip, TRANSPORT_FAILED);
1789 rtsx_enable_bus_int(chip);
1791 retval = rtsx_read_phy_register(chip, 0x1C, ®);
1792 if (retval != STATUS_SUCCESS)
1793 TRACE_RET(chip, TRANSPORT_FAILED);
1796 retval = rtsx_write_phy_register(chip, 0x1C, reg);
1797 if (retval != STATUS_SUCCESS)
1798 TRACE_RET(chip, TRANSPORT_FAILED);
1801 return TRANSPORT_GOOD;
1804 static int rw_mem_cmd_buf(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1806 int retval = STATUS_SUCCESS;
1807 unsigned int lun = SCSI_LUN(srb);
1808 u8 cmd_type, mask, value, idx;
1811 rtsx_disable_aspm(chip);
1813 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1817 rtsx_set_stat(chip, RTSX_STAT_RUN);
1819 switch (srb->cmnd[3]) {
1821 rtsx_init_cmd(chip);
1825 cmd_type = srb->cmnd[4];
1827 set_sense_type(chip, lun,
1828 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1829 TRACE_RET(chip, TRANSPORT_FAILED);
1831 addr = (srb->cmnd[5] << 8) | srb->cmnd[6];
1832 mask = srb->cmnd[7];
1833 value = srb->cmnd[8];
1834 rtsx_add_cmd(chip, cmd_type, addr, mask, value);
1838 retval = rtsx_send_cmd(chip, 0, 1000);
1843 value = *(rtsx_get_cmd_data(chip) + idx);
1844 if (scsi_bufflen(srb) < 1) {
1845 set_sense_type(chip, lun,
1846 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1847 TRACE_RET(chip, TRANSPORT_FAILED);
1849 rtsx_stor_set_xfer_buf(&value, 1, srb);
1850 scsi_set_resid(srb, 0);
1854 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1855 TRACE_RET(chip, TRANSPORT_FAILED);
1858 if (retval != STATUS_SUCCESS) {
1859 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
1860 TRACE_RET(chip, TRANSPORT_FAILED);
1863 return TRANSPORT_GOOD;
1866 static int suit_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1870 switch (srb->cmnd[3]) {
1875 result = rw_mem_cmd_buf(srb, chip);
1878 result = TRANSPORT_ERROR;
1884 static int read_phy_register(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1886 unsigned short addr, len, i;
1891 rtsx_disable_aspm(chip);
1893 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1897 rtsx_set_stat(chip, RTSX_STAT_RUN);
1899 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1900 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1908 TRACE_RET(chip, TRANSPORT_ERROR);
1910 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1911 if (retval != STATUS_SUCCESS) {
1913 set_sense_type(chip, SCSI_LUN(srb),
1914 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1915 TRACE_RET(chip, TRANSPORT_FAILED);
1918 for (i = 0; i < len / 2; i++) {
1919 retval = rtsx_read_phy_register(chip, addr + i, &val);
1920 if (retval != STATUS_SUCCESS) {
1922 set_sense_type(chip, SCSI_LUN(srb),
1923 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1924 TRACE_RET(chip, TRANSPORT_FAILED);
1927 buf[2*i] = (u8)(val >> 8);
1928 buf[2*i+1] = (u8)val;
1931 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb),
1933 rtsx_stor_set_xfer_buf(buf, len, srb);
1934 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1939 return TRANSPORT_GOOD;
1942 static int write_phy_register(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1944 unsigned short addr, len, i;
1949 rtsx_disable_aspm(chip);
1951 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1955 rtsx_set_stat(chip, RTSX_STAT_RUN);
1957 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1958 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1964 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb),
1969 TRACE_RET(chip, TRANSPORT_ERROR);
1971 rtsx_stor_get_xfer_buf(buf, len, srb);
1972 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1974 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1975 if (retval != STATUS_SUCCESS) {
1977 set_sense_type(chip, SCSI_LUN(srb),
1978 SENSE_TYPE_MEDIA_WRITE_ERR);
1979 TRACE_RET(chip, TRANSPORT_FAILED);
1982 for (i = 0; i < len / 2; i++) {
1983 val = ((u16)buf[2*i] << 8) | buf[2*i+1];
1984 retval = rtsx_write_phy_register(chip, addr + i, val);
1985 if (retval != STATUS_SUCCESS) {
1987 set_sense_type(chip, SCSI_LUN(srb),
1988 SENSE_TYPE_MEDIA_WRITE_ERR);
1989 TRACE_RET(chip, TRANSPORT_FAILED);
1996 return TRANSPORT_GOOD;
1999 static int erase_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2001 unsigned short addr;
2005 rtsx_disable_aspm(chip);
2007 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2011 rtsx_set_stat(chip, RTSX_STAT_RUN);
2013 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2014 if (retval != STATUS_SUCCESS) {
2015 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
2016 TRACE_RET(chip, TRANSPORT_FAILED);
2019 mode = srb->cmnd[3];
2020 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
2023 retval = spi_erase_eeprom_chip(chip);
2024 if (retval != STATUS_SUCCESS) {
2025 set_sense_type(chip, SCSI_LUN(srb),
2026 SENSE_TYPE_MEDIA_WRITE_ERR);
2027 TRACE_RET(chip, TRANSPORT_FAILED);
2029 } else if (mode == 1) {
2030 retval = spi_erase_eeprom_byte(chip, addr);
2031 if (retval != STATUS_SUCCESS) {
2032 set_sense_type(chip, SCSI_LUN(srb),
2033 SENSE_TYPE_MEDIA_WRITE_ERR);
2034 TRACE_RET(chip, TRANSPORT_FAILED);
2037 set_sense_type(chip, SCSI_LUN(srb),
2038 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2039 TRACE_RET(chip, TRANSPORT_FAILED);
2042 return TRANSPORT_GOOD;
2045 static int read_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2047 unsigned short addr, len, i;
2051 rtsx_disable_aspm(chip);
2053 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2057 rtsx_set_stat(chip, RTSX_STAT_RUN);
2059 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
2060 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
2064 TRACE_RET(chip, TRANSPORT_ERROR);
2066 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2067 if (retval != STATUS_SUCCESS) {
2069 set_sense_type(chip, SCSI_LUN(srb),
2070 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2071 TRACE_RET(chip, TRANSPORT_FAILED);
2074 for (i = 0; i < len; i++) {
2075 retval = spi_read_eeprom(chip, addr + i, buf + i);
2076 if (retval != STATUS_SUCCESS) {
2078 set_sense_type(chip, SCSI_LUN(srb),
2079 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2080 TRACE_RET(chip, TRANSPORT_FAILED);
2084 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
2085 rtsx_stor_set_xfer_buf(buf, len, srb);
2086 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2090 return TRANSPORT_GOOD;
2093 static int write_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2095 unsigned short addr, len, i;
2099 rtsx_disable_aspm(chip);
2101 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2105 rtsx_set_stat(chip, RTSX_STAT_RUN);
2107 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
2108 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
2110 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
2113 TRACE_RET(chip, TRANSPORT_ERROR);
2115 rtsx_stor_get_xfer_buf(buf, len, srb);
2116 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2118 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2119 if (retval != STATUS_SUCCESS) {
2121 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
2122 TRACE_RET(chip, TRANSPORT_FAILED);
2125 for (i = 0; i < len; i++) {
2126 retval = spi_write_eeprom(chip, addr + i, buf[i]);
2127 if (retval != STATUS_SUCCESS) {
2129 set_sense_type(chip, SCSI_LUN(srb),
2130 SENSE_TYPE_MEDIA_WRITE_ERR);
2131 TRACE_RET(chip, TRANSPORT_FAILED);
2137 return TRANSPORT_GOOD;
2140 static int read_efuse(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2146 rtsx_disable_aspm(chip);
2148 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2152 rtsx_set_stat(chip, RTSX_STAT_RUN);
2154 addr = srb->cmnd[4];
2159 TRACE_RET(chip, TRANSPORT_ERROR);
2161 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2162 if (retval != STATUS_SUCCESS) {
2164 set_sense_type(chip, SCSI_LUN(srb),
2165 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2166 TRACE_RET(chip, TRANSPORT_FAILED);
2169 for (i = 0; i < len; i++) {
2170 retval = rtsx_read_efuse(chip, addr + i, buf + i);
2171 if (retval != STATUS_SUCCESS) {
2173 set_sense_type(chip, SCSI_LUN(srb),
2174 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2175 TRACE_RET(chip, TRANSPORT_FAILED);
2179 len = (u8)min_t(unsigned int, scsi_bufflen(srb), len);
2180 rtsx_stor_set_xfer_buf(buf, len, srb);
2181 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2185 return TRANSPORT_GOOD;
2188 static int write_efuse(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2190 int retval, result = TRANSPORT_GOOD;
2195 rtsx_disable_aspm(chip);
2197 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2201 rtsx_set_stat(chip, RTSX_STAT_RUN);
2203 addr = srb->cmnd[4];
2206 len = (u8)min_t(unsigned int, scsi_bufflen(srb), len);
2209 TRACE_RET(chip, TRANSPORT_ERROR);
2211 rtsx_stor_get_xfer_buf(buf, len, srb);
2212 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2214 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2215 if (retval != STATUS_SUCCESS) {
2217 TRACE_RET(chip, TRANSPORT_ERROR);
2220 if (chip->asic_code) {
2221 retval = rtsx_read_phy_register(chip, 0x08, &val);
2222 if (retval != STATUS_SUCCESS) {
2224 TRACE_RET(chip, TRANSPORT_ERROR);
2227 retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2228 LDO3318_PWR_MASK, LDO_OFF);
2229 if (retval != STATUS_SUCCESS) {
2231 TRACE_RET(chip, TRANSPORT_ERROR);
2236 retval = rtsx_write_phy_register(chip, 0x08,
2237 0x4C00 | chip->phy_voltage);
2238 if (retval != STATUS_SUCCESS) {
2240 TRACE_RET(chip, TRANSPORT_ERROR);
2243 retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2244 LDO3318_PWR_MASK, LDO_ON);
2245 if (retval != STATUS_SUCCESS) {
2247 TRACE_RET(chip, TRANSPORT_ERROR);
2253 retval = card_power_on(chip, SPI_CARD);
2254 if (retval != STATUS_SUCCESS) {
2256 TRACE_RET(chip, TRANSPORT_ERROR);
2261 for (i = 0; i < len; i++) {
2262 retval = rtsx_write_efuse(chip, addr + i, buf[i]);
2263 if (retval != STATUS_SUCCESS) {
2264 set_sense_type(chip, SCSI_LUN(srb),
2265 SENSE_TYPE_MEDIA_WRITE_ERR);
2266 result = TRANSPORT_FAILED;
2267 TRACE_GOTO(chip, Exit);
2274 retval = card_power_off(chip, SPI_CARD);
2275 if (retval != STATUS_SUCCESS)
2276 TRACE_RET(chip, TRANSPORT_ERROR);
2278 if (chip->asic_code) {
2279 retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2280 LDO3318_PWR_MASK, LDO_OFF);
2281 if (retval != STATUS_SUCCESS)
2282 TRACE_RET(chip, TRANSPORT_ERROR);
2286 retval = rtsx_write_phy_register(chip, 0x08, val);
2287 if (retval != STATUS_SUCCESS)
2288 TRACE_RET(chip, TRANSPORT_ERROR);
2290 retval = rtsx_write_register(chip, PWR_GATE_CTRL,
2291 LDO3318_PWR_MASK, LDO_ON);
2292 if (retval != STATUS_SUCCESS)
2293 TRACE_RET(chip, TRANSPORT_ERROR);
2299 static int read_cfg_byte(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2306 rtsx_disable_aspm(chip);
2308 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2312 rtsx_set_stat(chip, RTSX_STAT_RUN);
2314 func = srb->cmnd[3];
2315 addr = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
2316 len = ((u16)(srb->cmnd[6]) << 8) | srb->cmnd[7];
2318 dev_dbg(rtsx_dev(chip), "%s: func = %d, addr = 0x%x, len = %d\n",
2319 __func__, func, addr, len);
2321 if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip))
2326 if (func > func_max) {
2327 set_sense_type(chip, SCSI_LUN(srb),
2328 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2329 TRACE_RET(chip, TRANSPORT_FAILED);
2334 TRACE_RET(chip, TRANSPORT_ERROR);
2336 retval = rtsx_read_cfg_seq(chip, func, addr, buf, len);
2337 if (retval != STATUS_SUCCESS) {
2338 set_sense_type(chip, SCSI_LUN(srb),
2339 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2341 TRACE_RET(chip, TRANSPORT_FAILED);
2344 len = (u16)min_t(unsigned int, scsi_bufflen(srb), len);
2345 rtsx_stor_set_xfer_buf(buf, len, srb);
2346 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2350 return TRANSPORT_GOOD;
2353 static int write_cfg_byte(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2360 rtsx_disable_aspm(chip);
2362 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2366 rtsx_set_stat(chip, RTSX_STAT_RUN);
2368 func = srb->cmnd[3];
2369 addr = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
2370 len = ((u16)(srb->cmnd[6]) << 8) | srb->cmnd[7];
2372 dev_dbg(rtsx_dev(chip), "%s: func = %d, addr = 0x%x\n",
2373 __func__, func, addr);
2375 if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip))
2380 if (func > func_max) {
2381 set_sense_type(chip, SCSI_LUN(srb),
2382 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2383 TRACE_RET(chip, TRANSPORT_FAILED);
2386 len = (unsigned short)min_t(unsigned int, scsi_bufflen(srb), len);
2389 TRACE_RET(chip, TRANSPORT_ERROR);
2391 rtsx_stor_get_xfer_buf(buf, len, srb);
2392 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2394 retval = rtsx_write_cfg_seq(chip, func, addr, buf, len);
2395 if (retval != STATUS_SUCCESS) {
2396 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
2398 TRACE_RET(chip, TRANSPORT_FAILED);
2403 return TRANSPORT_GOOD;
2406 static int app_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2410 switch (srb->cmnd[2]) {
2413 result = read_write(srb, chip);
2417 result = read_host_reg(srb, chip);
2420 case WRITE_HOST_REG:
2421 result = write_host_reg(srb, chip);
2425 result = get_variable(srb, chip);
2429 result = set_variable(srb, chip);
2434 result = dma_access_ring_buffer(srb, chip);
2438 result = read_phy_register(srb, chip);
2442 result = write_phy_register(srb, chip);
2446 result = erase_eeprom2(srb, chip);
2450 result = read_eeprom2(srb, chip);
2454 result = write_eeprom2(srb, chip);
2458 result = read_efuse(srb, chip);
2462 result = write_efuse(srb, chip);
2466 result = read_cfg_byte(srb, chip);
2470 result = write_cfg_byte(srb, chip);
2474 result = set_chip_mode(srb, chip);
2478 result = suit_cmd(srb, chip);
2481 case GET_DEV_STATUS:
2482 result = get_dev_status(srb, chip);
2486 set_sense_type(chip, SCSI_LUN(srb),
2487 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2488 TRACE_RET(chip, TRANSPORT_FAILED);
2495 static int read_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2499 unsigned int lun = SCSI_LUN(srb);
2501 rtsx_status[0] = (u8)(chip->vendor_id >> 8);
2502 rtsx_status[1] = (u8)(chip->vendor_id);
2504 rtsx_status[2] = (u8)(chip->product_id >> 8);
2505 rtsx_status[3] = (u8)(chip->product_id);
2507 rtsx_status[4] = (u8)lun;
2509 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
2510 if (chip->lun2card[lun] == SD_CARD)
2515 if (chip->card_exist) {
2516 if (chip->card_exist & XD_CARD)
2518 else if (chip->card_exist & SD_CARD)
2520 else if (chip->card_exist & MS_CARD)
2529 if (CHECK_LUN_MODE(chip, SD_MS_2LUN))
2534 rtsx_status[7] = (u8)(chip->product_id);
2535 rtsx_status[8] = chip->ic_version;
2537 if (check_card_exist(chip, lun))
2542 if (CHECK_LUN_MODE(chip, SD_MS_2LUN))
2543 rtsx_status[10] = 0;
2545 rtsx_status[10] = 1;
2547 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
2548 if (chip->lun2card[lun] == SD_CARD)
2549 rtsx_status[11] = SD_CARD;
2551 rtsx_status[11] = MS_CARD;
2553 rtsx_status[11] = XD_CARD | SD_CARD | MS_CARD;
2556 if (check_card_ready(chip, lun))
2557 rtsx_status[12] = 1;
2559 rtsx_status[12] = 0;
2561 if (get_lun_card(chip, lun) == XD_CARD) {
2562 rtsx_status[13] = 0x40;
2563 } else if (get_lun_card(chip, lun) == SD_CARD) {
2564 struct sd_info *sd_card = &(chip->sd_card);
2566 rtsx_status[13] = 0x20;
2567 if (CHK_SD(sd_card)) {
2568 if (CHK_SD_HCXC(sd_card))
2569 rtsx_status[13] |= 0x04;
2570 if (CHK_SD_HS(sd_card))
2571 rtsx_status[13] |= 0x02;
2573 rtsx_status[13] |= 0x08;
2574 if (CHK_MMC_52M(sd_card))
2575 rtsx_status[13] |= 0x02;
2576 if (CHK_MMC_SECTOR_MODE(sd_card))
2577 rtsx_status[13] |= 0x04;
2579 } else if (get_lun_card(chip, lun) == MS_CARD) {
2580 struct ms_info *ms_card = &(chip->ms_card);
2582 if (CHK_MSPRO(ms_card)) {
2583 rtsx_status[13] = 0x38;
2584 if (CHK_HG8BIT(ms_card))
2585 rtsx_status[13] |= 0x04;
2587 if (CHK_MSXC(ms_card))
2588 rtsx_status[13] |= 0x01;
2591 rtsx_status[13] = 0x30;
2594 if (CHECK_LUN_MODE(chip, DEFAULT_SINGLE)) {
2596 if (chip->sd_io && chip->sd_int)
2597 rtsx_status[13] = 0x60;
2599 rtsx_status[13] = 0x70;
2601 rtsx_status[13] = 0x70;
2604 if (chip->lun2card[lun] == SD_CARD)
2605 rtsx_status[13] = 0x20;
2607 rtsx_status[13] = 0x30;
2611 rtsx_status[14] = 0x78;
2612 if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip))
2613 rtsx_status[15] = 0x83;
2615 rtsx_status[15] = 0x82;
2617 buf_len = min_t(unsigned int, scsi_bufflen(srb), sizeof(rtsx_status));
2618 rtsx_stor_set_xfer_buf(rtsx_status, buf_len, srb);
2619 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
2621 return TRANSPORT_GOOD;
2624 static int get_card_bus_width(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2626 unsigned int lun = SCSI_LUN(srb);
2629 if (!check_card_ready(chip, lun)) {
2630 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2631 TRACE_RET(chip, TRANSPORT_FAILED);
2634 card = get_lun_card(chip, lun);
2635 if ((card == SD_CARD) || (card == MS_CARD)) {
2636 bus_width = chip->card_bus_width[lun];
2638 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2639 TRACE_RET(chip, TRANSPORT_FAILED);
2642 scsi_set_resid(srb, 0);
2643 rtsx_stor_set_xfer_buf(&bus_width, scsi_bufflen(srb), srb);
2645 return TRANSPORT_GOOD;
2648 static int spi_vendor_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2651 unsigned int lun = SCSI_LUN(srb);
2654 if (CHECK_PID(chip, 0x5208) || CHECK_PID(chip, 0x5288)) {
2655 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2656 TRACE_RET(chip, TRANSPORT_FAILED);
2659 rtsx_disable_aspm(chip);
2661 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2665 rtsx_set_stat(chip, RTSX_STAT_RUN);
2667 rtsx_force_power_on(chip, SSC_PDCTL);
2669 rtsx_read_register(chip, CARD_GPIO_DIR, &gpio_dir);
2670 rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir & 0x06);
2672 switch (srb->cmnd[2]) {
2673 case SCSI_SPI_GETSTATUS:
2674 result = spi_get_status(srb, chip);
2677 case SCSI_SPI_SETPARAMETER:
2678 result = spi_set_parameter(srb, chip);
2681 case SCSI_SPI_READFALSHID:
2682 result = spi_read_flash_id(srb, chip);
2685 case SCSI_SPI_READFLASH:
2686 result = spi_read_flash(srb, chip);
2689 case SCSI_SPI_WRITEFLASH:
2690 result = spi_write_flash(srb, chip);
2693 case SCSI_SPI_WRITEFLASHSTATUS:
2694 result = spi_write_flash_status(srb, chip);
2697 case SCSI_SPI_ERASEFLASH:
2698 result = spi_erase_flash(srb, chip);
2702 rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir);
2704 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2705 TRACE_RET(chip, TRANSPORT_FAILED);
2708 rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir);
2710 if (result != STATUS_SUCCESS)
2711 TRACE_RET(chip, TRANSPORT_FAILED);
2713 return TRANSPORT_GOOD;
2716 static int vendor_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2720 switch (srb->cmnd[1]) {
2722 result = read_status(srb, chip);
2726 result = read_mem(srb, chip);
2730 result = write_mem(srb, chip);
2734 result = read_eeprom(srb, chip);
2738 result = write_eeprom(srb, chip);
2742 result = toggle_gpio_cmd(srb, chip);
2746 result = get_sd_csd(srb, chip);
2750 result = get_card_bus_width(srb, chip);
2755 result = trace_msg_cmd(srb, chip);
2760 result = app_cmd(srb, chip);
2763 case SPI_VENDOR_COMMAND:
2764 result = spi_vendor_cmd(srb, chip);
2768 set_sense_type(chip, SCSI_LUN(srb),
2769 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2770 TRACE_RET(chip, TRANSPORT_FAILED);
2776 #if !defined(LED_AUTO_BLINK) && !defined(REGULAR_BLINK)
2777 void led_shine(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2779 unsigned int lun = SCSI_LUN(srb);
2782 if ((srb->cmnd[0] == READ_10) || (srb->cmnd[0] == WRITE_10))
2783 sec_cnt = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
2784 else if ((srb->cmnd[0] == READ_6) || (srb->cmnd[0] == WRITE_6))
2785 sec_cnt = srb->cmnd[4];
2789 if (chip->rw_cap[lun] >= GPIO_TOGGLE_THRESHOLD) {
2790 toggle_gpio(chip, LED_GPIO);
2791 chip->rw_cap[lun] = 0;
2793 chip->rw_cap[lun] += sec_cnt;
2798 static int ms_format_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2800 struct ms_info *ms_card = &(chip->ms_card);
2801 unsigned int lun = SCSI_LUN(srb);
2802 int retval, quick_format;
2804 if (get_lun_card(chip, lun) != MS_CARD) {
2805 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2806 TRACE_RET(chip, TRANSPORT_FAILED);
2809 if ((srb->cmnd[3] != 0x4D) || (srb->cmnd[4] != 0x47) ||
2810 (srb->cmnd[5] != 0x66) || (srb->cmnd[6] != 0x6D) ||
2811 (srb->cmnd[7] != 0x74)) {
2812 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2813 TRACE_RET(chip, TRANSPORT_FAILED);
2816 rtsx_disable_aspm(chip);
2818 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2822 if (!check_card_ready(chip, lun) ||
2823 (get_card_size(chip, lun) == 0)) {
2824 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2825 TRACE_RET(chip, TRANSPORT_FAILED);
2828 rtsx_set_stat(chip, RTSX_STAT_RUN);
2830 if (srb->cmnd[8] & 0x01)
2835 if (!(chip->card_ready & MS_CARD)) {
2836 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2837 TRACE_RET(chip, TRANSPORT_FAILED);
2840 if (chip->card_wp & MS_CARD) {
2841 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
2842 TRACE_RET(chip, TRANSPORT_FAILED);
2845 if (!CHK_MSPRO(ms_card)) {
2846 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2847 TRACE_RET(chip, TRANSPORT_FAILED);
2850 retval = mspro_format(srb, chip, MS_SHORT_DATA_LEN, quick_format);
2851 if (retval != STATUS_SUCCESS) {
2852 set_sense_type(chip, lun, SENSE_TYPE_FORMAT_CMD_FAILED);
2853 TRACE_RET(chip, TRANSPORT_FAILED);
2856 scsi_set_resid(srb, 0);
2857 return TRANSPORT_GOOD;
2860 #ifdef SUPPORT_PCGL_1P18
2861 static int get_ms_information(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2863 struct ms_info *ms_card = &(chip->ms_card);
2864 unsigned int lun = SCSI_LUN(srb);
2865 u8 dev_info_id, data_len;
2867 unsigned int buf_len;
2870 if (!check_card_ready(chip, lun)) {
2871 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2872 TRACE_RET(chip, TRANSPORT_FAILED);
2874 if (get_lun_card(chip, lun) != MS_CARD) {
2875 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2876 TRACE_RET(chip, TRANSPORT_FAILED);
2879 if ((srb->cmnd[2] != 0xB0) || (srb->cmnd[4] != 0x4D) ||
2880 (srb->cmnd[5] != 0x53) || (srb->cmnd[6] != 0x49) ||
2881 (srb->cmnd[7] != 0x44)) {
2882 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2883 TRACE_RET(chip, TRANSPORT_FAILED);
2886 dev_info_id = srb->cmnd[3];
2887 if ((CHK_MSXC(ms_card) && (dev_info_id == 0x10)) ||
2888 (!CHK_MSXC(ms_card) && (dev_info_id == 0x13)) ||
2889 !CHK_MSPRO(ms_card)) {
2890 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2891 TRACE_RET(chip, TRANSPORT_FAILED);
2894 if (dev_info_id == 0x15)
2895 buf_len = data_len = 0x3A;
2897 buf_len = data_len = 0x6A;
2899 buf = kmalloc(buf_len, GFP_KERNEL);
2901 TRACE_RET(chip, TRANSPORT_ERROR);
2904 /* GET Memory Stick Media Information Response Header */
2905 buf[i++] = 0x00; /* Data length MSB */
2906 buf[i++] = data_len; /* Data length LSB */
2907 /* Device Information Type Code */
2908 if (CHK_MSXC(ms_card))
2919 /* Number of Device Information */
2922 /* Device Information Body */
2924 /* Device Information ID Number */
2925 buf[i++] = dev_info_id;
2926 /* Device Information Length */
2927 if (dev_info_id == 0x15)
2932 buf[i++] = 0x00; /* Data length MSB */
2933 buf[i++] = data_len; /* Data length LSB */
2936 if ((dev_info_id == 0x10) || (dev_info_id == 0x13)) {
2937 /* System Information */
2938 memcpy(buf+i, ms_card->raw_sys_info, 96);
2941 memcpy(buf+i, ms_card->raw_model_name, 48);
2944 rtsx_stor_set_xfer_buf(buf, buf_len, srb);
2946 if (dev_info_id == 0x15)
2947 scsi_set_resid(srb, scsi_bufflen(srb)-0x3C);
2949 scsi_set_resid(srb, scsi_bufflen(srb)-0x6C);
2952 return STATUS_SUCCESS;
2956 static int ms_sp_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2958 int retval = TRANSPORT_ERROR;
2960 if (srb->cmnd[2] == MS_FORMAT)
2961 retval = ms_format_cmnd(srb, chip);
2962 #ifdef SUPPORT_PCGL_1P18
2963 else if (srb->cmnd[2] == GET_MS_INFORMATION)
2964 retval = get_ms_information(srb, chip);
2971 static int sd_extention_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2973 unsigned int lun = SCSI_LUN(srb);
2976 rtsx_disable_aspm(chip);
2978 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2982 rtsx_set_stat(chip, RTSX_STAT_RUN);
2984 sd_cleanup_work(chip);
2986 if (!check_card_ready(chip, lun)) {
2987 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2988 TRACE_RET(chip, TRANSPORT_FAILED);
2990 if (get_lun_card(chip, lun) != SD_CARD) {
2991 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2992 TRACE_RET(chip, TRANSPORT_FAILED);
2995 switch (srb->cmnd[0]) {
2996 case SD_PASS_THRU_MODE:
2997 result = sd_pass_thru_mode(srb, chip);
3000 case SD_EXECUTE_NO_DATA:
3001 result = sd_execute_no_data(srb, chip);
3004 case SD_EXECUTE_READ:
3005 result = sd_execute_read_data(srb, chip);
3008 case SD_EXECUTE_WRITE:
3009 result = sd_execute_write_data(srb, chip);
3013 result = sd_get_cmd_rsp(srb, chip);
3017 result = sd_hw_rst(srb, chip);
3021 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3022 TRACE_RET(chip, TRANSPORT_FAILED);
3029 #ifdef SUPPORT_MAGIC_GATE
3030 static int mg_report_key(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3032 struct ms_info *ms_card = &(chip->ms_card);
3033 unsigned int lun = SCSI_LUN(srb);
3037 rtsx_disable_aspm(chip);
3039 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
3043 rtsx_set_stat(chip, RTSX_STAT_RUN);
3045 ms_cleanup_work(chip);
3047 if (!check_card_ready(chip, lun)) {
3048 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
3049 TRACE_RET(chip, TRANSPORT_FAILED);
3051 if (get_lun_card(chip, lun) != MS_CARD) {
3052 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
3053 TRACE_RET(chip, TRANSPORT_FAILED);
3056 if (srb->cmnd[7] != KC_MG_R_PRO) {
3057 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3058 TRACE_RET(chip, TRANSPORT_FAILED);
3061 if (!CHK_MSPRO(ms_card)) {
3062 set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3063 TRACE_RET(chip, TRANSPORT_FAILED);
3066 key_format = srb->cmnd[10] & 0x3F;
3067 dev_dbg(rtsx_dev(chip), "key_format = 0x%x\n", key_format);
3069 switch (key_format) {
3070 case KF_GET_LOC_EKB:
3071 if ((scsi_bufflen(srb) == 0x41C) &&
3072 (srb->cmnd[8] == 0x04) &&
3073 (srb->cmnd[9] == 0x1C)) {
3074 retval = mg_get_local_EKB(srb, chip);
3075 if (retval != STATUS_SUCCESS)
3076 TRACE_RET(chip, TRANSPORT_FAILED);
3079 set_sense_type(chip, lun,
3080 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3081 TRACE_RET(chip, TRANSPORT_FAILED);
3086 if ((scsi_bufflen(srb) == 0x24) &&
3087 (srb->cmnd[8] == 0x00) &&
3088 (srb->cmnd[9] == 0x24)) {
3089 retval = mg_get_rsp_chg(srb, chip);
3090 if (retval != STATUS_SUCCESS)
3091 TRACE_RET(chip, TRANSPORT_FAILED);
3094 set_sense_type(chip, lun,
3095 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3096 TRACE_RET(chip, TRANSPORT_FAILED);
3101 ms_card->mg_entry_num = srb->cmnd[5];
3102 if ((scsi_bufflen(srb) == 0x404) &&
3103 (srb->cmnd[8] == 0x04) &&
3104 (srb->cmnd[9] == 0x04) &&
3105 (srb->cmnd[2] == 0x00) &&
3106 (srb->cmnd[3] == 0x00) &&
3107 (srb->cmnd[4] == 0x00) &&
3108 (srb->cmnd[5] < 32)) {
3109 retval = mg_get_ICV(srb, chip);
3110 if (retval != STATUS_SUCCESS)
3111 TRACE_RET(chip, TRANSPORT_FAILED);
3114 set_sense_type(chip, lun,
3115 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3116 TRACE_RET(chip, TRANSPORT_FAILED);
3121 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3122 TRACE_RET(chip, TRANSPORT_FAILED);
3125 scsi_set_resid(srb, 0);
3126 return TRANSPORT_GOOD;
3129 static int mg_send_key(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3131 struct ms_info *ms_card = &(chip->ms_card);
3132 unsigned int lun = SCSI_LUN(srb);
3136 rtsx_disable_aspm(chip);
3138 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
3142 rtsx_set_stat(chip, RTSX_STAT_RUN);
3144 ms_cleanup_work(chip);
3146 if (!check_card_ready(chip, lun)) {
3147 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
3148 TRACE_RET(chip, TRANSPORT_FAILED);
3150 if (check_card_wp(chip, lun)) {
3151 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
3152 TRACE_RET(chip, TRANSPORT_FAILED);
3154 if (get_lun_card(chip, lun) != MS_CARD) {
3155 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
3156 TRACE_RET(chip, TRANSPORT_FAILED);
3159 if (srb->cmnd[7] != KC_MG_R_PRO) {
3160 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3161 TRACE_RET(chip, TRANSPORT_FAILED);
3164 if (!CHK_MSPRO(ms_card)) {
3165 set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3166 TRACE_RET(chip, TRANSPORT_FAILED);
3169 key_format = srb->cmnd[10] & 0x3F;
3170 dev_dbg(rtsx_dev(chip), "key_format = 0x%x\n", key_format);
3172 switch (key_format) {
3173 case KF_SET_LEAF_ID:
3174 if ((scsi_bufflen(srb) == 0x0C) &&
3175 (srb->cmnd[8] == 0x00) &&
3176 (srb->cmnd[9] == 0x0C)) {
3177 retval = mg_set_leaf_id(srb, chip);
3178 if (retval != STATUS_SUCCESS)
3179 TRACE_RET(chip, TRANSPORT_FAILED);
3182 set_sense_type(chip, lun,
3183 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3184 TRACE_RET(chip, TRANSPORT_FAILED);
3189 if ((scsi_bufflen(srb) == 0x0C) &&
3190 (srb->cmnd[8] == 0x00) &&
3191 (srb->cmnd[9] == 0x0C)) {
3192 retval = mg_chg(srb, chip);
3193 if (retval != STATUS_SUCCESS)
3194 TRACE_RET(chip, TRANSPORT_FAILED);
3197 set_sense_type(chip, lun,
3198 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3199 TRACE_RET(chip, TRANSPORT_FAILED);
3204 if ((scsi_bufflen(srb) == 0x0C) &&
3205 (srb->cmnd[8] == 0x00) &&
3206 (srb->cmnd[9] == 0x0C)) {
3207 retval = mg_rsp(srb, chip);
3208 if (retval != STATUS_SUCCESS)
3209 TRACE_RET(chip, TRANSPORT_FAILED);
3212 set_sense_type(chip, lun,
3213 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3214 TRACE_RET(chip, TRANSPORT_FAILED);
3219 ms_card->mg_entry_num = srb->cmnd[5];
3220 if ((scsi_bufflen(srb) == 0x404) &&
3221 (srb->cmnd[8] == 0x04) &&
3222 (srb->cmnd[9] == 0x04) &&
3223 (srb->cmnd[2] == 0x00) &&
3224 (srb->cmnd[3] == 0x00) &&
3225 (srb->cmnd[4] == 0x00) &&
3226 (srb->cmnd[5] < 32)) {
3227 retval = mg_set_ICV(srb, chip);
3228 if (retval != STATUS_SUCCESS)
3229 TRACE_RET(chip, TRANSPORT_FAILED);
3232 set_sense_type(chip, lun,
3233 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3234 TRACE_RET(chip, TRANSPORT_FAILED);
3239 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3240 TRACE_RET(chip, TRANSPORT_FAILED);
3243 scsi_set_resid(srb, 0);
3244 return TRANSPORT_GOOD;
3248 int rtsx_scsi_handler(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3250 #ifdef SUPPORT_SD_LOCK
3251 struct sd_info *sd_card = &(chip->sd_card);
3253 struct ms_info *ms_card = &(chip->ms_card);
3254 unsigned int lun = SCSI_LUN(srb);
3257 #ifdef SUPPORT_SD_LOCK
3258 if (sd_card->sd_erase_status) {
3259 /* Block all SCSI command except for
3260 * REQUEST_SENSE and rs_ppstatus
3262 if (!((srb->cmnd[0] == VENDOR_CMND) &&
3263 (srb->cmnd[1] == SCSI_APP_CMD) &&
3264 (srb->cmnd[2] == GET_DEV_STATUS)) &&
3265 (srb->cmnd[0] != REQUEST_SENSE)) {
3266 /* Logical Unit Not Ready Format in Progress */
3267 set_sense_data(chip, lun, CUR_ERR,
3268 0x02, 0, 0x04, 0x04, 0, 0);
3269 TRACE_RET(chip, TRANSPORT_FAILED);
3274 if ((get_lun_card(chip, lun) == MS_CARD) &&
3275 (ms_card->format_status == FORMAT_IN_PROGRESS)) {
3276 if ((srb->cmnd[0] != REQUEST_SENSE) &&
3277 (srb->cmnd[0] != INQUIRY)) {
3278 /* Logical Unit Not Ready Format in Progress */
3279 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04,
3280 0, (u16)(ms_card->progress));
3281 TRACE_RET(chip, TRANSPORT_FAILED);
3285 switch (srb->cmnd[0]) {
3290 result = read_write(srb, chip);
3291 #if !defined(LED_AUTO_BLINK) && !defined(REGULAR_BLINK)
3292 led_shine(srb, chip);
3296 case TEST_UNIT_READY:
3297 result = test_unit_ready(srb, chip);
3301 result = inquiry(srb, chip);
3305 result = read_capacity(srb, chip);
3309 result = start_stop_unit(srb, chip);
3312 case ALLOW_MEDIUM_REMOVAL:
3313 result = allow_medium_removal(srb, chip);
3317 result = request_sense(srb, chip);
3322 result = mode_sense(srb, chip);
3326 result = read_format_capacity(srb, chip);
3330 result = vendor_cmnd(srb, chip);
3334 result = ms_sp_cmnd(srb, chip);
3338 case SD_PASS_THRU_MODE:
3339 case SD_EXECUTE_NO_DATA:
3340 case SD_EXECUTE_READ:
3341 case SD_EXECUTE_WRITE:
3344 result = sd_extention_cmnd(srb, chip);
3348 #ifdef SUPPORT_MAGIC_GATE
3349 case CMD_MSPRO_MG_RKEY:
3350 result = mg_report_key(srb, chip);
3353 case CMD_MSPRO_MG_SKEY:
3354 result = mg_send_key(srb, chip);
3361 result = TRANSPORT_GOOD;
3365 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3366 result = TRANSPORT_FAILED;