Merge branch 'config' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/bkl
[deliverable/linux.git] / drivers / staging / rts_pstor / rtsx_scsi.c
CommitLineData
77d89b08 1/* Driver for Realtek PCI-Express card reader
2 *
3 * Copyright(c) 2009 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 * wwang (wei_wang@realsil.com.cn)
20 * No. 450, Shenhu Road, Suzhou Industry Park, Suzhou, China
21 */
22
23#include <linux/blkdev.h>
24#include <linux/kthread.h>
25#include <linux/sched.h>
26
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"
36
37void scsi_show_command(struct scsi_cmnd *srb)
38{
39 char *what = NULL;
40 int i, unknown_cmd = 0;
41
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;
135 }
136
137 if (srb->cmnd[0] != TEST_UNIT_READY) {
138 RTSX_DEBUGP("Command %s (%d bytes)\n", what, srb->cmd_len);
139 }
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");
145 }
146}
147
148void set_sense_type(struct rtsx_chip *chip, unsigned int lun, int sense_type)
149{
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;
154
155 case SENSE_TYPE_MEDIA_NOT_PRESENT:
156 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x3A, 0, 0, 0);
157 break;
158
159 case SENSE_TYPE_MEDIA_LBA_OVER_RANGE:
160 set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x21, 0, 0, 0);
161 break;
162
163 case SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT:
164 set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x25, 0, 0, 0);
165 break;
166
167 case SENSE_TYPE_MEDIA_WRITE_PROTECT:
168 set_sense_data(chip, lun, CUR_ERR, 0x07, 0, 0x27, 0, 0, 0);
169 break;
170
171 case SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR:
172 set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x11, 0, 0, 0);
173 break;
174
175 case SENSE_TYPE_MEDIA_WRITE_ERR:
176 set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x0C, 0x02, 0, 0);
177 break;
178
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;
183
184 case SENSE_TYPE_FORMAT_IN_PROGRESS:
185 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04, 0, 0);
186 break;
187
188 case SENSE_TYPE_FORMAT_CMD_FAILED:
189 set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x31, 0x01, 0, 0);
190 break;
191
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;
196
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;
200
201 case SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM:
202 set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x30, 0x00, 0, 0);
203 break;
204
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
209
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
215
216 case SENSE_TYPE_NO_SENSE:
217 default:
218 set_sense_data(chip, lun, CUR_ERR, 0, 0, 0, 0, 0, 0);
219 break;
220 }
221}
222
223void 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)
225{
226 struct sense_data_t *sense = &(chip->sense_buffer[lun]);
227
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;
234
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;
242 }
243}
244
245static int test_unit_ready(struct scsi_cmnd *srb, struct rtsx_chip *chip)
246{
247 unsigned int lun = SCSI_LUN(srb);
248
249 if (!check_card_ready(chip, lun)) {
250 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
251 return TRANSPORT_FAILED;
252 }
253
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;
258 }
259
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;
270 }
271 }
272#endif
273
274 return TRANSPORT_GOOD;
275}
276
6680d2ca 277static unsigned char formatter_inquiry_str[20] = {
77d89b08 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
284
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] */
293};
294
295static int inquiry(struct scsi_cmnd *srb, struct rtsx_chip *chip)
296{
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,
314 0,
315 REL_ADR|WBUS_32|WBUS_16|SYNC|LINKED|CMD_QUE|SFT_RE,
316 };
317
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;
323 }
324 } else if (CHECK_LUN_MODE(chip, SD_MS_1LUN)) {
325 inquiry_string = inquiry_sdms;
326 } else {
327 inquiry_string = inquiry_default;
328 }
329
330 buf = vmalloc(scsi_bufflen(srb));
331 if (buf == NULL) {
332 TRACE_RET(chip, TRANSPORT_ERROR);
333 }
334
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
341 {
342 if (!card || (card == MS_CARD)) {
343 pro_formatter_flag = 1;
344 }
345 }
346
347 if (pro_formatter_flag) {
348 if (scsi_bufflen(srb) < 56) {
349 sendbytes = (unsigned char)(scsi_bufflen(srb));
350 } else {
351 sendbytes = 56;
352 }
353 } else {
354 if (scsi_bufflen(srb) < 36) {
355 sendbytes = (unsigned char)(scsi_bufflen(srb));
356 } else {
357 sendbytes = 36;
358 }
359 }
360
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;
367 }
368 } else {
369 memcpy(buf, inquiry_buf, sendbytes);
370 }
371
372 if (pro_formatter_flag) {
373 if (sendbytes > 36) {
374 memcpy(buf + 36, formatter_inquiry_str, sendbytes - 36);
375 }
376 }
377
378 scsi_set_resid(srb, 0);
379
380 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
381 vfree(buf);
382
383 return TRANSPORT_GOOD;
384}
385
386
387static int start_stop_unit(struct scsi_cmnd *srb, struct rtsx_chip *chip)
388{
389 unsigned int lun = SCSI_LUN(srb);
390
391 scsi_set_resid(srb, scsi_bufflen(srb));
392
393 if (srb->cmnd[1] == 1)
394 return TRANSPORT_GOOD;
395
396 switch (srb->cmnd[0x4]) {
397 case STOP_MEDIUM:
398 /* Media disabled */
399 return TRANSPORT_GOOD;
400
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;
406
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);
414 }
415
416 break;
417 }
418
419 TRACE_RET(chip, TRANSPORT_ERROR);
420}
421
422
423static int allow_medium_removal(struct scsi_cmnd *srb, struct rtsx_chip *chip)
424{
425 int prevent;
426
427 prevent = srb->cmnd[4] & 0x1;
428
429 scsi_set_resid(srb, 0);
430
431 if (prevent) {
432 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
433 TRACE_RET(chip, TRANSPORT_FAILED);
434 }
435
436 return TRANSPORT_GOOD;
437}
438
439
440static int request_sense(struct scsi_cmnd *srb, struct rtsx_chip *chip)
441{
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;
446
447 sense = &(chip->sense_buffer[lun]);
448
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;
463 }
464
465 rtsx_set_stat(chip, RTSX_STAT_RUN);
466 }
467
468 buf = vmalloc(scsi_bufflen(srb));
469 if (buf == NULL) {
470 TRACE_RET(chip, TRANSPORT_ERROR);
471 }
472
473 tmp = (unsigned char *)sense;
474 memcpy(buf, tmp, scsi_bufflen(srb));
475
476 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
477 vfree(buf);
478
479 scsi_set_resid(srb, 0);
480 /* Reset Sense Data */
481 set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
482 return TRANSPORT_GOOD;
483}
484
485static void ms_mode_sense(struct rtsx_chip *chip, u8 cmd,
486 int lun, u8 *buf, int buf_len)
487{
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;
493
494 if (cmd == MODE_SENSE) {
495 sys_info_offset = 8;
496 if (data_size > 0x68) {
497 data_size = 0x68;
498 }
499 buf[i++] = 0x67; /* Mode Data Length */
500 } else {
501 sys_info_offset = 12;
502 if (data_size > 0x6C) {
503 data_size = 0x6C;
504 }
505 buf[i++] = 0x00; /* Mode Data Length (MSB) */
506 buf[i++] = 0x6A; /* Mode Data Length (LSB) */
507 }
508
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;
519 }
520
521 /* WP */
522 if (check_card_wp(chip, lun)) {
523 buf[i++] = 0x80;
524 } else {
525 buf[i++] = 0x00;
526 }
527 } else {
528 buf[i++] = 0x00; /* MediaType */
529 buf[i++] = 0x00; /* WP */
530 }
531
532 buf[i++] = 0x00; /* Reserved */
533
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) */
538
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;
551 }
552 }
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;
566 }
567 }
568 }
569
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;
574
575 memcpy(buf + sys_info_offset, ms_card->raw_sys_info, len);
576 }
577}
578
579static int mode_sense(struct scsi_cmnd *srb, struct rtsx_chip *chip)
580{
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);
587
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);
593 }
594#endif
595
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;
604 }
605 }
606 }
607#else
608 if (card == MS_CARD) {
609 if (chip->mspro_formatter_enable) {
610 pro_formatter_flag = 1;
611 dataSize = 108;
612 }
613 }
614#endif
615
616 buf = kmalloc(dataSize, GFP_KERNEL);
617 if (buf == NULL) {
618 TRACE_RET(chip, TRANSPORT_ERROR);
619 }
620
621 pageCode = srb->cmnd[2] & 0x3f;
622
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;
638 }
639 buf[3] = 0x00;
640 }
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;
654 }
655 buf[4] = 0x00;
656 buf[5] = 0x00;
657 buf[6] = 0x00;
658 buf[7] = 0x00;
659 }
660 }
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;
666 }
667
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);
672 }
673 kfree(buf);
674
675 return status;
676}
677
678static int read_write(struct scsi_cmnd *srb, struct rtsx_chip *chip)
679{
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;
687
688 rtsx_disable_aspm(chip);
689
690 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
691 rtsx_exit_ss(chip);
692 wait_timeout(100);
693 }
694 rtsx_set_stat(chip, RTSX_STAT_RUN);
695
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);
699 }
700
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;
705 }
706
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
711 */
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);
715 }
716
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);
722 }
723 }
724#endif
725
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);
742 }
743
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
747 */
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);
752 }
753
754 if (sec_cnt == 0) {
755 scsi_set_resid(srb, 0);
756 return TRANSPORT_GOOD;
757 }
758
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);
765 }
766 TRACE_RET(chip, TRANSPORT_FAILED);
767 }
768
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);
774 }
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);
780 }
781 }
782 }
783
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);
795 }
796 }
797 retval = TRANSPORT_FAILED;
798 TRACE_GOTO(chip, Exit);
799 } else {
800 chip->rw_fail_cnt[lun] = 0;
801 retval = TRANSPORT_GOOD;
802 }
803
804 scsi_set_resid(srb, 0);
805
806Exit:
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);
812 }
813 }
814 }
815
816 return retval;
817}
818
819static int read_format_capacity(struct scsi_cmnd *srb, struct rtsx_chip *chip)
820{
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;
828
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);
833 }
834 }
835
836 buf_len = (scsi_bufflen(srb) > 12) ? 0x14 : 12;
837
838 buf = kmalloc(buf_len, GFP_KERNEL);
839 if (buf == NULL) {
840 TRACE_RET(chip, TRANSPORT_ERROR);
841 }
842
843 buf[i++] = 0;
844 buf[i++] = 0;
845 buf[i++] = 0;
846
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;
856 }
857
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;
865
866 if (desc_cnt == 2) {
867 buf[i++] = 2;
868 } else {
869 buf[i++] = 0;
870 }
871 } else {
872 buf[i++] = 0xFF;
873 buf[i++] = 0xFF;
874 buf[i++] = 0xFF;
875 buf[i++] = 0xFF;
876
877 if (desc_cnt == 2) {
878 buf[i++] = 3;
879 } else {
880 buf[i++] = 0;
881 }
882 }
883
884 buf[i++] = 0x00;
885 buf[i++] = 0x02;
886 buf[i++] = 0x00;
887
888 desc_cnt--;
889 }
890
891 buf_len = min(scsi_bufflen(srb), buf_len);
892 rtsx_stor_set_xfer_buf(buf, buf_len, srb);
893 kfree(buf);
894
895 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
896
897 return TRANSPORT_GOOD;
898}
899
900static int read_capacity(struct scsi_cmnd *srb, struct rtsx_chip *chip)
901{
902 unsigned char *buf;
903 unsigned int lun = SCSI_LUN(srb);
904 u32 card_size;
905
906 if (!check_card_ready(chip, lun)) {
907 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
908 TRACE_RET(chip, TRANSPORT_FAILED);
909 }
910
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;
915 }
916
917 buf = kmalloc(8, GFP_KERNEL);
918 if (buf == NULL) {
919 TRACE_RET(chip, TRANSPORT_ERROR);
920 }
921
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);
927
928 buf[4] = 0x00;
929 buf[5] = 0x00;
930 buf[6] = 0x02;
931 buf[7] = 0x00;
932
933 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
934 kfree(buf);
935
936 scsi_set_resid(srb, 0);
937
938 return TRANSPORT_GOOD;
939}
940
941static int read_eeprom(struct scsi_cmnd *srb, struct rtsx_chip *chip)
942{
943 unsigned short len, i;
944 int retval;
945 u8 *buf;
946
947 rtsx_disable_aspm(chip);
948
949 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
950 rtsx_exit_ss(chip);
951 wait_timeout(100);
952 }
953 rtsx_set_stat(chip, RTSX_STAT_RUN);
954
955 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
956
957 buf = (u8 *)vmalloc(len);
958 if (!buf) {
959 TRACE_RET(chip, TRANSPORT_ERROR);
960 }
961
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);
967 }
968
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);
975 }
976 }
977
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);
981
982 vfree(buf);
983
984 return TRANSPORT_GOOD;
985}
986
987static int write_eeprom(struct scsi_cmnd *srb, struct rtsx_chip *chip)
988{
989 unsigned short len, i;
990 int retval;
991 u8 *buf;
992
993 rtsx_disable_aspm(chip);
994
995 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
996 rtsx_exit_ss(chip);
997 wait_timeout(100);
998 }
999 rtsx_set_stat(chip, RTSX_STAT_RUN);
1000
1001 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1002
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);
1007 }
1008
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);
1014 }
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);
1020 }
1021
1022 rtsx_stor_get_xfer_buf(buf, len, srb);
1023 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1024
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);
1031 }
1032 }
1033
1034 vfree(buf);
1035 }
1036
1037 return TRANSPORT_GOOD;
1038}
1039
1040static int read_mem(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1041{
1042 unsigned short addr, len, i;
1043 int retval;
1044 u8 *buf;
1045
1046 rtsx_disable_aspm(chip);
1047
1048 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1049 rtsx_exit_ss(chip);
1050 wait_timeout(100);
1051 }
1052 rtsx_set_stat(chip, RTSX_STAT_RUN);
1053
1054 addr = ((u16)srb->cmnd[2] << 8) | srb->cmnd[3];
1055 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1056
1057 if (addr < 0xFC00) {
1058 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1059 TRACE_RET(chip, TRANSPORT_FAILED);
1060 }
1061
1062 buf = (u8 *)vmalloc(len);
1063 if (!buf) {
1064 TRACE_RET(chip, TRANSPORT_ERROR);
1065 }
1066
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);
1072 }
1073
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);
1080 }
1081 }
1082
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);
1086
1087 vfree(buf);
1088
1089 return TRANSPORT_GOOD;
1090}
1091
1092static int write_mem(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1093{
1094 unsigned short addr, len, i;
1095 int retval;
1096 u8 *buf;
1097
1098 rtsx_disable_aspm(chip);
1099
1100 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1101 rtsx_exit_ss(chip);
1102 wait_timeout(100);
1103 }
1104 rtsx_set_stat(chip, RTSX_STAT_RUN);
1105
1106 addr = ((u16)srb->cmnd[2] << 8) | srb->cmnd[3];
1107 len = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1108
1109 if (addr < 0xFC00) {
1110 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1111 TRACE_RET(chip, TRANSPORT_FAILED);
1112 }
1113
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);
1118 }
1119
1120 rtsx_stor_get_xfer_buf(buf, len, srb);
1121 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1122
1123 retval = rtsx_force_power_on(chip, SSC_PDCTL);
1124 if (retval != STATUS_SUCCESS) {
1125 vfree(buf);
1126 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_WRITE_ERR);
1127 TRACE_RET(chip, TRANSPORT_FAILED);
1128 }
1129
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);
1136 }
1137 }
1138
1139 vfree(buf);
1140
1141 return TRANSPORT_GOOD;
1142}
1143
1144static int get_sd_csd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1145{
1146 struct sd_info *sd_card = &(chip->sd_card);
1147 unsigned int lun = SCSI_LUN(srb);
1148
1149 if (!check_card_ready(chip, lun)) {
1150 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1151 TRACE_RET(chip, TRANSPORT_FAILED);
1152 }
1153
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);
1157 }
1158
1159 scsi_set_resid(srb, 0);
1160 rtsx_stor_set_xfer_buf(sd_card->raw_csd, scsi_bufflen(srb), srb);
1161
1162 return TRANSPORT_GOOD;
1163}
1164
1165static int toggle_gpio_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1166{
1167 u8 gpio = srb->cmnd[2];
1168
1169 rtsx_disable_aspm(chip);
1170
1171 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1172 rtsx_exit_ss(chip);
1173 wait_timeout(100);
1174 }
1175 rtsx_set_stat(chip, RTSX_STAT_RUN);
1176
1177 if (gpio > 3)
1178 gpio = 1;
1179 toggle_gpio(chip, gpio);
1180
1181 return TRANSPORT_GOOD;
1182}
1183
1184#ifdef _MSG_TRACE
1185static int trace_msg_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1186{
1187 unsigned char *ptr, *buf = NULL;
1188 int i, msg_cnt;
1189 u8 clear;
1190 unsigned int buf_len;
1191
1192 buf_len = 4 + ((2 + MSG_FUNC_LEN + MSG_FILE_LEN + TIME_VAL_LEN) * TRACE_ITEM_CNT);
1193
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);
1197 }
1198
1199 clear = srb->cmnd[2];
1200
1201 buf = (unsigned char *)vmalloc(scsi_bufflen(srb));
1202 if (buf == NULL) {
1203 TRACE_RET(chip, TRANSPORT_ERROR);
1204 }
1205 ptr = buf;
1206
1207 if (chip->trace_msg[chip->msg_idx].valid) {
1208 msg_cnt = TRACE_ITEM_CNT;
1209 } else {
1210 msg_cnt = chip->msg_idx;
1211 }
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);
1217
1218 for (i = 1; i <= msg_cnt; i++) {
1219 int j, idx;
1220
1221 idx = chip->msg_idx - i;
1222 if (idx < 0)
1223 idx += TRACE_ITEM_CNT;
1224
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];
1229 }
1230 for (j = 0; j < MSG_FILE_LEN; j++) {
1231 *(ptr++) = chip->trace_msg[idx].file[j];
1232 }
1233 for (j = 0; j < TIME_VAL_LEN; j++) {
1234 *(ptr++) = chip->trace_msg[idx].timeval_buf[j];
1235 }
1236 }
1237
1238 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
1239 vfree(buf);
1240
1241 if (clear) {
1242 chip->msg_idx = 0;
1243 for (i = 0; i < TRACE_ITEM_CNT; i++)
1244 chip->trace_msg[i].valid = 0;
1245 }
1246
1247 scsi_set_resid(srb, 0);
1248 return TRANSPORT_GOOD;
1249}
1250#endif
1251
1252static int read_host_reg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1253{
1254 u8 addr, buf[4];
1255 u32 val;
1256 unsigned int len;
1257
1258 rtsx_disable_aspm(chip);
1259
1260 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1261 rtsx_exit_ss(chip);
1262 wait_timeout(100);
1263 }
1264 rtsx_set_stat(chip, RTSX_STAT_RUN);
1265
1266 addr = srb->cmnd[4];
1267
1268 val = rtsx_readl(chip, addr);
1269 RTSX_DEBUGP("Host register (0x%x): 0x%x\n", addr, val);
1270
1271 buf[0] = (u8)(val >> 24);
1272 buf[1] = (u8)(val >> 16);
1273 buf[2] = (u8)(val >> 8);
1274 buf[3] = (u8)val;
1275
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);
1279
1280 return TRANSPORT_GOOD;
1281}
1282
1283static int write_host_reg(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1284{
1285 u8 addr, buf[4];
1286 u32 val;
1287 unsigned int len;
1288
1289 rtsx_disable_aspm(chip);
1290
1291 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1292 rtsx_exit_ss(chip);
1293 wait_timeout(100);
1294 }
1295 rtsx_set_stat(chip, RTSX_STAT_RUN);
1296
1297 addr = srb->cmnd[4];
1298
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);
1302
1303 val = ((u32)buf[0] << 24) | ((u32)buf[1] << 16) | ((u32)buf[2] << 8) | buf[3];
1304
1305 rtsx_writel(chip, addr, val);
1306
1307 return TRANSPORT_GOOD;
1308}
1309
1310static int set_variable(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1311{
1312 unsigned lun = SCSI_LUN(srb);
1313
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);
1319
1320 switch (srb->cmnd[4]) {
1321 case XD_CARD:
1322 xd_card->xd_clock = srb->cmnd[5];
1323 break;
1324
1325 case SD_CARD:
1326 sd_card->sd_clock = srb->cmnd[5];
1327 break;
1328
1329 case MS_CARD:
1330 ms_card->ms_clock = srb->cmnd[5];
1331 break;
1332
1333 default:
1334 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1335 TRACE_RET(chip, TRANSPORT_FAILED);
1336 }
1337 } else if (srb->cmnd[3] == 2) {
1338 if (srb->cmnd[4]) {
1339 chip->blink_led = 1;
1340 } else {
1341 int retval;
1342
1343 chip->blink_led = 0;
1344
1345 rtsx_disable_aspm(chip);
1346
1347 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1348 rtsx_exit_ss(chip);
1349 wait_timeout(100);
1350 }
1351 rtsx_set_stat(chip, RTSX_STAT_RUN);
1352
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);
1357 }
1358
1359 turn_off_led(chip, LED_GPIO);
1360 }
1361 } else {
1362 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1363 TRACE_RET(chip, TRANSPORT_FAILED);
1364 }
1365
1366 return TRANSPORT_GOOD;
1367}
1368
1369static int get_variable(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1370{
1371 unsigned int lun = SCSI_LUN(srb);
1372
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;
1378
1379 switch (srb->cmnd[4]) {
1380 case XD_CARD:
1381 tmp = (u8)(xd_card->xd_clock);
1382 break;
1383
1384 case SD_CARD:
1385 tmp = (u8)(sd_card->sd_clock);
1386 break;
1387
1388 case MS_CARD:
1389 tmp = (u8)(ms_card->ms_clock);
1390 break;
1391
1392 default:
1393 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1394 TRACE_RET(chip, TRANSPORT_FAILED);
1395 }
1396
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);
1404 }
1405
1406 return TRANSPORT_GOOD;
1407}
1408
1409static int dma_access_ring_buffer(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1410{
1411 int retval;
1412 unsigned int lun = SCSI_LUN(srb);
1413 u16 len;
1414
1415 rtsx_disable_aspm(chip);
1416
1417 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1418 rtsx_exit_ss(chip);
1419 wait_timeout(100);
1420 }
1421 rtsx_set_stat(chip, RTSX_STAT_RUN);
1422
1423 len = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
1424 len = min(len, (u16)scsi_bufflen(srb));
1425
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");
1430 }
1431
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);
1439 }
1440 TRACE_RET(chip, TRANSPORT_FAILED);
1441 }
1442 scsi_set_resid(srb, 0);
1443
1444 return TRANSPORT_GOOD;
1445}
1446
1447static int get_dev_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1448{
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
1458
1459 memset(status, 0, 32);
1460
1461 status[0] = (u8)(chip->product_id);
1462 status[1] = chip->ic_version;
1463
1464 if (chip->auto_delink_en) {
1465 status[2] = 0x10;
1466 } else {
1467 status[2] = 0x00;
1468 }
1469
1470 status[3] = 20;
1471 status[4] = 10;
1472 status[5] = 05;
1473 status[6] = 21;
1474
1475 if (chip->card_wp) {
1476 status[7] = 0x20;
1477 } else {
1478 status[7] = 0x00;
1479 }
1480
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;
1489 }
1490
1491 if (chip->ocp_stat & oc_now_mask) {
1492 status[8] |= 0x02;
1493 }
1494 if (chip->ocp_stat & oc_ever_mask) {
1495 status[8] |= 0x01;
1496 }
1497#endif
1498
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;
1506 }
1507 } else {
1508 status[0x0E] = 0x00;
1509 }
1510
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;
1521 }
1522 } else {
1523 if (CHK_MMC_SECTOR_MODE(sd_card)) {
1524 status[0x0E] = 0x01;
1525 } else {
1526 status[0x0E] = 0x00;
1527 }
1528
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;
1537 }
1538 }
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;
1545 }
1546
1547 if (CHK_HG8BIT(ms_card)) {
1548 status[0x0F] = 0x01;
1549 } else {
1550 status[0x0F] = 0x00;
1551 }
1552 }
1553 }
1554
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;
1563 }
1564 if (sd_card->sd_lock_status & SD_PWD_EXIST)
1565 status[0x17] |= 0x04;
1566 } else {
1567 status[0x17] = 0x00;
1568 }
1569
1570 RTSX_DEBUGP("status[0x17] = 0x%x\n", status[0x17]);
1571#endif
1572
1573 status[0x18] = 0x8A;
1574 status[0x1A] = 0x28;
1575#ifdef SUPPORT_SD_LOCK
1576 status[0x1F] = 0x01;
1577#endif
1578
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);
1582
1583 return TRANSPORT_GOOD;
1584}
1585
1586static int set_chip_mode(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1587{
1588 int phy_debug_mode;
1589 int retval;
1590 u16 reg;
1591
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);
1595 }
1596
1597 phy_debug_mode = (int)(srb->cmnd[3]);
1598
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);
1604 }
1605 rtsx_disable_bus_int(chip);
1606
1607 retval = rtsx_read_phy_register(chip, 0x1C, &reg);
1608 if (retval != STATUS_SUCCESS) {
1609 TRACE_RET(chip, TRANSPORT_FAILED);
1610 }
1611 reg |= 0x0001;
1612 retval = rtsx_write_phy_register(chip, 0x1C, reg);
1613 if (retval != STATUS_SUCCESS) {
1614 TRACE_RET(chip, TRANSPORT_FAILED);
1615 }
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);
1621 }
1622 rtsx_enable_bus_int(chip);
1623
1624 retval = rtsx_read_phy_register(chip, 0x1C, &reg);
1625 if (retval != STATUS_SUCCESS) {
1626 TRACE_RET(chip, TRANSPORT_FAILED);
1627 }
1628 reg &= 0xFFFE;
1629 retval = rtsx_write_phy_register(chip, 0x1C, reg);
1630 if (retval != STATUS_SUCCESS) {
1631 TRACE_RET(chip, TRANSPORT_FAILED);
1632 }
1633 }
1634
1635 return TRANSPORT_GOOD;
1636}
1637
1638static int rw_mem_cmd_buf(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1639{
1640 int retval = STATUS_SUCCESS;
1641 unsigned int lun = SCSI_LUN(srb);
1642 u8 cmd_type, mask, value, idx;
1643 u16 addr;
1644
1645 rtsx_disable_aspm(chip);
1646
1647 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1648 rtsx_exit_ss(chip);
1649 wait_timeout(100);
1650 }
1651 rtsx_set_stat(chip, RTSX_STAT_RUN);
1652
1653 switch (srb->cmnd[3]) {
1654 case INIT_BATCHCMD:
1655 rtsx_init_cmd(chip);
1656 break;
1657
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);
1663 }
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;
1669
1670 case SEND_BATCHCMD:
1671 retval = rtsx_send_cmd(chip, 0, 1000);
1672 break;
1673
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);
1680 }
1681 rtsx_stor_set_xfer_buf(&value, 1, srb);
1682 scsi_set_resid(srb, 0);
1683 break;
1684
1685 default:
1686 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1687 TRACE_RET(chip, TRANSPORT_FAILED);
1688 }
1689
1690 if (retval != STATUS_SUCCESS) {
1691 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
1692 TRACE_RET(chip, TRANSPORT_FAILED);
1693 }
1694
1695 return TRANSPORT_GOOD;
1696}
1697
1698static int suit_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1699{
1700 int result;
1701
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;
1711 }
1712
1713 return result;
1714}
1715
1716static int read_phy_register(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1717{
1718 unsigned short addr, len, i;
1719 int retval;
1720 u8 *buf;
1721 u16 val;
1722
1723 rtsx_disable_aspm(chip);
1724
1725 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1726 rtsx_exit_ss(chip);
1727 wait_timeout(100);
1728 }
1729 rtsx_set_stat(chip, RTSX_STAT_RUN);
1730
1731 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1732 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1733
1734 if (len % 2)
1735 len -= len % 2;
1736
1737 if (len) {
1738 buf = (u8 *)vmalloc(len);
1739 if (!buf) {
1740 TRACE_RET(chip, TRANSPORT_ERROR);
1741 }
1742
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);
1748 }
1749
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);
1756 }
1757
1758 buf[2*i] = (u8)(val >> 8);
1759 buf[2*i+1] = (u8)val;
1760 }
1761
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);
1765
1766 vfree(buf);
1767 }
1768
1769 return TRANSPORT_GOOD;
1770}
1771
1772static int write_phy_register(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1773{
1774 unsigned short addr, len, i;
1775 int retval;
1776 u8 *buf;
1777 u16 val;
1778
1779 rtsx_disable_aspm(chip);
1780
1781 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1782 rtsx_exit_ss(chip);
1783 wait_timeout(100);
1784 }
1785 rtsx_set_stat(chip, RTSX_STAT_RUN);
1786
1787 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1788 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1789
1790 if (len % 2)
1791 len -= len % 2;
1792
1793 if (len) {
1794 len = (unsigned short)min(scsi_bufflen(srb), (unsigned int)len);
1795
1796 buf = (u8 *)vmalloc(len);
1797 if (buf == NULL) {
1798 TRACE_RET(chip, TRANSPORT_ERROR);
1799 }
1800
1801 rtsx_stor_get_xfer_buf(buf, len, srb);
1802 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1803
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);
1809 }
1810
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);
1818 }
1819 }
1820
1821 vfree(buf);
1822 }
1823
1824 return TRANSPORT_GOOD;
1825}
1826
1827static int erase_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1828{
1829 unsigned short addr;
1830 int retval;
1831 u8 mode;
1832
1833 rtsx_disable_aspm(chip);
1834
1835 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1836 rtsx_exit_ss(chip);
1837 wait_timeout(100);
1838 }
1839 rtsx_set_stat(chip, RTSX_STAT_RUN);
1840
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);
1845 }
1846
1847 mode = srb->cmnd[3];
1848 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1849
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);
1855 }
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);
1861 }
1862 } else {
1863 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1864 TRACE_RET(chip, TRANSPORT_FAILED);
1865 }
1866
1867 return TRANSPORT_GOOD;
1868}
1869
1870static int read_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1871{
1872 unsigned short addr, len, i;
1873 int retval;
1874 u8 *buf;
1875
1876 rtsx_disable_aspm(chip);
1877
1878 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1879 rtsx_exit_ss(chip);
1880 wait_timeout(100);
1881 }
1882 rtsx_set_stat(chip, RTSX_STAT_RUN);
1883
1884 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1885 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1886
1887 buf = (u8 *)vmalloc(len);
1888 if (!buf) {
1889 TRACE_RET(chip, TRANSPORT_ERROR);
1890 }
1891
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);
1897 }
1898
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);
1905 }
1906 }
1907
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);
1911
1912 vfree(buf);
1913
1914 return TRANSPORT_GOOD;
1915}
1916
1917static int write_eeprom2(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1918{
1919 unsigned short addr, len, i;
1920 int retval;
1921 u8 *buf;
1922
1923 rtsx_disable_aspm(chip);
1924
1925 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1926 rtsx_exit_ss(chip);
1927 wait_timeout(100);
1928 }
1929 rtsx_set_stat(chip, RTSX_STAT_RUN);
1930
1931 addr = ((u16)srb->cmnd[4] << 8) | srb->cmnd[5];
1932 len = ((u16)srb->cmnd[6] << 8) | srb->cmnd[7];
1933
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);
1938 }
1939
1940 rtsx_stor_get_xfer_buf(buf, len, srb);
1941 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1942
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);
1948 }
1949
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);
1956 }
1957 }
1958
1959 vfree(buf);
1960
1961 return TRANSPORT_GOOD;
1962}
1963
1964static int read_efuse(struct scsi_cmnd *srb, struct rtsx_chip *chip)
1965{
1966 int retval;
1967 u8 addr, len, i;
1968 u8 *buf;
1969
1970 rtsx_disable_aspm(chip);
1971
1972 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
1973 rtsx_exit_ss(chip);
1974 wait_timeout(100);
1975 }
1976 rtsx_set_stat(chip, RTSX_STAT_RUN);
1977
1978 addr = srb->cmnd[4];
1979 len = srb->cmnd[5];
1980
1981 buf = (u8 *)vmalloc(len);
1982 if (!buf) {
1983 TRACE_RET(chip, TRANSPORT_ERROR);
1984 }
1985
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);
1991 }
1992
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);
1999 }
2000 }
2001
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);
2005
2006 vfree(buf);
2007
2008 return TRANSPORT_GOOD;
2009}
2010
2011static int write_efuse(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2012{
2013 int retval, result = TRANSPORT_GOOD;
2014 u16 val;
2015 u8 addr, len, i;
2016 u8 *buf;
2017
2018 rtsx_disable_aspm(chip);
2019
2020 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2021 rtsx_exit_ss(chip);
2022 wait_timeout(100);
2023 }
2024 rtsx_set_stat(chip, RTSX_STAT_RUN);
2025
2026 addr = srb->cmnd[4];
2027 len = srb->cmnd[5];
2028
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);
2033 }
2034
2035 rtsx_stor_get_xfer_buf(buf, len, srb);
2036 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2037
2038 retval = rtsx_force_power_on(chip, SSC_PDCTL);
2039 if (retval != STATUS_SUCCESS) {
2040 vfree(buf);
2041 TRACE_RET(chip, TRANSPORT_ERROR);
2042 }
2043
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);
2049 }
2050
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);
2055 }
2056
2057 wait_timeout(600);
2058
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);
2063 }
2064
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);
2069 }
2070
2071 wait_timeout(600);
2072 }
2073
2074 retval = card_power_on(chip, SPI_CARD);
2075 if (retval != STATUS_SUCCESS) {
2076 vfree(buf);
2077 TRACE_RET(chip, TRANSPORT_ERROR);
2078 }
2079
2080 wait_timeout(50);
2081
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);
2088 }
2089 }
2090
2091Exit:
2092 vfree(buf);
2093
2094 retval = card_power_off(chip, SPI_CARD);
2095 if (retval != STATUS_SUCCESS) {
2096 TRACE_RET(chip, TRANSPORT_ERROR);
2097 }
2098
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);
2103 }
2104
2105 wait_timeout(600);
2106
2107 retval = rtsx_write_phy_register(chip, 0x08, val);
2108 if (retval != STATUS_SUCCESS) {
2109 TRACE_RET(chip, TRANSPORT_ERROR);
2110 }
2111
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);
2115 }
2116 }
2117
2118 return result;
2119}
2120
2121static int read_cfg_byte(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2122{
2123 int retval;
2124 u8 func, func_max;
2125 u16 addr, len;
2126 u8 *buf;
2127
2128 rtsx_disable_aspm(chip);
2129
2130 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2131 rtsx_exit_ss(chip);
2132 wait_timeout(100);
2133 }
2134 rtsx_set_stat(chip, RTSX_STAT_RUN);
2135
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];
2139
2140 RTSX_DEBUGP("%s: func = %d, addr = 0x%x, len = %d\n", __func__, func, addr, len);
2141
2142 if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip)) {
2143 func_max = 1;
2144 } else {
2145 func_max = 0;
2146 }
2147
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);
2151 }
2152
2153 buf = (u8 *)vmalloc(len);
2154 if (!buf) {
2155 TRACE_RET(chip, TRANSPORT_ERROR);
2156 }
2157
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);
2163 }
2164
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);
2168
2169 vfree(buf);
2170
2171 return TRANSPORT_GOOD;
2172}
2173
2174static int write_cfg_byte(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2175{
2176 int retval;
2177 u8 func, func_max;
2178 u16 addr, len;
2179 u8 *buf;
2180
2181 rtsx_disable_aspm(chip);
2182
2183 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2184 rtsx_exit_ss(chip);
2185 wait_timeout(100);
2186 }
2187 rtsx_set_stat(chip, RTSX_STAT_RUN);
2188
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];
2192
2193 RTSX_DEBUGP("%s: func = %d, addr = 0x%x\n", __func__, func, addr);
2194
2195 if (CHK_SDIO_EXIST(chip) && !CHK_SDIO_IGNORED(chip)) {
2196 func_max = 1;
2197 } else {
2198 func_max = 0;
2199 }
2200
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);
2204 }
2205
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);
2210 }
2211
2212 rtsx_stor_get_xfer_buf(buf, len, srb);
2213 scsi_set_resid(srb, scsi_bufflen(srb) - len);
2214
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);
2220 }
2221
2222 vfree(buf);
2223
2224 return TRANSPORT_GOOD;
2225}
2226
2227static int app_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2228{
2229 int result;
2230
2231 switch (srb->cmnd[2]) {
2232 case PP_READ10:
2233 case PP_WRITE10:
2234 result = read_write(srb, chip);
2235 break;
2236
2237 case READ_HOST_REG:
2238 result = read_host_reg(srb, chip);
2239 break;
2240
2241 case WRITE_HOST_REG:
2242 result = write_host_reg(srb, chip);
2243 break;
2244
2245 case GET_VAR:
2246 result = get_variable(srb, chip);
2247 break;
2248
2249 case SET_VAR:
2250 result = set_variable(srb, chip);
2251 break;
2252
2253 case DMA_READ:
2254 case DMA_WRITE:
2255 result = dma_access_ring_buffer(srb, chip);
2256 break;
2257
2258 case READ_PHY:
2259 result = read_phy_register(srb, chip);
2260 break;
2261
2262 case WRITE_PHY:
2263 result = write_phy_register(srb, chip);
2264 break;
2265
2266 case ERASE_EEPROM2:
2267 result = erase_eeprom2(srb, chip);
2268 break;
2269
2270 case READ_EEPROM2:
2271 result = read_eeprom2(srb, chip);
2272 break;
2273
2274 case WRITE_EEPROM2:
2275 result = write_eeprom2(srb, chip);
2276 break;
2277
2278 case READ_EFUSE:
2279 result = read_efuse(srb, chip);
2280 break;
2281
2282 case WRITE_EFUSE:
2283 result = write_efuse(srb, chip);
2284 break;
2285
2286 case READ_CFG:
2287 result = read_cfg_byte(srb, chip);
2288 break;
2289
2290 case WRITE_CFG:
2291 result = write_cfg_byte(srb, chip);
2292 break;
2293
2294 case SET_CHIP_MODE:
2295 result = set_chip_mode(srb, chip);
2296 break;
2297
2298 case SUIT_CMD:
2299 result = suit_cmd(srb, chip);
2300 break;
2301
2302 case GET_DEV_STATUS:
2303 result = get_dev_status(srb, chip);
2304 break;
2305
2306 default:
2307 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2308 TRACE_RET(chip, TRANSPORT_FAILED);
2309 }
2310
2311 return result;
2312}
2313
2314
2315static int read_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2316{
2317 u8 rtsx_status[16];
2318 int buf_len;
2319 unsigned int lun = SCSI_LUN(srb);
2320
2321 rtsx_status[0] = (u8)(chip->vendor_id >> 8);
2322 rtsx_status[1] = (u8)(chip->vendor_id);
2323
2324 rtsx_status[2] = (u8)(chip->product_id >> 8);
2325 rtsx_status[3] = (u8)(chip->product_id);
2326
2327 rtsx_status[4] = (u8)lun;
2328
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;
2334 }
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;
2345 }
2346 } else {
2347 rtsx_status[5] = 7;
2348 }
2349 }
2350
2351 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
2352 rtsx_status[6] = 2;
2353 } else {
2354 rtsx_status[6] = 1;
2355 }
2356
2357 rtsx_status[7] = (u8)(chip->product_id);
2358 rtsx_status[8] = chip->ic_version;
2359
2360 if (check_card_exist(chip, lun)) {
2361 rtsx_status[9] = 1;
2362 } else {
2363 rtsx_status[9] = 0;
2364 }
2365
2366 if (CHECK_LUN_MODE(chip, SD_MS_2LUN)) {
2367 rtsx_status[10] = 0;
2368 } else {
2369 rtsx_status[10] = 1;
2370 }
2371
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;
2377 }
2378 } else {
2379 rtsx_status[11] = XD_CARD | SD_CARD | MS_CARD;
2380 }
2381
2382 if (check_card_ready(chip, lun)) {
2383 rtsx_status[12] = 1;
2384 } else {
2385 rtsx_status[12] = 0;
2386 }
2387
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);
2392
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;
2405 }
2406 } else if (get_lun_card(chip, lun) == MS_CARD) {
2407 struct ms_info *ms_card = &(chip->ms_card);
2408
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;
2419 }
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;
2427 }
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;
2436 }
2437 }
2438 }
2439
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;
2445 }
2446
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);
2450
2451 return TRANSPORT_GOOD;
2452}
2453
2454static int get_card_bus_width(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2455{
2456 unsigned int lun = SCSI_LUN(srb);
2457 u8 card, bus_width;
2458
2459 if (!check_card_ready(chip, lun)) {
2460 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2461 TRACE_RET(chip, TRANSPORT_FAILED);
2462 }
2463
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);
2470 }
2471
2472 scsi_set_resid(srb, 0);
2473 rtsx_stor_set_xfer_buf(&bus_width, scsi_bufflen(srb), srb);
2474
2475 return TRANSPORT_GOOD;
2476}
2477
2478static int spi_vendor_cmd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2479{
2480 int result;
2481 unsigned int lun = SCSI_LUN(srb);
2482 u8 gpio_dir;
2483
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);
2487 }
2488
2489 rtsx_disable_aspm(chip);
2490
2491 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2492 rtsx_exit_ss(chip);
2493 wait_timeout(100);
2494 }
2495 rtsx_set_stat(chip, RTSX_STAT_RUN);
2496
2497 rtsx_force_power_on(chip, SSC_PDCTL);
2498
2499 rtsx_read_register(chip, CARD_GPIO_DIR, &gpio_dir);
2500 rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir & 0x06);
2501
2502 switch (srb->cmnd[2]) {
2503 case SCSI_SPI_GETSTATUS:
2504 result = spi_get_status(srb, chip);
2505 break;
2506
2507 case SCSI_SPI_SETPARAMETER:
2508 result = spi_set_parameter(srb, chip);
2509 break;
2510
2511 case SCSI_SPI_READFALSHID:
2512 result = spi_read_flash_id(srb, chip);
2513 break;
2514
2515 case SCSI_SPI_READFLASH:
2516 result = spi_read_flash(srb, chip);
2517 break;
2518
2519 case SCSI_SPI_WRITEFLASH:
2520 result = spi_write_flash(srb, chip);
2521 break;
2522
2523 case SCSI_SPI_WRITEFLASHSTATUS:
2524 result = spi_write_flash_status(srb, chip);
2525 break;
2526
2527 case SCSI_SPI_ERASEFLASH:
2528 result = spi_erase_flash(srb, chip);
2529 break;
2530
2531 default:
2532 rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir);
2533
2534 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2535 TRACE_RET(chip, TRANSPORT_FAILED);
2536 }
2537
2538 rtsx_write_register(chip, CARD_GPIO_DIR, 0x07, gpio_dir);
2539
2540 if (result != STATUS_SUCCESS) {
2541 TRACE_RET(chip, TRANSPORT_FAILED);
2542 }
2543
2544 return TRANSPORT_GOOD;
2545}
2546
2547static int vendor_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2548{
2549 int result;
2550
2551 switch (srb->cmnd[1]) {
2552 case READ_STATUS:
2553 result = read_status(srb, chip);
2554 break;
2555
2556 case READ_MEM:
2557 result = read_mem(srb, chip);
2558 break;
2559
2560 case WRITE_MEM:
2561 result = write_mem(srb, chip);
2562 break;
2563
2564 case READ_EEPROM:
2565 result = read_eeprom(srb, chip);
2566 break;
2567
2568 case WRITE_EEPROM:
2569 result = write_eeprom(srb, chip);
2570 break;
2571
2572 case TOGGLE_GPIO:
2573 result = toggle_gpio_cmd(srb, chip);
2574 break;
2575
2576 case GET_SD_CSD:
2577 result = get_sd_csd(srb, chip);
2578 break;
2579
2580 case GET_BUS_WIDTH:
2581 result = get_card_bus_width(srb, chip);
2582 break;
2583
2584#ifdef _MSG_TRACE
2585 case TRACE_MSG:
2586 result = trace_msg_cmd(srb, chip);
2587 break;
2588#endif
2589
2590 case SCSI_APP_CMD:
2591 result = app_cmd(srb, chip);
2592 break;
2593
2594 case SPI_VENDOR_COMMAND:
2595 result = spi_vendor_cmd(srb, chip);
2596 break;
2597
2598 default:
2599 set_sense_type(chip, SCSI_LUN(srb), SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2600 TRACE_RET(chip, TRANSPORT_FAILED);
2601 }
2602
2603 return result;
2604}
2605
2606#if !defined(LED_AUTO_BLINK) && !defined(REGULAR_BLINK)
2607void led_shine(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2608{
2609 unsigned int lun = SCSI_LUN(srb);
2610 u16 sec_cnt;
2611
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;
2618 }
2619
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;
2625 }
2626}
2627#endif
2628
2629static int ms_format_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2630{
2631 struct ms_info *ms_card = &(chip->ms_card);
2632 unsigned int lun = SCSI_LUN(srb);
2633 int retval, quick_format;
2634
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);
2638 }
2639
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);
2645 }
2646
2647 rtsx_disable_aspm(chip);
2648
2649 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2650 rtsx_exit_ss(chip);
2651 wait_timeout(100);
2652
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);
2657 }
2658 }
2659 rtsx_set_stat(chip, RTSX_STAT_RUN);
2660
2661 if (srb->cmnd[8] & 0x01) {
2662 quick_format = 0;
2663 } else {
2664 quick_format = 1;
2665 }
2666
2667 if (!(chip->card_ready & MS_CARD)) {
2668 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2669 TRACE_RET(chip, TRANSPORT_FAILED);
2670 }
2671
2672 if (chip->card_wp & MS_CARD) {
2673 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
2674 TRACE_RET(chip, TRANSPORT_FAILED);
2675 }
2676
2677 if (!CHK_MSPRO(ms_card)) {
2678 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
2679 TRACE_RET(chip, TRANSPORT_FAILED);
2680 }
2681
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);
2686 }
2687
2688 scsi_set_resid(srb, 0);
2689 return TRANSPORT_GOOD;
2690}
2691
2692#ifdef SUPPORT_PCGL_1P18
6680d2ca 2693static int get_ms_information(struct scsi_cmnd *srb, struct rtsx_chip *chip)
77d89b08 2694{
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;
2701
2702 if (!check_card_ready(chip, lun)) {
2703 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2704 TRACE_RET(chip, TRANSPORT_FAILED);
2705 }
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);
2709 }
2710
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);
2716 }
2717
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);
2724 }
2725
2726 if (dev_info_id == 0x15) {
2727 buf_len = data_len = 0x3A;
2728 } else {
2729 buf_len = data_len = 0x6A;
2730 }
2731
2732 buf = (u8 *)kmalloc(buf_len, GFP_KERNEL);
2733 if (!buf) {
2734 TRACE_RET(chip, TRANSPORT_ERROR);
2735 }
2736
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;
2746 }
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;
2755
2756 /* Device Information Body */
2757
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;
2765 }
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);
2776 }
2777
2778 rtsx_stor_set_xfer_buf(buf, buf_len, srb);
2779
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);
2784 }
2785
2786 kfree(buf);
2787 return STATUS_SUCCESS;
2788}
2789#endif
2790
2791static int ms_sp_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2792{
2793 int retval = TRANSPORT_ERROR;
2794
2795 if (srb->cmnd[2] == MS_FORMAT) {
2796 retval = ms_format_cmnd(srb, chip);
2797 }
2798#ifdef SUPPORT_PCGL_1P18
2799 else if (srb->cmnd[2] == GET_MS_INFORMATION) {
2800 retval = get_ms_information(srb, chip);
2801 }
2802#endif
2803
2804 return retval;
2805}
2806
2807#ifdef SUPPORT_CPRM
2808static int sd_extention_cmnd(struct scsi_cmnd *srb, struct rtsx_chip *chip)
2809{
2810 unsigned int lun = SCSI_LUN(srb);
2811 int result;
2812
2813 rtsx_disable_aspm(chip);
2814
2815 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2816 rtsx_exit_ss(chip);
2817 wait_timeout(100);
2818 }
2819 rtsx_set_stat(chip, RTSX_STAT_RUN);
2820
2821 sd_cleanup_work(chip);
2822
2823 if (!check_card_ready(chip, lun)) {
2824 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2825 TRACE_RET(chip, TRANSPORT_FAILED);
2826 }
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);
2830 }
2831
2832 switch (srb->cmnd[0]) {
2833 case SD_PASS_THRU_MODE:
2834 result = sd_pass_thru_mode(srb, chip);
2835 break;
2836
2837 case SD_EXECUTE_NO_DATA:
2838 result = sd_execute_no_data(srb, chip);
2839 break;
2840
2841 case SD_EXECUTE_READ:
2842 result = sd_execute_read_data(srb, chip);
2843 break;
2844
2845 case SD_EXECUTE_WRITE:
2846 result = sd_execute_write_data(srb, chip);
2847 break;
2848
2849 case SD_GET_RSP:
2850 result = sd_get_cmd_rsp(srb, chip);
2851 break;
2852
2853 case SD_HW_RST:
2854 result = sd_hw_rst(srb, chip);
2855 break;
2856
2857 default:
2858 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2859 TRACE_RET(chip, TRANSPORT_FAILED);
2860 }
2861
2862 return result;
2863}
2864#endif
2865
2866#ifdef SUPPORT_MAGIC_GATE
6680d2ca 2867static int mg_report_key(struct scsi_cmnd *srb, struct rtsx_chip *chip)
77d89b08 2868{
2869 struct ms_info *ms_card = &(chip->ms_card);
2870 unsigned int lun = SCSI_LUN(srb);
2871 int retval;
2872 u8 key_format;
2873
2874 RTSX_DEBUGP("--%s--\n", __func__);
2875
2876 rtsx_disable_aspm(chip);
2877
2878 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2879 rtsx_exit_ss(chip);
2880 wait_timeout(100);
2881 }
2882 rtsx_set_stat(chip, RTSX_STAT_RUN);
2883
2884 ms_cleanup_work(chip);
2885
2886 if (!check_card_ready(chip, lun)) {
2887 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2888 TRACE_RET(chip, TRANSPORT_FAILED);
2889 }
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);
2893 }
2894
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);
2898 }
2899
2900 if (!CHK_MSPRO(ms_card)) {
2901 set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
2902 TRACE_RET(chip, TRANSPORT_FAILED);
2903 }
2904
2905 key_format = srb->cmnd[10] & 0x3F;
2906 RTSX_DEBUGP("key_format = 0x%x\n", key_format);
2907
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);
2916 }
2917 } else {
2918 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2919 TRACE_RET(chip, TRANSPORT_FAILED);
2920 }
2921 break;
2922
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);
2930 }
2931 } else {
2932 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2933 TRACE_RET(chip, TRANSPORT_FAILED);
2934 }
2935 break;
2936
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);
2949 }
2950 } else {
2951 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2952 TRACE_RET(chip, TRANSPORT_FAILED);
2953 }
2954 break;
2955
2956 default:
2957 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
2958 TRACE_RET(chip, TRANSPORT_FAILED);
2959 }
2960
2961 scsi_set_resid(srb, 0);
2962 return TRANSPORT_GOOD;
2963}
2964
6680d2ca 2965static int mg_send_key(struct scsi_cmnd *srb, struct rtsx_chip *chip)
77d89b08 2966{
2967 struct ms_info *ms_card = &(chip->ms_card);
2968 unsigned int lun = SCSI_LUN(srb);
2969 int retval;
2970 u8 key_format;
2971
2972 RTSX_DEBUGP("--%s--\n", __func__);
2973
2974 rtsx_disable_aspm(chip);
2975
2976 if (chip->ss_en && (rtsx_get_stat(chip) == RTSX_STAT_SS)) {
2977 rtsx_exit_ss(chip);
2978 wait_timeout(100);
2979 }
2980 rtsx_set_stat(chip, RTSX_STAT_RUN);
2981
2982 ms_cleanup_work(chip);
2983
2984 if (!check_card_ready(chip, lun)) {
2985 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
2986 TRACE_RET(chip, TRANSPORT_FAILED);
2987 }
2988 if (check_card_wp(chip, lun)) {
2989 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
2990 TRACE_RET(chip, TRANSPORT_FAILED);
2991 }
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);
2995 }
2996
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);
3000 }
3001
3002 if (!CHK_MSPRO(ms_card)) {
3003 set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
3004 TRACE_RET(chip, TRANSPORT_FAILED);
3005 }
3006
3007 key_format = srb->cmnd[10] & 0x3F;
3008 RTSX_DEBUGP("key_format = 0x%x\n", key_format);
3009
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);
3018 }
3019 } else {
3020 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3021 TRACE_RET(chip, TRANSPORT_FAILED);
3022 }
3023 break;
3024
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);
3032 }
3033 } else {
3034 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3035 TRACE_RET(chip, TRANSPORT_FAILED);
3036 }
3037 break;
3038
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);
3046 }
3047 } else {
3048 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3049 TRACE_RET(chip, TRANSPORT_FAILED);
3050 }
3051 break;
3052
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);
3065 }
3066 } else {
3067 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3068 TRACE_RET(chip, TRANSPORT_FAILED);
3069 }
3070 break;
3071
3072 default:
3073 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3074 TRACE_RET(chip, TRANSPORT_FAILED);
3075 }
3076
3077 scsi_set_resid(srb, 0);
3078 return TRANSPORT_GOOD;
3079}
3080#endif
3081
3082int rtsx_scsi_handler(struct scsi_cmnd *srb, struct rtsx_chip *chip)
3083{
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;
3090
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
3095 */
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);
3104 }
3105 }
3106#endif
3107
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);
3115 }
3116 }
3117
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;
3128
3129 case TEST_UNIT_READY:
3130 result = test_unit_ready(srb, chip);
3131 break;
3132
3133 case INQUIRY:
3134 result = inquiry(srb, chip);
3135 break;
3136
3137 case READ_CAPACITY:
3138 result = read_capacity(srb, chip);
3139 break;
3140
3141 case START_STOP:
3142 result = start_stop_unit(srb, chip);
3143 break;
3144
3145 case ALLOW_MEDIUM_REMOVAL:
3146 result = allow_medium_removal(srb, chip);
3147 break;
3148
3149 case REQUEST_SENSE:
3150 result = request_sense(srb, chip);
3151 break;
3152
3153 case MODE_SENSE:
3154 case MODE_SENSE_10:
3155 result = mode_sense(srb, chip);
3156 break;
3157
3158 case 0x23:
3159 result = read_format_capacity(srb, chip);
3160 break;
3161
3162 case VENDOR_CMND:
3163 result = vendor_cmnd(srb, chip);
3164 break;
3165
3166 case MS_SP_CMND:
3167 result = ms_sp_cmnd(srb, chip);
3168 break;
3169
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
3180
3181#ifdef SUPPORT_MAGIC_GATE
3182 case CMD_MSPRO_MG_RKEY:
3183 result = mg_report_key(srb, chip);
3184 break;
3185
3186 case CMD_MSPRO_MG_SKEY:
3187 result = mg_send_key(srb, chip);
3188 break;
3189#endif
3190
3191 case FORMAT_UNIT:
3192 case MODE_SELECT:
3193 case VERIFY:
3194 result = TRANSPORT_GOOD;
3195 break;
3196
3197 default:
3198 set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
3199 result = TRANSPORT_FAILED;
3200 }
3201
3202 return result;
3203}
This page took 0.161862 seconds and 5 git commands to generate.