cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rtsx_scsi.c (73476B)


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