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