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}
3280