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