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