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