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