staging:iio:trigger handle name attr in core, remove old alloc and register any contr...
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / staging / rts_pstor / rtsx_scsi.c
blob20c2464a20f9cf7f421d600d7326f5ccb802b5b7
1 /* Driver for Realtek PCI-Express card reader
3 * Copyright(c) 2009 Realtek Semiconductor Corp. All rights reserved.
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.
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.
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/>.
18 * Author:
19 * wwang (wei_wang@realsil.com.cn)
20 * No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China
23 #include <linux/blkdev.h>
24 #include <linux/kthread.h>
25 #include <linux/sched.h>
27 #include "rtsx.h"
28 #include "rtsx_transport.h"
29 #include "rtsx_sys.h"
30 #include "rtsx_card.h"
31 #include "rtsx_chip.h"
32 #include "rtsx_scsi.h"
33 #include "sd.h"
34 #include "ms.h"
35 #include "spi.h"
37 void scsi_show_command(struct scsi_cmnd *srb)
39 char *what = NULL;
40 int i, unknown_cmd = 0;
42 switch (srb->cmnd[0]) {
43 case TEST_UNIT_READY: what = "TEST_UNIT_READY"; break;
44 case REZERO_UNIT: what = "REZERO_UNIT"; break;
45 case REQUEST_SENSE: what = "REQUEST_SENSE"; break;
46 case FORMAT_UNIT: what = "FORMAT_UNIT"; break;
47 case READ_BLOCK_LIMITS: what = "READ_BLOCK_LIMITS"; break;
48 case REASSIGN_BLOCKS: what = "REASSIGN_BLOCKS"; break;
49 case READ_6: what = "READ_6"; break;
50 case WRITE_6: what = "WRITE_6"; break;
51 case SEEK_6: what = "SEEK_6"; break;
52 case READ_REVERSE: what = "READ_REVERSE"; break;
53 case WRITE_FILEMARKS: what = "WRITE_FILEMARKS"; break;
54 case SPACE: what = "SPACE"; break;
55 case INQUIRY: what = "INQUIRY"; break;
56 case RECOVER_BUFFERED_DATA: what = "RECOVER_BUFFERED_DATA"; break;
57 case MODE_SELECT: what = "MODE_SELECT"; break;
58 case RESERVE: what = "RESERVE"; break;
59 case RELEASE: what = "RELEASE"; break;
60 case COPY: what = "COPY"; break;
61 case ERASE: what = "ERASE"; break;
62 case MODE_SENSE: what = "MODE_SENSE"; break;
63 case START_STOP: what = "START_STOP"; break;
64 case RECEIVE_DIAGNOSTIC: what = "RECEIVE_DIAGNOSTIC"; break;
65 case SEND_DIAGNOSTIC: what = "SEND_DIAGNOSTIC"; break;
66 case ALLOW_MEDIUM_REMOVAL: what = "ALLOW_MEDIUM_REMOVAL"; break;
67 case SET_WINDOW: what = "SET_WINDOW"; break;
68 case READ_CAPACITY: what = "READ_CAPACITY"; break;
69 case READ_10: what = "READ_10"; break;
70 case WRITE_10: what = "WRITE_10"; break;
71 case SEEK_10: what = "SEEK_10"; break;
72 case WRITE_VERIFY: what = "WRITE_VERIFY"; break;
73 case VERIFY: what = "VERIFY"; break;
74 case SEARCH_HIGH: what = "SEARCH_HIGH"; break;
75 case SEARCH_EQUAL: what = "SEARCH_EQUAL"; break;
76 case SEARCH_LOW: what = "SEARCH_LOW"; break;
77 case SET_LIMITS: what = "SET_LIMITS"; break;
78 case READ_POSITION: what = "READ_POSITION"; break;
79 case SYNCHRONIZE_CACHE: what = "SYNCHRONIZE_CACHE"; break;
80 case LOCK_UNLOCK_CACHE: what = "LOCK_UNLOCK_CACHE"; break;
81 case READ_DEFECT_DATA: what = "READ_DEFECT_DATA"; break;
82 case MEDIUM_SCAN: what = "MEDIUM_SCAN"; break;
83 case COMPARE: what = "COMPARE"; break;
84 case COPY_VERIFY: what = "COPY_VERIFY"; break;
85 case WRITE_BUFFER: what = "WRITE_BUFFER"; break;
86 case READ_BUFFER: what = "READ_BUFFER"; break;
87 case UPDATE_BLOCK: what = "UPDATE_BLOCK"; break;
88 case READ_LONG: what = "READ_LONG"; break;
89 case WRITE_LONG: what = "WRITE_LONG"; break;
90 case CHANGE_DEFINITION: what = "CHANGE_DEFINITION"; break;
91 case WRITE_SAME: what = "WRITE_SAME"; break;
92 case GPCMD_READ_SUBCHANNEL: what = "READ SUBCHANNEL"; break;
93 case READ_TOC: what = "READ_TOC"; break;
94 case GPCMD_READ_HEADER: what = "READ HEADER"; break;
95 case GPCMD_PLAY_AUDIO_10: what = "PLAY AUDIO (10)"; break;
96 case GPCMD_PLAY_AUDIO_MSF: what = "PLAY AUDIO MSF"; break;
97 case GPCMD_GET_EVENT_STATUS_NOTIFICATION:
98 what = "GET EVENT/STATUS NOTIFICATION"; break;
99 case GPCMD_PAUSE_RESUME: what = "PAUSE/RESUME"; break;
100 case LOG_SELECT: what = "LOG_SELECT"; break;
101 case LOG_SENSE: what = "LOG_SENSE"; break;
102 case GPCMD_STOP_PLAY_SCAN: what = "STOP PLAY/SCAN"; break;
103 case GPCMD_READ_DISC_INFO: what = "READ DISC INFORMATION"; break;
104 case GPCMD_READ_TRACK_RZONE_INFO:
105 what = "READ TRACK INFORMATION"; break;
106 case GPCMD_RESERVE_RZONE_TRACK: what = "RESERVE TRACK"; break;
107 case GPCMD_SEND_OPC: what = "SEND OPC"; break;
108 case MODE_SELECT_10: what = "MODE_SELECT_10"; break;
109 case GPCMD_REPAIR_RZONE_TRACK: what = "REPAIR TRACK"; break;
110 case 0x59: what = "READ MASTER CUE"; break;
111 case MODE_SENSE_10: what = "MODE_SENSE_10"; break;
112 case GPCMD_CLOSE_TRACK: what = "CLOSE TRACK/SESSION"; break;
113 case 0x5C: what = "READ BUFFER CAPACITY"; break;
114 case 0x5D: what = "SEND CUE SHEET"; break;
115 case GPCMD_BLANK: what = "BLANK"; break;
116 case REPORT_LUNS: what = "REPORT LUNS"; break;
117 case MOVE_MEDIUM: what = "MOVE_MEDIUM or PLAY AUDIO (12)"; break;
118 case READ_12: what = "READ_12"; break;
119 case WRITE_12: what = "WRITE_12"; break;
120 case WRITE_VERIFY_12: what = "WRITE_VERIFY_12"; break;
121 case SEARCH_HIGH_12: what = "SEARCH_HIGH_12"; break;
122 case SEARCH_EQUAL_12: what = "SEARCH_EQUAL_12"; break;
123 case SEARCH_LOW_12: what = "SEARCH_LOW_12"; break;
124 case SEND_VOLUME_TAG: what = "SEND_VOLUME_TAG"; break;
125 case READ_ELEMENT_STATUS: what = "READ_ELEMENT_STATUS"; break;
126 case GPCMD_READ_CD_MSF: what = "READ CD MSF"; break;
127 case GPCMD_SCAN: what = "SCAN"; break;
128 case GPCMD_SET_SPEED: what = "SET CD SPEED"; break;
129 case GPCMD_MECHANISM_STATUS: what = "MECHANISM STATUS"; break;
130 case GPCMD_READ_CD: what = "READ CD"; break;
131 case 0xE1: what = "WRITE CONTINUE"; break;
132 case WRITE_LONG_2: what = "WRITE_LONG_2"; break;
133 case VENDOR_CMND: what = "Realtek's vendor command"; break;
134 default: what = "(unknown command)"; unknown_cmd = 1; break;
137 if (srb->cmnd[0] != TEST_UNIT_READY) {
138 RTSX_DEBUGP("Command %s (%d bytes)\n", what, srb->cmd_len);
140 if (unknown_cmd) {
141 RTSX_DEBUGP("");
142 for (i = 0; i < srb->cmd_len && i < 16; i++)
143 RTSX_DEBUGPN(" %02x", srb->cmnd[i]);
144 RTSX_DEBUGPN("\n");
148 void set_sense_type(struct rtsx_chip *chip, unsigned int lun, int sense_type)
150 switch (sense_type) {
151 case SENSE_TYPE_MEDIA_CHANGE:
152 set_sense_data(chip, lun, CUR_ERR, 0x06, 0, 0x28, 0, 0, 0);
153 break;
155 case SENSE_TYPE_MEDIA_NOT_PRESENT:
156 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x3A, 0, 0, 0);
157 break;
159 case SENSE_TYPE_MEDIA_LBA_OVER_RANGE:
160 set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x21, 0, 0, 0);
161 break;
163 case SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT:
164 set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x25, 0, 0, 0);
165 break;
167 case SENSE_TYPE_MEDIA_WRITE_PROTECT:
168 set_sense_data(chip, lun, CUR_ERR, 0x07, 0, 0x27, 0, 0, 0);
169 break;
171 case SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR:
172 set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x11, 0, 0, 0);
173 break;
175 case SENSE_TYPE_MEDIA_WRITE_ERR:
176 set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x0C, 0x02, 0, 0);
177 break;
179 case SENSE_TYPE_MEDIA_INVALID_CMD_FIELD:
180 set_sense_data(chip, lun, CUR_ERR, ILGAL_REQ, 0,
181 ASC_INVLD_CDB, ASCQ_INVLD_CDB, CDB_ILLEGAL, 1);
182 break;
184 case SENSE_TYPE_FORMAT_IN_PROGRESS:
185 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04, 0, 0);
186 break;
188 case SENSE_TYPE_FORMAT_CMD_FAILED:
189 set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x31, 0x01, 0, 0);
190 break;
192 #ifdef SUPPORT_MAGIC_GATE
193 case SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB:
194 set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x6F, 0x02, 0, 0);
195 break;
197 case SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN:
198 set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x6F, 0x00, 0, 0);
199 break;
201 case SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM:
202 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x30, 0x00, 0, 0);
203 break;
205 case SENSE_TYPE_MG_WRITE_ERR:
206 set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x0C, 0x00, 0, 0);
207 break;
208 #endif
210 #ifdef SUPPORT_SD_LOCK
211 case SENSE_TYPE_MEDIA_READ_FORBIDDEN:
212 set_sense_data(chip, lun, CUR_ERR, 0x07, 0, 0x11, 0x13, 0, 0);
213 break;
214 #endif
216 case SENSE_TYPE_NO_SENSE:
217 default:
218 set_sense_data(chip, lun, CUR_ERR, 0, 0, 0, 0, 0, 0);
219 break;
223 void set_sense_data(struct rtsx_chip *chip, unsigned int lun, u8 err_code, u8 sense_key,
224 u32 info, u8 asc, u8 ascq, u8 sns_key_info0, u16 sns_key_info1)
226 struct sense_data_t *sense = &(chip->sense_buffer[lun]);
228 sense->err_code = err_code;
229 sense->sense_key = sense_key;
230 sense->info[0] = (u8)(info >> 24);
231 sense->info[1] = (u8)(info >> 16);
232 sense->info[2] = (u8)(info >> 8);
233 sense->info[3] = (u8)info;
235 sense->ad_sense_len = sizeof(struct sense_data_t) - 8;
236 sense->asc = asc;
237 sense->ascq = ascq;
238 if (sns_key_info0 != 0) {
239 sense->sns_key_info[0] = SKSV | sns_key_info0;
240 sense->sns_key_info[1] = (sns_key_info1 & 0xf0) >> 8;
241 sense->sns_key_info[2] = sns_key_info1 & 0x0f;
245 static int test_unit_ready(struct scsi_cmnd *srb, struct rtsx_chip *chip)
247 unsigned int lun = SCSI_LUN(srb);
249 if (!check_card_ready(chip, lun)) {
250 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
251 return TRANSPORT_FAILED;
254 if (!(CHK_BIT(chip->lun_mc, lun))) {
255 SET_BIT(chip->lun_mc, lun);
256 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
257 return TRANSPORT_FAILED;
260 #ifdef SUPPORT_SD_LOCK
261 if (get_lun_card(chip, SCSI_LUN(srb)) == SD_CARD) {
262 struct sd_info *sd_card = &(chip->sd_card);
263 if (sd_card->sd_lock_notify) {
264 sd_card->sd_lock_notify = 0;
265 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
266 return TRANSPORT_FAILED;
267 } else if (sd_card->sd_lock_status & SD_LOCKED) {
268 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_READ_FORBIDDEN);
269 return TRANSPORT_FAILED;
272 #endif
274 return TRANSPORT_GOOD;
277 static unsigned char formatter_inquiry_str[20] = {
278 'M', 'E', 'M', 'O', 'R', 'Y', 'S', 'T', 'I', 'C', 'K',
279 #ifdef SUPPORT_MAGIC_GATE
280 '-', 'M', 'G', /* Byte[47:49] */
281 #else
282 0x20, 0x20, 0x20, /* Byte[47:49] */
283 #endif
285 #ifdef SUPPORT_MAGIC_GATE
286 0x0B, /* Byte[50]: MG, MS, MSPro, MSXC */
287 #else
288 0x09, /* Byte[50]: MS, MSPro, MSXC */
289 #endif
290 0x00, /* Byte[51]: Category Specific Commands */
291 0x00, /* Byte[52]: Access Control and feature */
292 0x20, 0x20, 0x20, /* Byte[53:55] */
295 static int inquiry(struct scsi_cmnd *srb, struct rtsx_chip *chip)
297 unsigned int lun = SCSI_LUN(srb);
298 char *inquiry_default = (char *)"Generic-xD/SD/M.S. 1.00 ";
299 char *inquiry_sdms = (char *)"Generic-SD/MemoryStick 1.00 ";
300 char *inquiry_sd = (char *)"Generic-SD/MMC 1.00 ";
301 char *inquiry_ms = (char *)"Generic-MemoryStick 1.00 ";
302 char *inquiry_string;
303 unsigned char sendbytes;
304 unsigned char *buf;
305 u8 card = get_lun_card(chip, lun);
306 int pro_formatter_flag = 0;
307 unsigned char inquiry_buf[] = {
308 QULIFIRE|DRCT_ACCESS_DEV,
309 RMB_DISC|0x0D,
310 0x00,
311 0x01,
312 0x1f,
313 0x02,
315 REL_ADR|WBUS_32|WBUS_16|SYNC|LINKED|CMD_QUE|SFT_RE,
318 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
319 if (chip->lun2card[lun] == SD_CARD) {
320 inquiry_string = inquiry_sd;
321 } else {
322 inquiry_string = inquiry_ms;
324 } else if (CHECK_LUN_MODE(chip, SD_MS_1LUN)) {
325 inquiry_string = inquiry_sdms;
326 } else {
327 inquiry_string = inquiry_default;
330 buf = vmalloc(scsi_bufflen(srb));
331 if (buf == NULL) {
332 TRACE_RET(chip, TRANSPORT_ERROR);
335 #ifdef SUPPORT_MAGIC_GATE
336 if ((chip->mspro_formatter_enable) &&
337 (chip->lun2card[lun] & MS_CARD))
338 #else
339 if (chip->mspro_formatter_enable)
340 #endif
342 if (!card || (card == MS_CARD)) {
343 pro_formatter_flag = 1;
347 if (pro_formatter_flag) {
348 if (scsi_bufflen(srb) < 56) {
349 sendbytes = (unsigned char)(scsi_bufflen(srb));
350 } else {
351 sendbytes = 56;
353 } else {
354 if (scsi_bufflen(srb) < 36) {
355 sendbytes = (unsigned char)(scsi_bufflen(srb));
356 } else {
357 sendbytes = 36;
361 if (sendbytes > 8) {
362 memcpy(buf, inquiry_buf, 8);
363 memcpy(buf + 8, inquiry_string, sendbytes - 8);
364 if (pro_formatter_flag) {
365 /* Additional Length */
366 buf[4] = 0x33;
368 } else {
369 memcpy(buf, inquiry_buf, sendbytes);
372 if (pro_formatter_flag) {
373 if (sendbytes > 36) {
374 memcpy(buf + 36, formatter_inquiry_str, sendbytes - 36);
378 scsi_set_resid(srb, 0);
380 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
381 vfree(buf);
383 return TRANSPORT_GOOD;
387 static int start_stop_unit(struct scsi_cmnd *srb, struct rtsx_chip *chip)
389 unsigned int lun = SCSI_LUN(srb);
391 scsi_set_resid(srb, scsi_bufflen(srb));
393 if (srb->cmnd[1] == 1)
394 return TRANSPORT_GOOD;
396 switch (srb->cmnd[0x4]) {
397 case STOP_MEDIUM:
398 /* Media disabled */
399 return TRANSPORT_GOOD;
401 case UNLOAD_MEDIUM:
402 /* Media shall be unload */
403 if (check_card_ready(chip, lun))
404 eject_card(chip, lun);
405 return TRANSPORT_GOOD;
407 case MAKE_MEDIUM_READY:
408 case LOAD_MEDIUM:
409 if (check_card_ready(chip, lun)) {
410 return TRANSPORT_GOOD;
411 } else {
412 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
413 TRACE_RET(chip, TRANSPORT_FAILED);
416 break;
419 TRACE_RET(chip, TRANSPORT_ERROR);
423 static int allow_medium_removal(struct scsi_cmnd *srb, struct rtsx_chip *chip)
425 int prevent;
427 prevent = srb->cmnd[4] & 0x1;
429 scsi_set_resid(srb, 0);
431 if (prevent) {
432 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
433 TRACE_RET(chip, TRANSPORT_FAILED);
436 return TRANSPORT_GOOD;
440 static int request_sense(struct scsi_cmnd *srb, struct rtsx_chip *chip)
442 struct sense_data_t *sense;
443 unsigned int lun = SCSI_LUN(srb);
444 struct ms_info *ms_card = &(chip->ms_card);
445 unsigned char *tmp, *buf;
447 sense = &(chip->sense_buffer[lun]);
449 if ((get_lun_card(chip, lun) == MS_CARD) && ms_card->pro_under_formatting) {
450 if (ms_card->format_status == FORMAT_SUCCESS) {
451 set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
452 ms_card->pro_under_formatting = 0;
453 ms_card->progress = 0;
454 } else if (ms_card->format_status == FORMAT_IN_PROGRESS) {
455 /* Logical Unit Not Ready Format in Progress */
456 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04,
457 0, (u16)(ms_card->progress));
458 } else {
459 /* Format Command Failed */
460 set_sense_type(chip, lun, SENSE_TYPE_FORMAT_CMD_FAILED);
461 ms_card->pro_under_formatting = 0;
462 ms_card->progress = 0;
465 rtsx_set_stat(chip, RTSX_STAT_RUN);
468 buf = vmalloc(scsi_bufflen(srb));
469 if (buf == NULL) {
470 TRACE_RET(chip, TRANSPORT_ERROR);
473 tmp = (unsigned char *)sense;
474 memcpy(buf, tmp, scsi_bufflen(srb));
476 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
477 vfree(buf);
479 scsi_set_resid(srb, 0);
480 /* Reset Sense Data */
481 set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
482 return TRANSPORT_GOOD;
485 static void ms_mode_sense(struct rtsx_chip *chip, u8 cmd,
486 int lun, u8 *buf, int buf_len)
488 struct ms_info *ms_card = &(chip->ms_card);
489 int sys_info_offset;
490 int data_size = buf_len;
491 int support_format = 0;
492 int i = 0;
494 if (cmd == MODE_SENSE) {
495 sys_info_offset = 8;
496 if (data_size > 0x68) {
497 data_size = 0x68;
499 buf[i++] = 0x67; /* Mode Data Length */
500 } else {
501 sys_info_offset = 12;
502 if (data_size > 0x6C) {
503 data_size = 0x6C;
505 buf[i++] = 0x00; /* Mode Data Length (MSB) */
506 buf[i++] = 0x6A; /* Mode Data Length (LSB) */
509 /* Medium Type Code */
510 if (check_card_ready(chip, lun)) {
511 if (CHK_MSXC(ms_card)) {
512 support_format = 1;
513 buf[i++] = 0x40;
514 } else if (CHK_MSPRO(ms_card)) {
515 support_format = 1;
516 buf[i++] = 0x20;
517 } else {
518 buf[i++] = 0x10;
521 /* WP */
522 if (check_card_wp(chip, lun)) {
523 buf[i++] = 0x80;
524 } else {
525 buf[i++] = 0x00;
527 } else {
528 buf[i++] = 0x00; /* MediaType */
529 buf[i++] = 0x00; /* WP */
532 buf[i++] = 0x00; /* Reserved */
534 if (cmd == MODE_SENSE_10) {
535 buf[i++] = 0x00; /* Reserved */
536 buf[i++] = 0x00; /* Block descriptor length(MSB) */
537 buf[i++] = 0x00; /* Block descriptor length(LSB) */
539 /* The Following Data is the content of "Page 0x20" */
540 if (data_size >= 9)
541 buf[i++] = 0x20; /* Page Code */
542 if (data_size >= 10)
543 buf[i++] = 0x62; /* Page Length */
544 if (data_size >= 11)
545 buf[i++] = 0x00; /* No Access Control */
546 if (data_size >= 12) {
547 if (support_format) {
548 buf[i++] = 0xC0; /* SF, SGM */
549 } else {
550 buf[i++] = 0x00;
553 } else {
554 /* The Following Data is the content of "Page 0x20" */
555 if (data_size >= 5)
556 buf[i++] = 0x20; /* Page Code */
557 if (data_size >= 6)
558 buf[i++] = 0x62; /* Page Length */
559 if (data_size >= 7)
560 buf[i++] = 0x00; /* No Access Control */
561 if (data_size >= 8) {
562 if (support_format) {
563 buf[i++] = 0xC0; /* SF, SGM */
564 } else {
565 buf[i++] = 0x00;
570 if (data_size > sys_info_offset) {
571 /* 96 Bytes Attribute Data */
572 int len = data_size - sys_info_offset;
573 len = (len < 96) ? len : 96;
575 memcpy(buf + sys_info_offset, ms_card->raw_sys_info, len);
579 static int mode_sense(struct scsi_cmnd *srb, struct rtsx_chip *chip)
581 unsigned int lun = SCSI_LUN(srb);
582 unsigned int dataSize;
583 int status;
584 int pro_formatter_flag;
585 unsigned char pageCode, *buf;
586 u8 card = get_lun_card(chip, lun);
588 #ifndef SUPPORT_MAGIC_GATE
589 if (!check_card_ready(chip, lun)) {
590 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
591 scsi_set_resid(srb, scsi_bufflen(srb));
592 TRACE_RET(chip, TRANSPORT_FAILED);
594 #endif
596 pro_formatter_flag = 0;
597 dataSize = 8;
598 #ifdef SUPPORT_MAGIC_GATE
599 if ((chip->lun2card[lun] & MS_CARD)) {
600 if (!card || (card == MS_CARD)) {
601 dataSize = 108;
602 if (chip->mspro_formatter_enable) {
603 pro_formatter_flag = 1;
607 #else
608 if (card == MS_CARD) {
609 if (chip->mspro_formatter_enable) {
610 pro_formatter_flag = 1;
611 dataSize = 108;
614 #endif
616 buf = kmalloc(dataSize, GFP_KERNEL);
617 if (buf == NULL) {
618 TRACE_RET(chip, TRANSPORT_ERROR);
621 pageCode = srb->cmnd[2] & 0x3f;
623 if ((pageCode == 0x3F) || (pageCode == 0x1C) ||
624 (pageCode == 0x00) ||
625 (pro_formatter_flag && (pageCode == 0x20))) {
626 if (srb->cmnd[0] == MODE_SENSE) {
627 if ((pageCode == 0x3F) || (pageCode == 0x20)) {
628 ms_mode_sense(chip, srb->cmnd[0],
629 lun, buf, dataSize);
630 } else {
631 dataSize = 4;
632 buf[0] = 0x03;
633 buf[1] = 0x00;
634 if (check_card_wp(chip, lun)) {
635 buf[2] = 0x80;
636 } else {
637 buf[2] = 0x00;
639 buf[3] = 0x00;
641 } else {
642 if ((pageCode == 0x3F) || (pageCode == 0x20)) {
643 ms_mode_sense(chip, srb->cmnd[0],
644 lun, buf, dataSize);
645 } else {
646 dataSize = 8;
647 buf[0] = 0x00;
648 buf[1] = 0x06;
649 buf[2] = 0x00;
650 if (check_card_wp(chip, lun)) {
651 buf[3] = 0x80;
652 } else {
653 buf[3] = 0x00;
655 buf[4] = 0x00;
656 buf[5] = 0x00;
657 buf[6] = 0x00;
658 buf[7] = 0x00;
661 status = TRANSPORT_GOOD;
662 } else {
663 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
664 scsi_set_resid(srb, scsi_bufflen(srb));
665 status = TRANSPORT_FAILED;
668 if (status == TRANSPORT_GOOD) {
669 unsigned int len = min(scsi_bufflen(srb), dataSize);
670 rtsx_stor_set_xfer_buf(buf, len, srb);
671 scsi_set_resid(srb, scsi_bufflen(srb) - len);
673 kfree(buf);
675 return status;
678 static int read_write(struct scsi_cmnd *srb, struct rtsx_chip *chip)
680 #ifdef SUPPORT_SD_LOCK
681 struct sd_info *sd_card = &(chip->sd_card);
682 #endif
683 unsigned int lun = SCSI_LUN(srb);
684 int retval;
685 u32 start_sec;
686 u16 sec_cnt;
688 rtsx_disable_aspm(chip);
690 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
691 rtsx_exit_ss(chip);
692 wait_timeout(100);
694 rtsx_set_stat(chip, RTSX_STAT_RUN);
696 if (!check_card_ready(chip, lun) || (get_card_size(chip, lun) == 0)) {
697 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
698 TRACE_RET(chip, TRANSPORT_FAILED);
701 if (!(CHK_BIT(chip->lun_mc, lun))) {
702 SET_BIT(chip->lun_mc, lun);
703 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
704 return TRANSPORT_FAILED;
707 #ifdef SUPPORT_SD_LOCK
708 if (sd_card->sd_erase_status) {
709 /* Accessing to any card is forbidden
710 * until the erase procedure of SD is completed
712 RTSX_DEBUGP("SD card being erased!\n");
713 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_READ_FORBIDDEN);
714 TRACE_RET(chip, TRANSPORT_FAILED);
717 if (get_lun_card(chip, lun) == SD_CARD) {
718 if (sd_card->sd_lock_status & SD_LOCKED) {
719 RTSX_DEBUGP("SD card locked!\n");
720 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_READ_FORBIDDEN);
721 TRACE_RET(chip, TRANSPORT_FAILED);
724 #endif
726 if ((srb->cmnd[0] == READ_10) || (srb->cmnd[0] == WRITE_10)) {
727 start_sec = ((u32)srb->cmnd[2] << 24) | ((u32)srb->cmnd[3] << 16) |
728 ((u32)srb->cmnd[4] << 8) | ((u32)srb->cmnd[5]);
729 sec_cnt = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
730 } else if ((srb->cmnd[0] == READ_6) || (srb->cmnd[0] == WRITE_6)) {
731 start_sec = ((u32)(srb->cmnd[1] & 0x1F) << 16) |
732 ((u32)srb->cmnd[2] << 8) | ((u32)srb->cmnd[3]);
733 sec_cnt = srb->cmnd[4];
734 } else if ((srb->cmnd[0] == VENDOR_CMND) && (srb->cmnd[1] == SCSI_APP_CMD) &&
735 ((srb->cmnd[2] == PP_READ10) || (srb->cmnd[2] == PP_WRITE10))) {
736 start_sec = ((u32)srb->cmnd[4] << 24) | ((u32)srb->cmnd[5] << 16) |
737 ((u32)srb->cmnd[6] << 8) | ((u32)srb->cmnd[7]);
738 sec_cnt = ((u16)(srb->cmnd[9]) << 8) | srb->cmnd[10];
739 } else {
740 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
741 TRACE_RET(chip, TRANSPORT_FAILED);
744 /* In some test, we will receive a start_sec like 0xFFFFFFFF.
745 * In this situation, start_sec + sec_cnt will overflow, so we
746 * need to judge start_sec at first
748 if ((start_sec > get_card_size(chip, lun)) ||
749 ((start_sec + sec_cnt) > get_card_size(chip, lun))) {
750 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LBA_OVER_RANGE);
751 TRACE_RET(chip, TRANSPORT_FAILED);
754 if (sec_cnt == 0) {
755 scsi_set_resid(srb, 0);
756 return TRANSPORT_GOOD;
759 if (chip->rw_fail_cnt[lun] == 3) {
760 RTSX_DEBUGP("read/write fail three times in succession\n");
761 if (srb->sc_data_direction == DMA_FROM_DEVICE) {
762 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
763 } else {
764 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
766 TRACE_RET(chip, TRANSPORT_FAILED);
769 if (srb->sc_data_direction == DMA_TO_DEVICE) {
770 if (check_card_wp(chip, lun)) {
771 RTSX_DEBUGP("Write protected card!\n");
772 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
773 TRACE_RET(chip, TRANSPORT_FAILED);
775 if (CHECK_PID(chip, 0x5209) && chip->max_payload) {
776 u8 val = 0x10 | (chip->max_payload << 5);
777 retval = rtsx_write_cfg_dw(chip, 0, 0x78, 0xFF, val);
778 if (retval != STATUS_SUCCESS) {
779 TRACE_RET(chip, TRANSPORT_ERROR);
784 retval = card_rw(srb, chip, start_sec, sec_cnt);
785 if (retval != STATUS_SUCCESS) {
786 if (chip->need_release & chip->lun2card[lun]) {
787 chip->rw_fail_cnt[lun] = 0;
788 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
789 } else {
790 chip->rw_fail_cnt[lun]++;
791 if (srb->sc_data_direction == DMA_FROM_DEVICE) {
792 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
793 } else {
794 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
797 retval = TRANSPORT_FAILED;
798 TRACE_GOTO(chip, Exit);
799 } else {
800 chip->rw_fail_cnt[lun] = 0;
801 retval = TRANSPORT_GOOD;
804 scsi_set_resid(srb, 0);
806 Exit:
807 if (srb->sc_data_direction == DMA_TO_DEVICE) {
808 if (CHECK_PID(chip, 0x5209) && chip->max_payload) {
809 retval = rtsx_write_cfg_dw(chip, 0, 0x78, 0xFF, 0x10);
810 if (retval != STATUS_SUCCESS) {
811 TRACE_RET(chip, TRANSPORT_ERROR);
816 return retval;
819 static int read_format_capacity(struct scsi_cmnd *srb, struct rtsx_chip *chip)
821 unsigned char *buf;
822 unsigned int lun = SCSI_LUN(srb);
823 unsigned int buf_len;
824 u8 card = get_lun_card(chip, lun);
825 u32 card_size;
826 int desc_cnt;
827 int i = 0;
829 if (!check_card_ready(chip, lun)) {
830 if (!chip->mspro_formatter_enable) {
831 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
832 TRACE_RET(chip, TRANSPORT_FAILED);
836 buf_len = (scsi_bufflen(srb) > 12) ? 0x14 : 12;
838 buf = kmalloc(buf_len, GFP_KERNEL);
839 if (buf == NULL) {
840 TRACE_RET(chip, TRANSPORT_ERROR);
843 buf[i++] = 0;
844 buf[i++] = 0;
845 buf[i++] = 0;
847 /* Capacity List Length */
848 if ((buf_len > 12) && chip->mspro_formatter_enable &&
849 (chip->lun2card[lun] & MS_CARD) &&
850 (!card || (card == MS_CARD))) {
851 buf[i++] = 0x10;
852 desc_cnt = 2;
853 } else {
854 buf[i++] = 0x08;
855 desc_cnt = 1;
858 while (desc_cnt) {
859 if (check_card_ready(chip, lun)) {
860 card_size = get_card_size(chip, lun);
861 buf[i++] = (unsigned char)(card_size >> 24);
862 buf[i++] = (unsigned char)(card_size >> 16);
863 buf[i++] = (unsigned char)(card_size >> 8);
864 buf[i++] = (unsigned char)card_size;
866 if (desc_cnt == 2) {
867 buf[i++] = 2;
868 } else {
869 buf[i++] = 0;
871 } else {
872 buf[i++] = 0xFF;
873 buf[i++] = 0xFF;
874 buf[i++] = 0xFF;
875 buf[i++] = 0xFF;
877 if (desc_cnt == 2) {
878 buf[i++] = 3;
879 } else {
880 buf[i++] = 0;
884 buf[i++] = 0x00;
885 buf[i++] = 0x02;
886 buf[i++] = 0x00;
888 desc_cnt--;
891 buf_len = min(scsi_bufflen(srb), buf_len);
892 rtsx_stor_set_xfer_buf(buf, buf_len, srb);
893 kfree(buf);
895 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
897 return TRANSPORT_GOOD;
900 static int read_capacity(struct scsi_cmnd *srb, struct rtsx_chip *chip)
902 unsigned char *buf;
903 unsigned int lun = SCSI_LUN(srb);
904 u32 card_size;
906 if (!check_card_ready(chip, lun)) {
907 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
908 TRACE_RET(chip, TRANSPORT_FAILED);
911 if (!(CHK_BIT(chip->lun_mc, lun))) {
912 SET_BIT(chip->lun_mc, lun);
913 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
914 return TRANSPORT_FAILED;
917 buf = kmalloc(8, GFP_KERNEL);
918 if (buf == NULL) {
919 TRACE_RET(chip, TRANSPORT_ERROR);
922 card_size = get_card_size(chip, lun);
923 buf[0] = (unsigned char)((card_size - 1) >> 24);
924 buf[1] = (unsigned char)((card_size - 1) >> 16);
925 buf[2] = (unsigned char)((card_size - 1) >> 8);
926 buf[3] = (unsigned char)(card_size - 1);
928 buf[4] = 0x00;
929 buf[5] = 0x00;
930 buf[6] = 0x02;
931 buf[7] = 0x00;
933 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
934 kfree(buf);
936 scsi_set_resid(srb, 0);
938 return TRANSPORT_GOOD;
941 static int read_eeprom(struct scsi_cmnd *srb, struct rtsx_chip *chip)
943 unsigned short len, i;
944 int retval;
945 u8 *buf;
947 rtsx_disable_aspm(chip);
949 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
950 rtsx_exit_ss(chip);
951 wait_timeout(100);
953 rtsx_set_stat(chip, RTSX_STAT_RUN);
955 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
957 buf = (u8 *)vmalloc(len);
958 if (!buf) {
959 TRACE_RET(chip, TRANSPORT_ERROR);
962 retval = rtsx_force_power_on(chip, SSC_PDCTL);
963 if (retval != STATUS_SUCCESS) {
964 vfree(buf);
965 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
966 TRACE_RET(chip, TRANSPORT_FAILED);
969 for (i = 0; i < len; i++) {
970 retval = spi_read_eeprom(chip, i, buf + i);
971 if (retval != STATUS_SUCCESS) {
972 vfree(buf);
973 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
974 TRACE_RET(chip, TRANSPORT_FAILED);
978 len = (unsigned short)min(scsi_bufflen(srb), (unsigned int)len);
979 rtsx_stor_set_xfer_buf(buf, len, srb);
980 scsi_set_resid(srb, scsi_bufflen(srb) - len);
982 vfree(buf);
984 return TRANSPORT_GOOD;
987 static int write_eeprom(struct scsi_cmnd *srb, struct rtsx_chip *chip)
989 unsigned short len, i;
990 int retval;
991 u8 *buf;
993 rtsx_disable_aspm(chip);
995 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
996 rtsx_exit_ss(chip);
997 wait_timeout(100);
999 rtsx_set_stat(chip, RTSX_STAT_RUN);
1001 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1003 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1004 if (retval != STATUS_SUCCESS) {
1005 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1006 TRACE_RET(chip, TRANSPORT_FAILED);
1009 if (len == 511) {
1010 retval = spi_erase_eeprom_chip(chip);
1011 if (retval != STATUS_SUCCESS) {
1012 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1013 TRACE_RET(chip, TRANSPORT_FAILED);
1015 } else {
1016 len = (unsigned short)min(scsi_bufflen(srb), (unsigned int)len);
1017 buf = (u8 *)vmalloc(len);
1018 if (buf == NULL) {
1019 TRACE_RET(chip, TRANSPORT_ERROR);
1022 rtsx_stor_get_xfer_buf(buf, len, srb);
1023 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1025 for (i = 0; i < len; i++) {
1026 retval = spi_write_eeprom(chip, i, buf[i]);
1027 if (retval != STATUS_SUCCESS) {
1028 vfree(buf);
1029 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1030 TRACE_RET(chip, TRANSPORT_FAILED);
1034 vfree(buf);
1037 return TRANSPORT_GOOD;
1040 static int read_mem(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1042 unsigned short addr, len, i;
1043 int retval;
1044 u8 *buf;
1046 rtsx_disable_aspm(chip);
1048 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1049 rtsx_exit_ss(chip);
1050 wait_timeout(100);
1052 rtsx_set_stat(chip, RTSX_STAT_RUN);
1054 addr = ((u16)srb->cmnd[2] << 8) | srb->cmnd[3];
1055 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1057 if (addr < 0xFC00) {
1058 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1059 TRACE_RET(chip, TRANSPORT_FAILED);
1062 buf = (u8 *)vmalloc(len);
1063 if (!buf) {
1064 TRACE_RET(chip, TRANSPORT_ERROR);
1067 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1068 if (retval != STATUS_SUCCESS) {
1069 vfree(buf);
1070 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1071 TRACE_RET(chip, TRANSPORT_FAILED);
1074 for (i = 0; i < len; i++) {
1075 retval = rtsx_read_register(chip, addr + i, buf + i);
1076 if (retval != STATUS_SUCCESS) {
1077 vfree(buf);
1078 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1079 TRACE_RET(chip, TRANSPORT_FAILED);
1083 len = (unsigned short)min(scsi_bufflen(srb), (unsigned int)len);
1084 rtsx_stor_set_xfer_buf(buf, len, srb);
1085 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1087 vfree(buf);
1089 return TRANSPORT_GOOD;
1092 static int write_mem(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1094 unsigned short addr, len, i;
1095 int retval;
1096 u8 *buf;
1098 rtsx_disable_aspm(chip);
1100 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1101 rtsx_exit_ss(chip);
1102 wait_timeout(100);
1104 rtsx_set_stat(chip, RTSX_STAT_RUN);
1106 addr = ((u16)srb->cmnd[2] << 8) | srb->cmnd[3];
1107 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1109 if (addr < 0xFC00) {
1110 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1111 TRACE_RET(chip, TRANSPORT_FAILED);
1114 len = (unsigned short)min(scsi_bufflen(srb), (unsigned int)len);
1115 buf = (u8 *)vmalloc(len);
1116 if (buf == NULL) {
1117 TRACE_RET(chip, TRANSPORT_ERROR);
1120 rtsx_stor_get_xfer_buf(buf, len, srb);
1121 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1123 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1124 if (retval != STATUS_SUCCESS) {
1125 vfree(buf);
1126 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1127 TRACE_RET(chip, TRANSPORT_FAILED);
1130 for (i = 0; i < len; i++) {
1131 retval = rtsx_write_register(chip, addr + i, 0xFF, buf[i]);
1132 if (retval != STATUS_SUCCESS) {
1133 vfree(buf);
1134 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1135 TRACE_RET(chip, TRANSPORT_FAILED);
1139 vfree(buf);
1141 return TRANSPORT_GOOD;
1144 static int get_sd_csd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1146 struct sd_info *sd_card = &(chip->sd_card);
1147 unsigned int lun = SCSI_LUN(srb);
1149 if (!check_card_ready(chip, lun)) {
1150 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1151 TRACE_RET(chip, TRANSPORT_FAILED);
1154 if (get_lun_card(chip, lun) != SD_CARD) {
1155 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1156 TRACE_RET(chip, TRANSPORT_FAILED);
1159 scsi_set_resid(srb, 0);
1160 rtsx_stor_set_xfer_buf(sd_card->raw_csd, scsi_bufflen(srb), srb);
1162 return TRANSPORT_GOOD;
1165 static int toggle_gpio_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1167 u8 gpio = srb->cmnd[2];
1169 rtsx_disable_aspm(chip);
1171 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1172 rtsx_exit_ss(chip);
1173 wait_timeout(100);
1175 rtsx_set_stat(chip, RTSX_STAT_RUN);
1177 if (gpio > 3)
1178 gpio = 1;
1179 toggle_gpio(chip, gpio);
1181 return TRANSPORT_GOOD;
1184 #ifdef _MSG_TRACE
1185 static int trace_msg_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1187 unsigned char *ptr, *buf = NULL;
1188 int i, msg_cnt;
1189 u8 clear;
1190 unsigned int buf_len;
1192 buf_len = 4 + ((2 + MSG_FUNC_LEN + MSG_FILE_LEN + TIME_VAL_LEN) * TRACE_ITEM_CNT);
1194 if ((scsi_bufflen(srb) < buf_len) || (scsi_sglist(srb) == NULL)) {
1195 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1196 TRACE_RET(chip, TRANSPORT_FAILED);
1199 clear = srb->cmnd[2];
1201 buf = (unsigned char *)vmalloc(scsi_bufflen(srb));
1202 if (buf == NULL) {
1203 TRACE_RET(chip, TRANSPORT_ERROR);
1205 ptr = buf;
1207 if (chip->trace_msg[chip->msg_idx].valid) {
1208 msg_cnt = TRACE_ITEM_CNT;
1209 } else {
1210 msg_cnt = chip->msg_idx;
1212 *(ptr++) = (u8)(msg_cnt >> 24);
1213 *(ptr++) = (u8)(msg_cnt >> 16);
1214 *(ptr++) = (u8)(msg_cnt >> 8);
1215 *(ptr++) = (u8)msg_cnt;
1216 RTSX_DEBUGP("Trace message count is %d\n", msg_cnt);
1218 for (i = 1; i <= msg_cnt; i++) {
1219 int j, idx;
1221 idx = chip->msg_idx - i;
1222 if (idx < 0)
1223 idx += TRACE_ITEM_CNT;
1225 *(ptr++) = (u8)(chip->trace_msg[idx].line >> 8);
1226 *(ptr++) = (u8)(chip->trace_msg[idx].line);
1227 for (j = 0; j < MSG_FUNC_LEN; j++) {
1228 *(ptr++) = chip->trace_msg[idx].func[j];
1230 for (j = 0; j < MSG_FILE_LEN; j++) {
1231 *(ptr++) = chip->trace_msg[idx].file[j];
1233 for (j = 0; j < TIME_VAL_LEN; j++) {
1234 *(ptr++) = chip->trace_msg[idx].timeval_buf[j];
1238 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
1239 vfree(buf);
1241 if (clear) {
1242 chip->msg_idx = 0;
1243 for (i = 0; i < TRACE_ITEM_CNT; i++)
1244 chip->trace_msg[i].valid = 0;
1247 scsi_set_resid(srb, 0);
1248 return TRANSPORT_GOOD;
1250 #endif
1252 static int read_host_reg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1254 u8 addr, buf[4];
1255 u32 val;
1256 unsigned int len;
1258 rtsx_disable_aspm(chip);
1260 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1261 rtsx_exit_ss(chip);
1262 wait_timeout(100);
1264 rtsx_set_stat(chip, RTSX_STAT_RUN);
1266 addr = srb->cmnd[4];
1268 val = rtsx_readl(chip, addr);
1269 RTSX_DEBUGP("Host register (0x%x): 0x%x\n", addr, val);
1271 buf[0] = (u8)(val >> 24);
1272 buf[1] = (u8)(val >> 16);
1273 buf[2] = (u8)(val >> 8);
1274 buf[3] = (u8)val;
1276 len = min(scsi_bufflen(srb), (unsigned int)4);
1277 rtsx_stor_set_xfer_buf(buf, len, srb);
1278 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1280 return TRANSPORT_GOOD;
1283 static int write_host_reg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1285 u8 addr, buf[4];
1286 u32 val;
1287 unsigned int len;
1289 rtsx_disable_aspm(chip);
1291 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1292 rtsx_exit_ss(chip);
1293 wait_timeout(100);
1295 rtsx_set_stat(chip, RTSX_STAT_RUN);
1297 addr = srb->cmnd[4];
1299 len = min(scsi_bufflen(srb), (unsigned int)4);
1300 rtsx_stor_get_xfer_buf(buf, len, srb);
1301 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1303 val = ((u32)buf[0] << 24) | ((u32)buf[1] << 16) | ((u32)buf[2] << 8) | buf[3];
1305 rtsx_writel(chip, addr, val);
1307 return TRANSPORT_GOOD;
1310 static int set_variable(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1312 unsigned lun = SCSI_LUN(srb);
1314 if (srb->cmnd[3] == 1) {
1315 /* Variable Clock */
1316 struct xd_info *xd_card = &(chip->xd_card);
1317 struct sd_info *sd_card = &(chip->sd_card);
1318 struct ms_info *ms_card = &(chip->ms_card);
1320 switch (srb->cmnd[4]) {
1321 case XD_CARD:
1322 xd_card->xd_clock = srb->cmnd[5];
1323 break;
1325 case SD_CARD:
1326 sd_card->sd_clock = srb->cmnd[5];
1327 break;
1329 case MS_CARD:
1330 ms_card->ms_clock = srb->cmnd[5];
1331 break;
1333 default:
1334 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1335 TRACE_RET(chip, TRANSPORT_FAILED);
1337 } else if (srb->cmnd[3] == 2) {
1338 if (srb->cmnd[4]) {
1339 chip->blink_led = 1;
1340 } else {
1341 int retval;
1343 chip->blink_led = 0;
1345 rtsx_disable_aspm(chip);
1347 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1348 rtsx_exit_ss(chip);
1349 wait_timeout(100);
1351 rtsx_set_stat(chip, RTSX_STAT_RUN);
1353 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1354 if (retval != STATUS_SUCCESS) {
1355 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1356 TRACE_RET(chip, TRANSPORT_FAILED);
1359 turn_off_led(chip, LED_GPIO);
1361 } else {
1362 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1363 TRACE_RET(chip, TRANSPORT_FAILED);
1366 return TRANSPORT_GOOD;
1369 static int get_variable(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1371 unsigned int lun = SCSI_LUN(srb);
1373 if (srb->cmnd[3] == 1) {
1374 struct xd_info *xd_card = &(chip->xd_card);
1375 struct sd_info *sd_card = &(chip->sd_card);
1376 struct ms_info *ms_card = &(chip->ms_card);
1377 u8 tmp;
1379 switch (srb->cmnd[4]) {
1380 case XD_CARD:
1381 tmp = (u8)(xd_card->xd_clock);
1382 break;
1384 case SD_CARD:
1385 tmp = (u8)(sd_card->sd_clock);
1386 break;
1388 case MS_CARD:
1389 tmp = (u8)(ms_card->ms_clock);
1390 break;
1392 default:
1393 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1394 TRACE_RET(chip, TRANSPORT_FAILED);
1397 rtsx_stor_set_xfer_buf(&tmp, 1, srb);
1398 } else if (srb->cmnd[3] == 2) {
1399 u8 tmp = chip->blink_led;
1400 rtsx_stor_set_xfer_buf(&tmp, 1, srb);
1401 } else {
1402 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1403 TRACE_RET(chip, TRANSPORT_FAILED);
1406 return TRANSPORT_GOOD;
1409 static int dma_access_ring_buffer(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1411 int retval;
1412 unsigned int lun = SCSI_LUN(srb);
1413 u16 len;
1415 rtsx_disable_aspm(chip);
1417 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1418 rtsx_exit_ss(chip);
1419 wait_timeout(100);
1421 rtsx_set_stat(chip, RTSX_STAT_RUN);
1423 len = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
1424 len = min(len, (u16)scsi_bufflen(srb));
1426 if (srb->sc_data_direction == DMA_FROM_DEVICE) {
1427 RTSX_DEBUGP("Read from device\n");
1428 } else {
1429 RTSX_DEBUGP("Write to device\n");
1432 retval = rtsx_transfer_data(chip, 0, scsi_sglist(srb), len,
1433 scsi_sg_count(srb), srb->sc_data_direction, 1000);
1434 if (retval < 0) {
1435 if (srb->sc_data_direction == DMA_FROM_DEVICE) {
1436 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1437 } else {
1438 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
1440 TRACE_RET(chip, TRANSPORT_FAILED);
1442 scsi_set_resid(srb, 0);
1444 return TRANSPORT_GOOD;
1447 static int get_dev_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1449 struct sd_info *sd_card = &(chip->sd_card);
1450 struct ms_info *ms_card = &(chip->ms_card);
1451 int buf_len;
1452 unsigned int lun = SCSI_LUN(srb);
1453 u8 card = get_lun_card(chip, lun);
1454 u8 status[32];
1455 #ifdef SUPPORT_OCP
1456 u8 oc_now_mask = 0, oc_ever_mask = 0;
1457 #endif
1459 memset(status, 0, 32);
1461 status[0] = (u8)(chip->product_id);
1462 status[1] = chip->ic_version;
1464 if (chip->auto_delink_en) {
1465 status[2] = 0x10;
1466 } else {
1467 status[2] = 0x00;
1470 status[3] = 20;
1471 status[4] = 10;
1472 status[5] = 05;
1473 status[6] = 21;
1475 if (chip->card_wp) {
1476 status[7] = 0x20;
1477 } else {
1478 status[7] = 0x00;
1481 #ifdef SUPPORT_OCP
1482 status[8] = 0;
1483 if (CHECK_LUN_MODE(chip, SD_MS_2LUN) && (chip->lun2card[lun] == MS_CARD)) {
1484 oc_now_mask = MS_OC_NOW;
1485 oc_ever_mask = MS_OC_EVER;
1486 } else {
1487 oc_now_mask = SD_OC_NOW;
1488 oc_ever_mask = SD_OC_EVER;
1491 if (chip->ocp_stat & oc_now_mask) {
1492 status[8] |= 0x02;
1494 if (chip->ocp_stat & oc_ever_mask) {
1495 status[8] |= 0x01;
1497 #endif
1499 if (card == SD_CARD) {
1500 if (CHK_SD(sd_card)) {
1501 if (CHK_SD_HCXC(sd_card)) {
1502 if (sd_card->capacity > 0x4000000) {
1503 status[0x0E] = 0x02;
1504 } else {
1505 status[0x0E] = 0x01;
1507 } else {
1508 status[0x0E] = 0x00;
1511 if (CHK_SD_SDR104(sd_card)) {
1512 status[0x0F] = 0x03;
1513 } else if (CHK_SD_DDR50(sd_card)) {
1514 status[0x0F] = 0x04;
1515 } else if (CHK_SD_SDR50(sd_card)) {
1516 status[0x0F] = 0x02;
1517 } else if (CHK_SD_HS(sd_card)) {
1518 status[0x0F] = 0x01;
1519 } else {
1520 status[0x0F] = 0x00;
1522 } else {
1523 if (CHK_MMC_SECTOR_MODE(sd_card)) {
1524 status[0x0E] = 0x01;
1525 } else {
1526 status[0x0E] = 0x00;
1529 if (CHK_MMC_DDR52(sd_card)) {
1530 status[0x0F] = 0x03;
1531 } else if (CHK_MMC_52M(sd_card)) {
1532 status[0x0F] = 0x02;
1533 } else if (CHK_MMC_26M(sd_card)) {
1534 status[0x0F] = 0x01;
1535 } else {
1536 status[0x0F] = 0x00;
1539 } else if (card == MS_CARD) {
1540 if (CHK_MSPRO(ms_card)) {
1541 if (CHK_MSXC(ms_card)) {
1542 status[0x0E] = 0x01;
1543 } else {
1544 status[0x0E] = 0x00;
1547 if (CHK_HG8BIT(ms_card)) {
1548 status[0x0F] = 0x01;
1549 } else {
1550 status[0x0F] = 0x00;
1555 #ifdef SUPPORT_SD_LOCK
1556 if (card == SD_CARD) {
1557 status[0x17] = 0x80;
1558 if (sd_card->sd_erase_status)
1559 status[0x17] |= 0x01;
1560 if (sd_card->sd_lock_status & SD_LOCKED) {
1561 status[0x17] |= 0x02;
1562 status[0x07] |= 0x40;
1564 if (sd_card->sd_lock_status & SD_PWD_EXIST)
1565 status[0x17] |= 0x04;
1566 } else {
1567 status[0x17] = 0x00;
1570 RTSX_DEBUGP("status[0x17] = 0x%x\n", status[0x17]);
1571 #endif
1573 status[0x18] = 0x8A;
1574 status[0x1A] = 0x28;
1575 #ifdef SUPPORT_SD_LOCK
1576 status[0x1F] = 0x01;
1577 #endif
1579 buf_len = min(scsi_bufflen(srb), (unsigned int)sizeof(status));
1580 rtsx_stor_set_xfer_buf(status, buf_len, srb);
1581 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
1583 return TRANSPORT_GOOD;
1586 static int set_chip_mode(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1588 int phy_debug_mode;
1589 int retval;
1590 u16 reg;
1592 if (!CHECK_PID(chip, 0x5208)) {
1593 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1594 TRACE_RET(chip, TRANSPORT_FAILED);
1597 phy_debug_mode = (int)(srb->cmnd[3]);
1599 if (phy_debug_mode) {
1600 chip->phy_debug_mode = 1;
1601 retval = rtsx_write_register(chip, CDRESUMECTL, 0x77, 0);
1602 if (retval != STATUS_SUCCESS) {
1603 TRACE_RET(chip, TRANSPORT_FAILED);
1605 rtsx_disable_bus_int(chip);
1607 retval = rtsx_read_phy_register(chip, 0x1C, &reg);
1608 if (retval != STATUS_SUCCESS) {
1609 TRACE_RET(chip, TRANSPORT_FAILED);
1611 reg |= 0x0001;
1612 retval = rtsx_write_phy_register(chip, 0x1C, reg);
1613 if (retval != STATUS_SUCCESS) {
1614 TRACE_RET(chip, TRANSPORT_FAILED);
1616 } else {
1617 chip->phy_debug_mode = 0;
1618 retval = rtsx_write_register(chip, CDRESUMECTL, 0x77, 0x77);
1619 if (retval != STATUS_SUCCESS) {
1620 TRACE_RET(chip, TRANSPORT_FAILED);
1622 rtsx_enable_bus_int(chip);
1624 retval = rtsx_read_phy_register(chip, 0x1C, &reg);
1625 if (retval != STATUS_SUCCESS) {
1626 TRACE_RET(chip, TRANSPORT_FAILED);
1628 reg &= 0xFFFE;
1629 retval = rtsx_write_phy_register(chip, 0x1C, reg);
1630 if (retval != STATUS_SUCCESS) {
1631 TRACE_RET(chip, TRANSPORT_FAILED);
1635 return TRANSPORT_GOOD;
1638 static int rw_mem_cmd_buf(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1640 int retval = STATUS_SUCCESS;
1641 unsigned int lun = SCSI_LUN(srb);
1642 u8 cmd_type, mask, value, idx;
1643 u16 addr;
1645 rtsx_disable_aspm(chip);
1647 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1648 rtsx_exit_ss(chip);
1649 wait_timeout(100);
1651 rtsx_set_stat(chip, RTSX_STAT_RUN);
1653 switch (srb->cmnd[3]) {
1654 case INIT_BATCHCMD:
1655 rtsx_init_cmd(chip);
1656 break;
1658 case ADD_BATCHCMD:
1659 cmd_type = srb->cmnd[4];
1660 if (cmd_type > 2) {
1661 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1662 TRACE_RET(chip, TRANSPORT_FAILED);
1664 addr = (srb->cmnd[5] << 8) | srb->cmnd[6];
1665 mask = srb->cmnd[7];
1666 value = srb->cmnd[8];
1667 rtsx_add_cmd(chip, cmd_type, addr, mask, value);
1668 break;
1670 case SEND_BATCHCMD:
1671 retval = rtsx_send_cmd(chip, 0, 1000);
1672 break;
1674 case GET_BATCHRSP:
1675 idx = srb->cmnd[4];
1676 value = *(rtsx_get_cmd_data(chip) + idx);
1677 if (scsi_bufflen(srb) < 1) {
1678 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1679 TRACE_RET(chip, TRANSPORT_FAILED);
1681 rtsx_stor_set_xfer_buf(&value, 1, srb);
1682 scsi_set_resid(srb, 0);
1683 break;
1685 default:
1686 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1687 TRACE_RET(chip, TRANSPORT_FAILED);
1690 if (retval != STATUS_SUCCESS) {
1691 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
1692 TRACE_RET(chip, TRANSPORT_FAILED);
1695 return TRANSPORT_GOOD;
1698 static int suit_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1700 int result;
1702 switch (srb->cmnd[3]) {
1703 case INIT_BATCHCMD:
1704 case ADD_BATCHCMD:
1705 case SEND_BATCHCMD:
1706 case GET_BATCHRSP:
1707 result = rw_mem_cmd_buf(srb, chip);
1708 break;
1709 default:
1710 result = TRANSPORT_ERROR;
1713 return result;
1716 static int read_phy_register(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1718 unsigned short addr, len, i;
1719 int retval;
1720 u8 *buf;
1721 u16 val;
1723 rtsx_disable_aspm(chip);
1725 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1726 rtsx_exit_ss(chip);
1727 wait_timeout(100);
1729 rtsx_set_stat(chip, RTSX_STAT_RUN);
1731 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1732 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1734 if (len % 2)
1735 len -= len % 2;
1737 if (len) {
1738 buf = (u8 *)vmalloc(len);
1739 if (!buf) {
1740 TRACE_RET(chip, TRANSPORT_ERROR);
1743 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1744 if (retval != STATUS_SUCCESS) {
1745 vfree(buf);
1746 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1747 TRACE_RET(chip, TRANSPORT_FAILED);
1750 for (i = 0; i < len / 2; i++) {
1751 retval = rtsx_read_phy_register(chip, addr + i, &val);
1752 if (retval != STATUS_SUCCESS) {
1753 vfree(buf);
1754 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1755 TRACE_RET(chip, TRANSPORT_FAILED);
1758 buf[2*i] = (u8)(val >> 8);
1759 buf[2*i+1] = (u8)val;
1762 len = (unsigned short)min(scsi_bufflen(srb), (unsigned int)len);
1763 rtsx_stor_set_xfer_buf(buf, len, srb);
1764 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1766 vfree(buf);
1769 return TRANSPORT_GOOD;
1772 static int write_phy_register(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1774 unsigned short addr, len, i;
1775 int retval;
1776 u8 *buf;
1777 u16 val;
1779 rtsx_disable_aspm(chip);
1781 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1782 rtsx_exit_ss(chip);
1783 wait_timeout(100);
1785 rtsx_set_stat(chip, RTSX_STAT_RUN);
1787 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1788 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1790 if (len % 2)
1791 len -= len % 2;
1793 if (len) {
1794 len = (unsigned short)min(scsi_bufflen(srb), (unsigned int)len);
1796 buf = (u8 *)vmalloc(len);
1797 if (buf == NULL) {
1798 TRACE_RET(chip, TRANSPORT_ERROR);
1801 rtsx_stor_get_xfer_buf(buf, len, srb);
1802 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1804 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1805 if (retval != STATUS_SUCCESS) {
1806 vfree(buf);
1807 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1808 TRACE_RET(chip, TRANSPORT_FAILED);
1811 for (i = 0; i < len / 2; i++) {
1812 val = ((u16)buf[2*i] << 8) | buf[2*i+1];
1813 retval = rtsx_write_phy_register(chip, addr + i, val);
1814 if (retval != STATUS_SUCCESS) {
1815 vfree(buf);
1816 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1817 TRACE_RET(chip, TRANSPORT_FAILED);
1821 vfree(buf);
1824 return TRANSPORT_GOOD;
1827 static int erase_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1829 unsigned short addr;
1830 int retval;
1831 u8 mode;
1833 rtsx_disable_aspm(chip);
1835 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1836 rtsx_exit_ss(chip);
1837 wait_timeout(100);
1839 rtsx_set_stat(chip, RTSX_STAT_RUN);
1841 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1842 if (retval != STATUS_SUCCESS) {
1843 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1844 TRACE_RET(chip, TRANSPORT_FAILED);
1847 mode = srb->cmnd[3];
1848 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1850 if (mode == 0) {
1851 retval = spi_erase_eeprom_chip(chip);
1852 if (retval != STATUS_SUCCESS) {
1853 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1854 TRACE_RET(chip, TRANSPORT_FAILED);
1856 } else if (mode == 1) {
1857 retval = spi_erase_eeprom_byte(chip, addr);
1858 if (retval != STATUS_SUCCESS) {
1859 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1860 TRACE_RET(chip, TRANSPORT_FAILED);
1862 } else {
1863 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1864 TRACE_RET(chip, TRANSPORT_FAILED);
1867 return TRANSPORT_GOOD;
1870 static int read_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1872 unsigned short addr, len, i;
1873 int retval;
1874 u8 *buf;
1876 rtsx_disable_aspm(chip);
1878 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1879 rtsx_exit_ss(chip);
1880 wait_timeout(100);
1882 rtsx_set_stat(chip, RTSX_STAT_RUN);
1884 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1885 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1887 buf = (u8 *)vmalloc(len);
1888 if (!buf) {
1889 TRACE_RET(chip, TRANSPORT_ERROR);
1892 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1893 if (retval != STATUS_SUCCESS) {
1894 vfree(buf);
1895 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1896 TRACE_RET(chip, TRANSPORT_FAILED);
1899 for (i = 0; i < len; i++) {
1900 retval = spi_read_eeprom(chip, addr + i, buf + i);
1901 if (retval != STATUS_SUCCESS) {
1902 vfree(buf);
1903 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1904 TRACE_RET(chip, TRANSPORT_FAILED);
1908 len = (unsigned short)min(scsi_bufflen(srb), (unsigned int)len);
1909 rtsx_stor_set_xfer_buf(buf, len, srb);
1910 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1912 vfree(buf);
1914 return TRANSPORT_GOOD;
1917 static int write_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1919 unsigned short addr, len, i;
1920 int retval;
1921 u8 *buf;
1923 rtsx_disable_aspm(chip);
1925 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1926 rtsx_exit_ss(chip);
1927 wait_timeout(100);
1929 rtsx_set_stat(chip, RTSX_STAT_RUN);
1931 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1932 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1934 len = (unsigned short)min(scsi_bufflen(srb), (unsigned int)len);
1935 buf = (u8 *)vmalloc(len);
1936 if (buf == NULL) {
1937 TRACE_RET(chip, TRANSPORT_ERROR);
1940 rtsx_stor_get_xfer_buf(buf, len, srb);
1941 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1943 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1944 if (retval != STATUS_SUCCESS) {
1945 vfree(buf);
1946 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1947 TRACE_RET(chip, TRANSPORT_FAILED);
1950 for (i = 0; i < len; i++) {
1951 retval = spi_write_eeprom(chip, addr + i, buf[i]);
1952 if (retval != STATUS_SUCCESS) {
1953 vfree(buf);
1954 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1955 TRACE_RET(chip, TRANSPORT_FAILED);
1959 vfree(buf);
1961 return TRANSPORT_GOOD;
1964 static int read_efuse(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1966 int retval;
1967 u8 addr, len, i;
1968 u8 *buf;
1970 rtsx_disable_aspm(chip);
1972 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1973 rtsx_exit_ss(chip);
1974 wait_timeout(100);
1976 rtsx_set_stat(chip, RTSX_STAT_RUN);
1978 addr = srb->cmnd[4];
1979 len = srb->cmnd[5];
1981 buf = (u8 *)vmalloc(len);
1982 if (!buf) {
1983 TRACE_RET(chip, TRANSPORT_ERROR);
1986 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1987 if (retval != STATUS_SUCCESS) {
1988 vfree(buf);
1989 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1990 TRACE_RET(chip, TRANSPORT_FAILED);
1993 for (i = 0; i < len; i++) {
1994 retval = rtsx_read_efuse(chip, addr + i, buf + i);
1995 if (retval != STATUS_SUCCESS) {
1996 vfree(buf);
1997 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1998 TRACE_RET(chip, TRANSPORT_FAILED);
2002 len = (u8)min(scsi_bufflen(srb), (unsigned int)len);
2003 rtsx_stor_set_xfer_buf(buf, len, srb);
2004 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2006 vfree(buf);
2008 return TRANSPORT_GOOD;
2011 static int write_efuse(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2013 int retval, result = TRANSPORT_GOOD;
2014 u16 val;
2015 u8 addr, len, i;
2016 u8 *buf;
2018 rtsx_disable_aspm(chip);
2020 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2021 rtsx_exit_ss(chip);
2022 wait_timeout(100);
2024 rtsx_set_stat(chip, RTSX_STAT_RUN);
2026 addr = srb->cmnd[4];
2027 len = srb->cmnd[5];
2029 len = (u8)min(scsi_bufflen(srb), (unsigned int)len);
2030 buf = (u8 *)vmalloc(len);
2031 if (buf == NULL) {
2032 TRACE_RET(chip, TRANSPORT_ERROR);
2035 rtsx_stor_get_xfer_buf(buf, len, srb);
2036 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2038 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2039 if (retval != STATUS_SUCCESS) {
2040 vfree(buf);
2041 TRACE_RET(chip, TRANSPORT_ERROR);
2044 if (chip->asic_code) {
2045 retval = rtsx_read_phy_register(chip, 0x08, &val);
2046 if (retval != STATUS_SUCCESS) {
2047 vfree(buf);
2048 TRACE_RET(chip, TRANSPORT_ERROR);
2051 retval = rtsx_write_register(chip, PWR_GATE_CTRL, LDO3318_PWR_MASK, LDO_OFF);
2052 if (retval != STATUS_SUCCESS) {
2053 vfree(buf);
2054 TRACE_RET(chip, TRANSPORT_ERROR);
2057 wait_timeout(600);
2059 retval = rtsx_write_phy_register(chip, 0x08, 0x4C00 | chip->phy_voltage);
2060 if (retval != STATUS_SUCCESS) {
2061 vfree(buf);
2062 TRACE_RET(chip, TRANSPORT_ERROR);
2065 retval = rtsx_write_register(chip, PWR_GATE_CTRL, LDO3318_PWR_MASK, LDO_ON);
2066 if (retval != STATUS_SUCCESS) {
2067 vfree(buf);
2068 TRACE_RET(chip, TRANSPORT_ERROR);
2071 wait_timeout(600);
2074 retval = card_power_on(chip, SPI_CARD);
2075 if (retval != STATUS_SUCCESS) {
2076 vfree(buf);
2077 TRACE_RET(chip, TRANSPORT_ERROR);
2080 wait_timeout(50);
2082 for (i = 0; i < len; i++) {
2083 retval = rtsx_write_efuse(chip, addr + i, buf[i]);
2084 if (retval != STATUS_SUCCESS) {
2085 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
2086 result = TRANSPORT_FAILED;
2087 TRACE_GOTO(chip, Exit);
2091 Exit:
2092 vfree(buf);
2094 retval = card_power_off(chip, SPI_CARD);
2095 if (retval != STATUS_SUCCESS) {
2096 TRACE_RET(chip, TRANSPORT_ERROR);
2099 if (chip->asic_code) {
2100 retval = rtsx_write_register(chip, PWR_GATE_CTRL, LDO3318_PWR_MASK, LDO_OFF);
2101 if (retval != STATUS_SUCCESS) {
2102 TRACE_RET(chip, TRANSPORT_ERROR);
2105 wait_timeout(600);
2107 retval = rtsx_write_phy_register(chip, 0x08, val);
2108 if (retval != STATUS_SUCCESS) {
2109 TRACE_RET(chip, TRANSPORT_ERROR);
2112 retval = rtsx_write_register(chip, PWR_GATE_CTRL, LDO3318_PWR_MASK, LDO_ON);
2113 if (retval != STATUS_SUCCESS) {
2114 TRACE_RET(chip, TRANSPORT_ERROR);
2118 return result;
2121 static int read_cfg_byte(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2123 int retval;
2124 u8 func, func_max;
2125 u16 addr, len;
2126 u8 *buf;
2128 rtsx_disable_aspm(chip);
2130 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2131 rtsx_exit_ss(chip);
2132 wait_timeout(100);
2134 rtsx_set_stat(chip, RTSX_STAT_RUN);
2136 func = srb->cmnd[3];
2137 addr = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
2138 len = ((u16)(srb->cmnd[6]) << 8) | srb->cmnd[7];
2140 RTSX_DEBUGP("%s: func = %d, addr = 0x%x, len = %d\n", __func__, func, addr, len);
2142 if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip)) {
2143 func_max = 1;
2144 } else {
2145 func_max = 0;
2148 if (func > func_max) {
2149 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2150 TRACE_RET(chip, TRANSPORT_FAILED);
2153 buf = (u8 *)vmalloc(len);
2154 if (!buf) {
2155 TRACE_RET(chip, TRANSPORT_ERROR);
2158 retval = rtsx_read_cfg_seq(chip, func, addr, buf, len);
2159 if (retval != STATUS_SUCCESS) {
2160 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2161 vfree(buf);
2162 TRACE_RET(chip, TRANSPORT_FAILED);
2165 len = (u16)min(scsi_bufflen(srb), (unsigned int)len);
2166 rtsx_stor_set_xfer_buf(buf, len, srb);
2167 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2169 vfree(buf);
2171 return TRANSPORT_GOOD;
2174 static int write_cfg_byte(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2176 int retval;
2177 u8 func, func_max;
2178 u16 addr, len;
2179 u8 *buf;
2181 rtsx_disable_aspm(chip);
2183 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2184 rtsx_exit_ss(chip);
2185 wait_timeout(100);
2187 rtsx_set_stat(chip, RTSX_STAT_RUN);
2189 func = srb->cmnd[3];
2190 addr = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
2191 len = ((u16)(srb->cmnd[6]) << 8) | srb->cmnd[7];
2193 RTSX_DEBUGP("%s: func = %d, addr = 0x%x\n", __func__, func, addr);
2195 if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip)) {
2196 func_max = 1;
2197 } else {
2198 func_max = 0;
2201 if (func > func_max) {
2202 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2203 TRACE_RET(chip, TRANSPORT_FAILED);
2206 len = (unsigned short)min(scsi_bufflen(srb), (unsigned int)len);
2207 buf = (u8 *)vmalloc(len);
2208 if (!buf) {
2209 TRACE_RET(chip, TRANSPORT_ERROR);
2212 rtsx_stor_get_xfer_buf(buf, len, srb);
2213 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2215 retval = rtsx_write_cfg_seq(chip, func, addr, buf, len);
2216 if (retval != STATUS_SUCCESS) {
2217 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
2218 vfree(buf);
2219 TRACE_RET(chip, TRANSPORT_FAILED);
2222 vfree(buf);
2224 return TRANSPORT_GOOD;
2227 static int app_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2229 int result;
2231 switch (srb->cmnd[2]) {
2232 case PP_READ10:
2233 case PP_WRITE10:
2234 result = read_write(srb, chip);
2235 break;
2237 case READ_HOST_REG:
2238 result = read_host_reg(srb, chip);
2239 break;
2241 case WRITE_HOST_REG:
2242 result = write_host_reg(srb, chip);
2243 break;
2245 case GET_VAR:
2246 result = get_variable(srb, chip);
2247 break;
2249 case SET_VAR:
2250 result = set_variable(srb, chip);
2251 break;
2253 case DMA_READ:
2254 case DMA_WRITE:
2255 result = dma_access_ring_buffer(srb, chip);
2256 break;
2258 case READ_PHY:
2259 result = read_phy_register(srb, chip);
2260 break;
2262 case WRITE_PHY:
2263 result = write_phy_register(srb, chip);
2264 break;
2266 case ERASE_EEPROM2:
2267 result = erase_eeprom2(srb, chip);
2268 break;
2270 case READ_EEPROM2:
2271 result = read_eeprom2(srb, chip);
2272 break;
2274 case WRITE_EEPROM2:
2275 result = write_eeprom2(srb, chip);
2276 break;
2278 case READ_EFUSE:
2279 result = read_efuse(srb, chip);
2280 break;
2282 case WRITE_EFUSE:
2283 result = write_efuse(srb, chip);
2284 break;
2286 case READ_CFG:
2287 result = read_cfg_byte(srb, chip);
2288 break;
2290 case WRITE_CFG:
2291 result = write_cfg_byte(srb, chip);
2292 break;
2294 case SET_CHIP_MODE:
2295 result = set_chip_mode(srb, chip);
2296 break;
2298 case SUIT_CMD:
2299 result = suit_cmd(srb, chip);
2300 break;
2302 case GET_DEV_STATUS:
2303 result = get_dev_status(srb, chip);
2304 break;
2306 default:
2307 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2308 TRACE_RET(chip, TRANSPORT_FAILED);
2311 return result;
2315 static int read_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2317 u8 rtsx_status[16];
2318 int buf_len;
2319 unsigned int lun = SCSI_LUN(srb);
2321 rtsx_status[0] = (u8)(chip->vendor_id >> 8);
2322 rtsx_status[1] = (u8)(chip->vendor_id);
2324 rtsx_status[2] = (u8)(chip->product_id >> 8);
2325 rtsx_status[3] = (u8)(chip->product_id);
2327 rtsx_status[4] = (u8)lun;
2329 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
2330 if (chip->lun2card[lun] == SD_CARD) {
2331 rtsx_status[5] = 2;
2332 } else {
2333 rtsx_status[5] = 3;
2335 } else {
2336 if (chip->card_exist) {
2337 if (chip->card_exist & XD_CARD) {
2338 rtsx_status[5] = 4;
2339 } else if (chip->card_exist & SD_CARD) {
2340 rtsx_status[5] = 2;
2341 } else if (chip->card_exist & MS_CARD) {
2342 rtsx_status[5] = 3;
2343 } else {
2344 rtsx_status[5] = 7;
2346 } else {
2347 rtsx_status[5] = 7;
2351 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
2352 rtsx_status[6] = 2;
2353 } else {
2354 rtsx_status[6] = 1;
2357 rtsx_status[7] = (u8)(chip->product_id);
2358 rtsx_status[8] = chip->ic_version;
2360 if (check_card_exist(chip, lun)) {
2361 rtsx_status[9] = 1;
2362 } else {
2363 rtsx_status[9] = 0;
2366 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
2367 rtsx_status[10] = 0;
2368 } else {
2369 rtsx_status[10] = 1;
2372 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
2373 if (chip->lun2card[lun] == SD_CARD) {
2374 rtsx_status[11] = SD_CARD;
2375 } else {
2376 rtsx_status[11] = MS_CARD;
2378 } else {
2379 rtsx_status[11] = XD_CARD | SD_CARD | MS_CARD;
2382 if (check_card_ready(chip, lun)) {
2383 rtsx_status[12] = 1;
2384 } else {
2385 rtsx_status[12] = 0;
2388 if (get_lun_card(chip, lun) == XD_CARD) {
2389 rtsx_status[13] = 0x40;
2390 } else if (get_lun_card(chip, lun) == SD_CARD) {
2391 struct sd_info *sd_card = &(chip->sd_card);
2393 rtsx_status[13] = 0x20;
2394 if (CHK_SD(sd_card)) {
2395 if (CHK_SD_HCXC(sd_card))
2396 rtsx_status[13] |= 0x04;
2397 if (CHK_SD_HS(sd_card))
2398 rtsx_status[13] |= 0x02;
2399 } else {
2400 rtsx_status[13] |= 0x08;
2401 if (CHK_MMC_52M(sd_card))
2402 rtsx_status[13] |= 0x02;
2403 if (CHK_MMC_SECTOR_MODE(sd_card))
2404 rtsx_status[13] |= 0x04;
2406 } else if (get_lun_card(chip, lun) == MS_CARD) {
2407 struct ms_info *ms_card = &(chip->ms_card);
2409 if (CHK_MSPRO(ms_card)) {
2410 rtsx_status[13] = 0x38;
2411 if (CHK_HG8BIT(ms_card))
2412 rtsx_status[13] |= 0x04;
2413 #ifdef SUPPORT_MSXC
2414 if (CHK_MSXC(ms_card))
2415 rtsx_status[13] |= 0x01;
2416 #endif
2417 } else {
2418 rtsx_status[13] = 0x30;
2420 } else {
2421 if (CHECK_LUN_MODE(chip, DEFAULT_SINGLE)) {
2422 #ifdef SUPPORT_SDIO
2423 if (chip->sd_io && chip->sd_int) {
2424 rtsx_status[13] = 0x60;
2425 } else {
2426 rtsx_status[13] = 0x70;
2428 #else
2429 rtsx_status[13] = 0x70;
2430 #endif
2431 } else {
2432 if (chip->lun2card[lun] == SD_CARD) {
2433 rtsx_status[13] = 0x20;
2434 } else {
2435 rtsx_status[13] = 0x30;
2440 rtsx_status[14] = 0x78;
2441 if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip)) {
2442 rtsx_status[15] = 0x83;
2443 } else {
2444 rtsx_status[15] = 0x82;
2447 buf_len = min(scsi_bufflen(srb), (unsigned int)sizeof(rtsx_status));
2448 rtsx_stor_set_xfer_buf(rtsx_status, buf_len, srb);
2449 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
2451 return TRANSPORT_GOOD;
2454 static int get_card_bus_width(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2456 unsigned int lun = SCSI_LUN(srb);
2457 u8 card, bus_width;
2459 if (!check_card_ready(chip, lun)) {
2460 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2461 TRACE_RET(chip, TRANSPORT_FAILED);
2464 card = get_lun_card(chip, lun);
2465 if ((card == SD_CARD) || (card == MS_CARD)) {
2466 bus_width = chip->card_bus_width[lun];
2467 } else {
2468 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
2469 TRACE_RET(chip, TRANSPORT_FAILED);
2472 scsi_set_resid(srb, 0);
2473 rtsx_stor_set_xfer_buf(&bus_width, scsi_bufflen(srb), srb);
2475 return TRANSPORT_GOOD;
2478 static int spi_vendor_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2480 int result;
2481 unsigned int lun = SCSI_LUN(srb);
2482 u8 gpio_dir;
2484 if (CHECK_PID(chip, 0x5208) && CHECK_PID(chip, 0x5288)) {
2485 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2486 TRACE_RET(chip, TRANSPORT_FAILED);
2489 rtsx_disable_aspm(chip);
2491 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2492 rtsx_exit_ss(chip);
2493 wait_timeout(100);
2495 rtsx_set_stat(chip, RTSX_STAT_RUN);
2497 rtsx_force_power_on(chip, SSC_PDCTL);
2499 rtsx_read_register(chip, CARD_GPIO_DIR, &gpio_dir);
2500 rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir & 0x06);
2502 switch (srb->cmnd[2]) {
2503 case SCSI_SPI_GETSTATUS:
2504 result = spi_get_status(srb, chip);
2505 break;
2507 case SCSI_SPI_SETPARAMETER:
2508 result = spi_set_parameter(srb, chip);
2509 break;
2511 case SCSI_SPI_READFALSHID:
2512 result = spi_read_flash_id(srb, chip);
2513 break;
2515 case SCSI_SPI_READFLASH:
2516 result = spi_read_flash(srb, chip);
2517 break;
2519 case SCSI_SPI_WRITEFLASH:
2520 result = spi_write_flash(srb, chip);
2521 break;
2523 case SCSI_SPI_WRITEFLASHSTATUS:
2524 result = spi_write_flash_status(srb, chip);
2525 break;
2527 case SCSI_SPI_ERASEFLASH:
2528 result = spi_erase_flash(srb, chip);
2529 break;
2531 default:
2532 rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir);
2534 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2535 TRACE_RET(chip, TRANSPORT_FAILED);
2538 rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir);
2540 if (result != STATUS_SUCCESS) {
2541 TRACE_RET(chip, TRANSPORT_FAILED);
2544 return TRANSPORT_GOOD;
2547 static int vendor_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2549 int result;
2551 switch (srb->cmnd[1]) {
2552 case READ_STATUS:
2553 result = read_status(srb, chip);
2554 break;
2556 case READ_MEM:
2557 result = read_mem(srb, chip);
2558 break;
2560 case WRITE_MEM:
2561 result = write_mem(srb, chip);
2562 break;
2564 case READ_EEPROM:
2565 result = read_eeprom(srb, chip);
2566 break;
2568 case WRITE_EEPROM:
2569 result = write_eeprom(srb, chip);
2570 break;
2572 case TOGGLE_GPIO:
2573 result = toggle_gpio_cmd(srb, chip);
2574 break;
2576 case GET_SD_CSD:
2577 result = get_sd_csd(srb, chip);
2578 break;
2580 case GET_BUS_WIDTH:
2581 result = get_card_bus_width(srb, chip);
2582 break;
2584 #ifdef _MSG_TRACE
2585 case TRACE_MSG:
2586 result = trace_msg_cmd(srb, chip);
2587 break;
2588 #endif
2590 case SCSI_APP_CMD:
2591 result = app_cmd(srb, chip);
2592 break;
2594 case SPI_VENDOR_COMMAND:
2595 result = spi_vendor_cmd(srb, chip);
2596 break;
2598 default:
2599 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2600 TRACE_RET(chip, TRANSPORT_FAILED);
2603 return result;
2606 #if !defined(LED_AUTO_BLINK) && !defined(REGULAR_BLINK)
2607 void led_shine(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2609 unsigned int lun = SCSI_LUN(srb);
2610 u16 sec_cnt;
2612 if ((srb->cmnd[0] == READ_10) || (srb->cmnd[0] == WRITE_10)) {
2613 sec_cnt = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
2614 } else if ((srb->cmnd[0] == READ_6) || (srb->cmnd[0] == WRITE_6)) {
2615 sec_cnt = srb->cmnd[4];
2616 } else {
2617 return;
2620 if (chip->rw_cap[lun] >= GPIO_TOGGLE_THRESHOLD) {
2621 toggle_gpio(chip, LED_GPIO);
2622 chip->rw_cap[lun] = 0;
2623 } else {
2624 chip->rw_cap[lun] += sec_cnt;
2627 #endif
2629 static int ms_format_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2631 struct ms_info *ms_card = &(chip->ms_card);
2632 unsigned int lun = SCSI_LUN(srb);
2633 int retval, quick_format;
2635 if (get_lun_card(chip, lun) != MS_CARD) {
2636 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2637 TRACE_RET(chip, TRANSPORT_FAILED);
2640 if ((srb->cmnd[3] != 0x4D) || (srb->cmnd[4] != 0x47) ||
2641 (srb->cmnd[5] != 0x66) || (srb->cmnd[6] != 0x6D) ||
2642 (srb->cmnd[7] != 0x74)) {
2643 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2644 TRACE_RET(chip, TRANSPORT_FAILED);
2647 rtsx_disable_aspm(chip);
2649 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2650 rtsx_exit_ss(chip);
2651 wait_timeout(100);
2653 if (!check_card_ready(chip, lun) ||
2654 (get_card_size(chip, lun) == 0)) {
2655 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2656 TRACE_RET(chip, TRANSPORT_FAILED);
2659 rtsx_set_stat(chip, RTSX_STAT_RUN);
2661 if (srb->cmnd[8] & 0x01) {
2662 quick_format = 0;
2663 } else {
2664 quick_format = 1;
2667 if (!(chip->card_ready & MS_CARD)) {
2668 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2669 TRACE_RET(chip, TRANSPORT_FAILED);
2672 if (chip->card_wp & MS_CARD) {
2673 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
2674 TRACE_RET(chip, TRANSPORT_FAILED);
2677 if (!CHK_MSPRO(ms_card)) {
2678 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2679 TRACE_RET(chip, TRANSPORT_FAILED);
2682 retval = mspro_format(srb, chip, MS_SHORT_DATA_LEN, quick_format);
2683 if (retval != STATUS_SUCCESS) {
2684 set_sense_type(chip, lun, SENSE_TYPE_FORMAT_CMD_FAILED);
2685 TRACE_RET(chip, TRANSPORT_FAILED);
2688 scsi_set_resid(srb, 0);
2689 return TRANSPORT_GOOD;
2692 #ifdef SUPPORT_PCGL_1P18
2693 static int get_ms_information(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2695 struct ms_info *ms_card = &(chip->ms_card);
2696 unsigned int lun = SCSI_LUN(srb);
2697 u8 dev_info_id, data_len;
2698 u8 *buf;
2699 unsigned int buf_len;
2700 int i;
2702 if (!check_card_ready(chip, lun)) {
2703 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2704 TRACE_RET(chip, TRANSPORT_FAILED);
2706 if ((get_lun_card(chip, lun) != MS_CARD)) {
2707 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2708 TRACE_RET(chip, TRANSPORT_FAILED);
2711 if ((srb->cmnd[2] != 0xB0) || (srb->cmnd[4] != 0x4D) ||
2712 (srb->cmnd[5] != 0x53) || (srb->cmnd[6] != 0x49) ||
2713 (srb->cmnd[7] != 0x44)) {
2714 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2715 TRACE_RET(chip, TRANSPORT_FAILED);
2718 dev_info_id = srb->cmnd[3];
2719 if ((CHK_MSXC(ms_card) && (dev_info_id == 0x10)) ||
2720 (!CHK_MSXC(ms_card) && (dev_info_id == 0x13)) ||
2721 !CHK_MSPRO(ms_card)) {
2722 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2723 TRACE_RET(chip, TRANSPORT_FAILED);
2726 if (dev_info_id == 0x15) {
2727 buf_len = data_len = 0x3A;
2728 } else {
2729 buf_len = data_len = 0x6A;
2732 buf = (u8 *)kmalloc(buf_len, GFP_KERNEL);
2733 if (!buf) {
2734 TRACE_RET(chip, TRANSPORT_ERROR);
2737 i = 0;
2738 /* GET Memory Stick Media Information Response Header */
2739 buf[i++] = 0x00; /* Data length MSB */
2740 buf[i++] = data_len; /* Data length LSB */
2741 /* Device Information Type Code */
2742 if (CHK_MSXC(ms_card)) {
2743 buf[i++] = 0x03;
2744 } else {
2745 buf[i++] = 0x02;
2747 /* SGM bit */
2748 buf[i++] = 0x01;
2749 /* Reserved */
2750 buf[i++] = 0x00;
2751 buf[i++] = 0x00;
2752 buf[i++] = 0x00;
2753 /* Number of Device Information */
2754 buf[i++] = 0x01;
2756 /* Device Information Body */
2758 /* Device Information ID Number */
2759 buf[i++] = dev_info_id;
2760 /* Device Information Length */
2761 if (dev_info_id == 0x15) {
2762 data_len = 0x31;
2763 } else {
2764 data_len = 0x61;
2766 buf[i++] = 0x00; /* Data length MSB */
2767 buf[i++] = data_len; /* Data length LSB */
2768 /* Valid Bit */
2769 buf[i++] = 0x80;
2770 if ((dev_info_id == 0x10) || (dev_info_id == 0x13)) {
2771 /* System Information */
2772 memcpy(buf+i, ms_card->raw_sys_info, 96);
2773 } else {
2774 /* Model Name */
2775 memcpy(buf+i, ms_card->raw_model_name, 48);
2778 rtsx_stor_set_xfer_buf(buf, buf_len, srb);
2780 if (dev_info_id == 0x15) {
2781 scsi_set_resid(srb, scsi_bufflen(srb)-0x3C);
2782 } else {
2783 scsi_set_resid(srb, scsi_bufflen(srb)-0x6C);
2786 kfree(buf);
2787 return STATUS_SUCCESS;
2789 #endif
2791 static int ms_sp_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2793 int retval = TRANSPORT_ERROR;
2795 if (srb->cmnd[2] == MS_FORMAT) {
2796 retval = ms_format_cmnd(srb, chip);
2798 #ifdef SUPPORT_PCGL_1P18
2799 else if (srb->cmnd[2] == GET_MS_INFORMATION) {
2800 retval = get_ms_information(srb, chip);
2802 #endif
2804 return retval;
2807 #ifdef SUPPORT_CPRM
2808 static int sd_extention_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2810 unsigned int lun = SCSI_LUN(srb);
2811 int result;
2813 rtsx_disable_aspm(chip);
2815 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2816 rtsx_exit_ss(chip);
2817 wait_timeout(100);
2819 rtsx_set_stat(chip, RTSX_STAT_RUN);
2821 sd_cleanup_work(chip);
2823 if (!check_card_ready(chip, lun)) {
2824 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2825 TRACE_RET(chip, TRANSPORT_FAILED);
2827 if ((get_lun_card(chip, lun) != SD_CARD)) {
2828 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2829 TRACE_RET(chip, TRANSPORT_FAILED);
2832 switch (srb->cmnd[0]) {
2833 case SD_PASS_THRU_MODE:
2834 result = sd_pass_thru_mode(srb, chip);
2835 break;
2837 case SD_EXECUTE_NO_DATA:
2838 result = sd_execute_no_data(srb, chip);
2839 break;
2841 case SD_EXECUTE_READ:
2842 result = sd_execute_read_data(srb, chip);
2843 break;
2845 case SD_EXECUTE_WRITE:
2846 result = sd_execute_write_data(srb, chip);
2847 break;
2849 case SD_GET_RSP:
2850 result = sd_get_cmd_rsp(srb, chip);
2851 break;
2853 case SD_HW_RST:
2854 result = sd_hw_rst(srb, chip);
2855 break;
2857 default:
2858 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2859 TRACE_RET(chip, TRANSPORT_FAILED);
2862 return result;
2864 #endif
2866 #ifdef SUPPORT_MAGIC_GATE
2867 static int mg_report_key(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2869 struct ms_info *ms_card = &(chip->ms_card);
2870 unsigned int lun = SCSI_LUN(srb);
2871 int retval;
2872 u8 key_format;
2874 RTSX_DEBUGP("--%s--\n", __func__);
2876 rtsx_disable_aspm(chip);
2878 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2879 rtsx_exit_ss(chip);
2880 wait_timeout(100);
2882 rtsx_set_stat(chip, RTSX_STAT_RUN);
2884 ms_cleanup_work(chip);
2886 if (!check_card_ready(chip, lun)) {
2887 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2888 TRACE_RET(chip, TRANSPORT_FAILED);
2890 if ((get_lun_card(chip, lun) != MS_CARD)) {
2891 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2892 TRACE_RET(chip, TRANSPORT_FAILED);
2895 if (srb->cmnd[7] != KC_MG_R_PRO) {
2896 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2897 TRACE_RET(chip, TRANSPORT_FAILED);
2900 if (!CHK_MSPRO(ms_card)) {
2901 set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
2902 TRACE_RET(chip, TRANSPORT_FAILED);
2905 key_format = srb->cmnd[10] & 0x3F;
2906 RTSX_DEBUGP("key_format = 0x%x\n", key_format);
2908 switch (key_format) {
2909 case KF_GET_LOC_EKB:
2910 if ((scsi_bufflen(srb) == 0x41C) &&
2911 (srb->cmnd[8] == 0x04) &&
2912 (srb->cmnd[9] == 0x1C)) {
2913 retval = mg_get_local_EKB(srb, chip);
2914 if (retval != STATUS_SUCCESS) {
2915 TRACE_RET(chip, TRANSPORT_FAILED);
2917 } else {
2918 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2919 TRACE_RET(chip, TRANSPORT_FAILED);
2921 break;
2923 case KF_RSP_CHG:
2924 if ((scsi_bufflen(srb) == 0x24) &&
2925 (srb->cmnd[8] == 0x00) &&
2926 (srb->cmnd[9] == 0x24)) {
2927 retval = mg_get_rsp_chg(srb, chip);
2928 if (retval != STATUS_SUCCESS) {
2929 TRACE_RET(chip, TRANSPORT_FAILED);
2931 } else {
2932 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2933 TRACE_RET(chip, TRANSPORT_FAILED);
2935 break;
2937 case KF_GET_ICV:
2938 ms_card->mg_entry_num = srb->cmnd[5];
2939 if ((scsi_bufflen(srb) == 0x404) &&
2940 (srb->cmnd[8] == 0x04) &&
2941 (srb->cmnd[9] == 0x04) &&
2942 (srb->cmnd[2] == 0x00) &&
2943 (srb->cmnd[3] == 0x00) &&
2944 (srb->cmnd[4] == 0x00) &&
2945 (srb->cmnd[5] < 32)) {
2946 retval = mg_get_ICV(srb, chip);
2947 if (retval != STATUS_SUCCESS) {
2948 TRACE_RET(chip, TRANSPORT_FAILED);
2950 } else {
2951 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2952 TRACE_RET(chip, TRANSPORT_FAILED);
2954 break;
2956 default:
2957 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2958 TRACE_RET(chip, TRANSPORT_FAILED);
2961 scsi_set_resid(srb, 0);
2962 return TRANSPORT_GOOD;
2965 static int mg_send_key(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2967 struct ms_info *ms_card = &(chip->ms_card);
2968 unsigned int lun = SCSI_LUN(srb);
2969 int retval;
2970 u8 key_format;
2972 RTSX_DEBUGP("--%s--\n", __func__);
2974 rtsx_disable_aspm(chip);
2976 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2977 rtsx_exit_ss(chip);
2978 wait_timeout(100);
2980 rtsx_set_stat(chip, RTSX_STAT_RUN);
2982 ms_cleanup_work(chip);
2984 if (!check_card_ready(chip, lun)) {
2985 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2986 TRACE_RET(chip, TRANSPORT_FAILED);
2988 if (check_card_wp(chip, lun)) {
2989 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
2990 TRACE_RET(chip, TRANSPORT_FAILED);
2992 if ((get_lun_card(chip, lun) != MS_CARD)) {
2993 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2994 TRACE_RET(chip, TRANSPORT_FAILED);
2997 if (srb->cmnd[7] != KC_MG_R_PRO) {
2998 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2999 TRACE_RET(chip, TRANSPORT_FAILED);
3002 if (!CHK_MSPRO(ms_card)) {
3003 set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3004 TRACE_RET(chip, TRANSPORT_FAILED);
3007 key_format = srb->cmnd[10] & 0x3F;
3008 RTSX_DEBUGP("key_format = 0x%x\n", key_format);
3010 switch (key_format) {
3011 case KF_SET_LEAF_ID:
3012 if ((scsi_bufflen(srb) == 0x0C) &&
3013 (srb->cmnd[8] == 0x00) &&
3014 (srb->cmnd[9] == 0x0C)) {
3015 retval = mg_set_leaf_id(srb, chip);
3016 if (retval != STATUS_SUCCESS) {
3017 TRACE_RET(chip, TRANSPORT_FAILED);
3019 } else {
3020 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3021 TRACE_RET(chip, TRANSPORT_FAILED);
3023 break;
3025 case KF_CHG_HOST:
3026 if ((scsi_bufflen(srb) == 0x0C) &&
3027 (srb->cmnd[8] == 0x00) &&
3028 (srb->cmnd[9] == 0x0C)) {
3029 retval = mg_chg(srb, chip);
3030 if (retval != STATUS_SUCCESS) {
3031 TRACE_RET(chip, TRANSPORT_FAILED);
3033 } else {
3034 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3035 TRACE_RET(chip, TRANSPORT_FAILED);
3037 break;
3039 case KF_RSP_HOST:
3040 if ((scsi_bufflen(srb) == 0x0C) &&
3041 (srb->cmnd[8] == 0x00) &&
3042 (srb->cmnd[9] == 0x0C)) {
3043 retval = mg_rsp(srb, chip);
3044 if (retval != STATUS_SUCCESS) {
3045 TRACE_RET(chip, TRANSPORT_FAILED);
3047 } else {
3048 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3049 TRACE_RET(chip, TRANSPORT_FAILED);
3051 break;
3053 case KF_SET_ICV:
3054 ms_card->mg_entry_num = srb->cmnd[5];
3055 if ((scsi_bufflen(srb) == 0x404) &&
3056 (srb->cmnd[8] == 0x04) &&
3057 (srb->cmnd[9] == 0x04) &&
3058 (srb->cmnd[2] == 0x00) &&
3059 (srb->cmnd[3] == 0x00) &&
3060 (srb->cmnd[4] == 0x00) &&
3061 (srb->cmnd[5] < 32)) {
3062 retval = mg_set_ICV(srb, chip);
3063 if (retval != STATUS_SUCCESS) {
3064 TRACE_RET(chip, TRANSPORT_FAILED);
3066 } else {
3067 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3068 TRACE_RET(chip, TRANSPORT_FAILED);
3070 break;
3072 default:
3073 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3074 TRACE_RET(chip, TRANSPORT_FAILED);
3077 scsi_set_resid(srb, 0);
3078 return TRANSPORT_GOOD;
3080 #endif
3082 int rtsx_scsi_handler(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3084 #ifdef SUPPORT_SD_LOCK
3085 struct sd_info *sd_card = &(chip->sd_card);
3086 #endif
3087 struct ms_info *ms_card = &(chip->ms_card);
3088 unsigned int lun = SCSI_LUN(srb);
3089 int result;
3091 #ifdef SUPPORT_SD_LOCK
3092 if (sd_card->sd_erase_status) {
3093 /* Block all SCSI command except for
3094 * REQUEST_SENSE and rs_ppstatus
3096 if (!((srb->cmnd[0] == VENDOR_CMND) &&
3097 (srb->cmnd[1] == SCSI_APP_CMD) &&
3098 (srb->cmnd[2] == GET_DEV_STATUS)) &&
3099 (srb->cmnd[0] != REQUEST_SENSE)) {
3100 /* Logical Unit Not Ready Format in Progress */
3101 set_sense_data(chip, lun, CUR_ERR,
3102 0x02, 0, 0x04, 0x04, 0, 0);
3103 TRACE_RET(chip, TRANSPORT_FAILED);
3106 #endif
3108 if ((get_lun_card(chip, lun) == MS_CARD) &&
3109 (ms_card->format_status == FORMAT_IN_PROGRESS)) {
3110 if ((srb->cmnd[0] != REQUEST_SENSE) && (srb->cmnd[0] != INQUIRY)) {
3111 /* Logical Unit Not Ready Format in Progress */
3112 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04,
3113 0, (u16)(ms_card->progress));
3114 TRACE_RET(chip, TRANSPORT_FAILED);
3118 switch (srb->cmnd[0]) {
3119 case READ_10:
3120 case WRITE_10:
3121 case READ_6:
3122 case WRITE_6:
3123 result = read_write(srb, chip);
3124 #if !defined(LED_AUTO_BLINK) && !defined(REGULAR_BLINK)
3125 led_shine(srb, chip);
3126 #endif
3127 break;
3129 case TEST_UNIT_READY:
3130 result = test_unit_ready(srb, chip);
3131 break;
3133 case INQUIRY:
3134 result = inquiry(srb, chip);
3135 break;
3137 case READ_CAPACITY:
3138 result = read_capacity(srb, chip);
3139 break;
3141 case START_STOP:
3142 result = start_stop_unit(srb, chip);
3143 break;
3145 case ALLOW_MEDIUM_REMOVAL:
3146 result = allow_medium_removal(srb, chip);
3147 break;
3149 case REQUEST_SENSE:
3150 result = request_sense(srb, chip);
3151 break;
3153 case MODE_SENSE:
3154 case MODE_SENSE_10:
3155 result = mode_sense(srb, chip);
3156 break;
3158 case 0x23:
3159 result = read_format_capacity(srb, chip);
3160 break;
3162 case VENDOR_CMND:
3163 result = vendor_cmnd(srb, chip);
3164 break;
3166 case MS_SP_CMND:
3167 result = ms_sp_cmnd(srb, chip);
3168 break;
3170 #ifdef SUPPORT_CPRM
3171 case SD_PASS_THRU_MODE:
3172 case SD_EXECUTE_NO_DATA:
3173 case SD_EXECUTE_READ:
3174 case SD_EXECUTE_WRITE:
3175 case SD_GET_RSP:
3176 case SD_HW_RST:
3177 result = sd_extention_cmnd(srb, chip);
3178 break;
3179 #endif
3181 #ifdef SUPPORT_MAGIC_GATE
3182 case CMD_MSPRO_MG_RKEY:
3183 result = mg_report_key(srb, chip);
3184 break;
3186 case CMD_MSPRO_MG_SKEY:
3187 result = mg_send_key(srb, chip);
3188 break;
3189 #endif
3191 case FORMAT_UNIT:
3192 case MODE_SELECT:
3193 case VERIFY:
3194 result = TRANSPORT_GOOD;
3195 break;
3197 default:
3198 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3199 result = TRANSPORT_FAILED;
3202 return result;