1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include <linux/blkdev.h>
27#include <linux/kthread.h>
28#include <linux/sched.h>
29#include <linux/slab.h>
30#include <linux/vmalloc.h>
31#include <linux/export.h>
32
33#include <scsi/scsi.h>
34#include <scsi/scsi_eh.h>
35#include <scsi/scsi_device.h>
36
37#include "debug.h"
38#include "rts51x.h"
39#include "rts51x_chip.h"
40#include "rts51x_scsi.h"
41#include "rts51x_card.h"
42#include "rts51x_transport.h"
43#include "sd_cprm.h"
44#include "ms_mg.h"
45#include "trace.h"
46
47void rts51x_scsi_show_command(struct scsi_cmnd *srb)
48{
49 char *what = NULL;
50 int i, unknown_cmd = 0;
51
52 switch (srb->cmnd[0]) {
53 case TEST_UNIT_READY:
54 what = (char *)"TEST_UNIT_READY";
55 break;
56 case REZERO_UNIT:
57 what = (char *)"REZERO_UNIT";
58 break;
59 case REQUEST_SENSE:
60 what = (char *)"REQUEST_SENSE";
61 break;
62 case FORMAT_UNIT:
63 what = (char *)"FORMAT_UNIT";
64 break;
65 case READ_BLOCK_LIMITS:
66 what = (char *)"READ_BLOCK_LIMITS";
67 break;
68 case 0x07:
69 what = (char *)"REASSIGN_BLOCKS";
70 break;
71 case READ_6:
72 what = (char *)"READ_6";
73 break;
74 case WRITE_6:
75 what = (char *)"WRITE_6";
76 break;
77 case SEEK_6:
78 what = (char *)"SEEK_6";
79 break;
80 case READ_REVERSE:
81 what = (char *)"READ_REVERSE";
82 break;
83 case WRITE_FILEMARKS:
84 what = (char *)"WRITE_FILEMARKS";
85 break;
86 case SPACE:
87 what = (char *)"SPACE";
88 break;
89 case INQUIRY:
90 what = (char *)"INQUIRY";
91 break;
92 case RECOVER_BUFFERED_DATA:
93 what = (char *)"RECOVER_BUFFERED_DATA";
94 break;
95 case MODE_SELECT:
96 what = (char *)"MODE_SELECT";
97 break;
98 case RESERVE:
99 what = (char *)"RESERVE";
100 break;
101 case RELEASE:
102 what = (char *)"RELEASE";
103 break;
104 case COPY:
105 what = (char *)"COPY";
106 break;
107 case ERASE:
108 what = (char *)"ERASE";
109 break;
110 case MODE_SENSE:
111 what = (char *)"MODE_SENSE";
112 break;
113 case START_STOP:
114 what = (char *)"START_STOP";
115 break;
116 case RECEIVE_DIAGNOSTIC:
117 what = (char *)"RECEIVE_DIAGNOSTIC";
118 break;
119 case SEND_DIAGNOSTIC:
120 what = (char *)"SEND_DIAGNOSTIC";
121 break;
122 case ALLOW_MEDIUM_REMOVAL:
123 what = (char *)"ALLOW_MEDIUM_REMOVAL";
124 break;
125 case SET_WINDOW:
126 what = (char *)"SET_WINDOW";
127 break;
128 case READ_CAPACITY:
129 what = (char *)"READ_CAPACITY";
130 break;
131 case READ_10:
132 what = (char *)"READ_10";
133 break;
134 case WRITE_10:
135 what = (char *)"WRITE_10";
136 break;
137 case SEEK_10:
138 what = (char *)"SEEK_10";
139 break;
140 case WRITE_VERIFY:
141 what = (char *)"WRITE_VERIFY";
142 break;
143 case VERIFY:
144 what = (char *)"VERIFY";
145 break;
146 case SEARCH_HIGH:
147 what = (char *)"SEARCH_HIGH";
148 break;
149 case SEARCH_EQUAL:
150 what = (char *)"SEARCH_EQUAL";
151 break;
152 case SEARCH_LOW:
153 what = (char *)"SEARCH_LOW";
154 break;
155 case SET_LIMITS:
156 what = (char *)"SET_LIMITS";
157 break;
158 case READ_POSITION:
159 what = (char *)"READ_POSITION";
160 break;
161 case SYNCHRONIZE_CACHE:
162 what = (char *)"SYNCHRONIZE_CACHE";
163 break;
164 case LOCK_UNLOCK_CACHE:
165 what = (char *)"LOCK_UNLOCK_CACHE";
166 break;
167 case READ_DEFECT_DATA:
168 what = (char *)"READ_DEFECT_DATA";
169 break;
170 case MEDIUM_SCAN:
171 what = (char *)"MEDIUM_SCAN";
172 break;
173 case COMPARE:
174 what = (char *)"COMPARE";
175 break;
176 case COPY_VERIFY:
177 what = (char *)"COPY_VERIFY";
178 break;
179 case WRITE_BUFFER:
180 what = (char *)"WRITE_BUFFER";
181 break;
182 case READ_BUFFER:
183 what = (char *)"READ_BUFFER";
184 break;
185 case UPDATE_BLOCK:
186 what = (char *)"UPDATE_BLOCK";
187 break;
188 case READ_LONG:
189 what = (char *)"READ_LONG";
190 break;
191 case WRITE_LONG:
192 what = (char *)"WRITE_LONG";
193 break;
194 case CHANGE_DEFINITION:
195 what = (char *)"CHANGE_DEFINITION";
196 break;
197 case WRITE_SAME:
198 what = (char *)"WRITE_SAME";
199 break;
200 case GPCMD_READ_SUBCHANNEL:
201 what = (char *)"READ SUBCHANNEL";
202 break;
203 case READ_TOC:
204 what = (char *)"READ_TOC";
205 break;
206 case GPCMD_READ_HEADER:
207 what = (char *)"READ HEADER";
208 break;
209 case GPCMD_PLAY_AUDIO_10:
210 what = (char *)"PLAY AUDIO (10)";
211 break;
212 case GPCMD_PLAY_AUDIO_MSF:
213 what = (char *)"PLAY AUDIO MSF";
214 break;
215 case GPCMD_GET_EVENT_STATUS_NOTIFICATION:
216 what = (char *)"GET EVENT/STATUS NOTIFICATION";
217 break;
218 case GPCMD_PAUSE_RESUME:
219 what = (char *)"PAUSE/RESUME";
220 break;
221 case LOG_SELECT:
222 what = (char *)"LOG_SELECT";
223 break;
224 case LOG_SENSE:
225 what = (char *)"LOG_SENSE";
226 break;
227 case GPCMD_STOP_PLAY_SCAN:
228 what = (char *)"STOP PLAY/SCAN";
229 break;
230 case GPCMD_READ_DISC_INFO:
231 what = (char *)"READ DISC INFORMATION";
232 break;
233 case GPCMD_READ_TRACK_RZONE_INFO:
234 what = (char *)"READ TRACK INFORMATION";
235 break;
236 case GPCMD_RESERVE_RZONE_TRACK:
237 what = (char *)"RESERVE TRACK";
238 break;
239 case GPCMD_SEND_OPC:
240 what = (char *)"SEND OPC";
241 break;
242 case MODE_SELECT_10:
243 what = (char *)"MODE_SELECT_10";
244 break;
245 case GPCMD_REPAIR_RZONE_TRACK:
246 what = (char *)"REPAIR TRACK";
247 break;
248 case 0x59:
249 what = (char *)"READ MASTER CUE";
250 break;
251 case MODE_SENSE_10:
252 what = (char *)"MODE_SENSE_10";
253 break;
254 case GPCMD_CLOSE_TRACK:
255 what = (char *)"CLOSE TRACK/SESSION";
256 break;
257 case 0x5C:
258 what = (char *)"READ BUFFER CAPACITY";
259 break;
260 case 0x5D:
261 what = (char *)"SEND CUE SHEET";
262 break;
263 case GPCMD_BLANK:
264 what = (char *)"BLANK";
265 break;
266 case REPORT_LUNS:
267 what = (char *)"REPORT LUNS";
268 break;
269 case MOVE_MEDIUM:
270 what = (char *)"MOVE_MEDIUM or PLAY AUDIO (12)";
271 break;
272 case READ_12:
273 what = (char *)"READ_12";
274 break;
275 case WRITE_12:
276 what = (char *)"WRITE_12";
277 break;
278 case WRITE_VERIFY_12:
279 what = (char *)"WRITE_VERIFY_12";
280 break;
281 case SEARCH_HIGH_12:
282 what = (char *)"SEARCH_HIGH_12";
283 break;
284 case SEARCH_EQUAL_12:
285 what = (char *)"SEARCH_EQUAL_12";
286 break;
287 case SEARCH_LOW_12:
288 what = (char *)"SEARCH_LOW_12";
289 break;
290 case SEND_VOLUME_TAG:
291 what = (char *)"SEND_VOLUME_TAG";
292 break;
293 case READ_ELEMENT_STATUS:
294 what = (char *)"READ_ELEMENT_STATUS";
295 break;
296 case GPCMD_READ_CD_MSF:
297 what = (char *)"READ CD MSF";
298 break;
299 case GPCMD_SCAN:
300 what = (char *)"SCAN";
301 break;
302 case GPCMD_SET_SPEED:
303 what = (char *)"SET CD SPEED";
304 break;
305 case GPCMD_MECHANISM_STATUS:
306 what = (char *)"MECHANISM STATUS";
307 break;
308 case GPCMD_READ_CD:
309 what = (char *)"READ CD";
310 break;
311 case 0xE1:
312 what = (char *)"WRITE CONTINUE";
313 break;
314 case WRITE_LONG_2:
315 what = (char *)"WRITE_LONG_2";
316 break;
317 case VENDOR_CMND:
318 what = (char *)"Realtek's vendor command";
319 break;
320 default:
321 what = (char *)"(unknown command)";
322 unknown_cmd = 1;
323 break;
324 }
325
326 if (srb->cmnd[0] != TEST_UNIT_READY)
327 RTS51X_DEBUGP("Command %s (%d bytes)\n", what, srb->cmd_len);
328 if (unknown_cmd) {
329 RTS51X_DEBUGP("");
330 for (i = 0; i < srb->cmd_len && i < 16; i++)
331 RTS51X_DEBUGPN(" %02x", srb->cmnd[i]);
332 RTS51X_DEBUGPN("\n");
333 }
334}
335
336void rts51x_set_sense_type(struct rts51x_chip *chip, unsigned int lun, int sense_type)
337{
338 switch (sense_type) {
339 case SENSE_TYPE_MEDIA_CHANGE:
340 rts51x_set_sense_data(chip, lun, CUR_ERR, 0x06, 0, 0x28, 0, 0, 0);
341 break;
342
343 case SENSE_TYPE_MEDIA_NOT_PRESENT:
344 rts51x_set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x3A, 0, 0, 0);
345 break;
346
347 case SENSE_TYPE_MEDIA_LBA_OVER_RANGE:
348 rts51x_set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x21, 0, 0, 0);
349 break;
350
351 case SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT:
352 rts51x_set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x25, 0, 0, 0);
353 break;
354
355 case SENSE_TYPE_MEDIA_WRITE_PROTECT:
356 rts51x_set_sense_data(chip, lun, CUR_ERR, 0x07, 0, 0x27, 0, 0, 0);
357 break;
358
359 case SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR:
360 rts51x_set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x11, 0, 0, 0);
361 break;
362
363 case SENSE_TYPE_MEDIA_WRITE_ERR:
364 rts51x_set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x0C, 0x02, 0, 0);
365 break;
366
367 case SENSE_TYPE_MEDIA_INVALID_CMD_FIELD:
368 rts51x_set_sense_data(chip, lun, CUR_ERR, ILGAL_REQ, 0,
369 ASC_INVLD_CDB, ASCQ_INVLD_CDB, CDB_ILLEGAL, 1);
370 break;
371
372 case SENSE_TYPE_FORMAT_CMD_FAILED:
373 rts51x_set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x31, 0x01, 0, 0);
374 break;
375
376#ifdef SUPPORT_MAGIC_GATE
377 case SENSE_TYPE_MG_KEY_FAIL_NOT_ESTAB:
378 rts51x_set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x6F, 0x02, 0, 0);
379 break;
380
381 case SENSE_TYPE_MG_KEY_FAIL_NOT_AUTHEN:
382 rts51x_set_sense_data(chip, lun, CUR_ERR, 0x05, 0, 0x6F, 0x00, 0, 0);
383 break;
384
385 case SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM:
386 rts51x_set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x30, 0x00, 0, 0);
387 break;
388
389 case SENSE_TYPE_MG_WRITE_ERR:
390 rts51x_set_sense_data(chip, lun, CUR_ERR, 0x03, 0, 0x0C, 0x00, 0, 0);
391 break;
392#endif
393
394 case SENSE_TYPE_NO_SENSE:
395 default:
396 rts51x_set_sense_data(chip, lun, CUR_ERR, 0, 0, 0, 0, 0, 0);
397 break;
398 }
399}
400
401void rts51x_set_sense_data(struct rts51x_chip *chip, unsigned int lun, u8 err_code,
402 u8 sense_key, u32 info, u8 asc, u8 ascq, u8 sns_key_info0,
403 u16 sns_key_info1)
404{
405 struct sense_data_t *sense = &(chip->sense_buffer[lun]);
406
407 sense->err_code = err_code;
408 sense->sense_key = sense_key;
409 sense->info[0] = (u8) (info >> 24);
410 sense->info[1] = (u8) (info >> 16);
411 sense->info[2] = (u8) (info >> 8);
412 sense->info[3] = (u8) info;
413
414 sense->ad_sense_len = sizeof(struct sense_data_t) - 8;
415 sense->asc = asc;
416 sense->ascq = ascq;
417 if (sns_key_info0 != 0) {
418 sense->sns_key_info[0] = SKSV | sns_key_info0;
419 sense->sns_key_info[1] = (sns_key_info1 & 0xf0) >> 8;
420 sense->sns_key_info[2] = sns_key_info1 & 0x0f;
421 }
422}
423
424static int test_unit_ready(struct scsi_cmnd *srb, struct rts51x_chip *chip)
425{
426 unsigned int lun = SCSI_LUN(srb);
427
428 rts51x_init_cards(chip);
429
430 if (!check_card_ready(chip, lun)) {
431 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
432 return TRANSPORT_FAILED;
433 }
434
435 if (!check_lun_mc(chip, lun)) {
436 set_lun_mc(chip, lun);
437 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
438 return TRANSPORT_FAILED;
439 }
440
441 return TRANSPORT_GOOD;
442}
443
444unsigned char formatter_inquiry_str[20] = {
445 'M', 'E', 'M', 'O', 'R', 'Y', 'S', 'T', 'I', 'C', 'K',
446 '-', 'M', 'G',
447 0x0B,
448 0x00,
449 0x00,
450 0x20, 0x20, 0x20,
451};
452
453static int inquiry(struct scsi_cmnd *srb, struct rts51x_chip *chip)
454{
455 unsigned int lun = SCSI_LUN(srb);
456 char *inquiry_default = (char *)"Generic-xD/SD/M.S. 1.00 ";
457 char *inquiry_string;
458 unsigned char sendbytes;
459 unsigned char *buf;
460 u8 card = rts51x_get_lun_card(chip, lun);
461 int pro_formatter_flag = 0;
462 unsigned char inquiry_buf[] = {
463 QULIFIRE | DRCT_ACCESS_DEV,
464 RMB_DISC | 0x0D,
465 0x00,
466 0x01,
467 0x1f,
468 0x02,
469 0,
470 REL_ADR | WBUS_32 | WBUS_16 | SYNC | LINKED | CMD_QUE | SFT_RE,
471 };
472
473 inquiry_string = inquiry_default;
474
475 buf = vmalloc(scsi_bufflen(srb));
476 if (buf == NULL)
477 TRACE_RET(chip, TRANSPORT_ERROR);
478
479 if (MS_FORMATTER_ENABLED(chip) && (get_lun2card(chip, lun) & MS_CARD)) {
480 if (!card || (card == MS_CARD))
481 pro_formatter_flag = 1;
482 }
483
484 if (pro_formatter_flag) {
485 if (scsi_bufflen(srb) < 56)
486 sendbytes = (unsigned char)(scsi_bufflen(srb));
487 else
488 sendbytes = 56;
489 } else {
490 if (scsi_bufflen(srb) < 36)
491 sendbytes = (unsigned char)(scsi_bufflen(srb));
492 else
493 sendbytes = 36;
494 }
495
496 if (sendbytes > 8) {
497 memcpy(buf, inquiry_buf, 8);
498 memcpy(buf + 8, inquiry_string, sendbytes - 8);
499 if (pro_formatter_flag)
500 buf[4] = 0x33;
501 } else {
502 memcpy(buf, inquiry_buf, sendbytes);
503 }
504
505 if (pro_formatter_flag) {
506 if (sendbytes > 36)
507 memcpy(buf + 36, formatter_inquiry_str, sendbytes - 36);
508 }
509
510 scsi_set_resid(srb, 0);
511
512 rts51x_set_xfer_buf(buf, scsi_bufflen(srb), srb);
513 vfree(buf);
514
515 return TRANSPORT_GOOD;
516}
517
518static int start_stop_unit(struct scsi_cmnd *srb, struct rts51x_chip *chip)
519{
520 unsigned int lun = SCSI_LUN(srb);
521
522 scsi_set_resid(srb, scsi_bufflen(srb));
523
524 if (srb->cmnd[1] == 1)
525 return TRANSPORT_GOOD;
526
527 switch (srb->cmnd[0x4]) {
528 case STOP_MEDIUM:
529
530 return TRANSPORT_GOOD;
531
532 case UNLOAD_MEDIUM:
533
534 if (check_card_ready(chip, lun))
535 rts51x_eject_card(chip, lun);
536 return TRANSPORT_GOOD;
537
538 case MAKE_MEDIUM_READY:
539 case LOAD_MEDIUM:
540 if (check_card_ready(chip, lun)) {
541 return TRANSPORT_GOOD;
542 } else {
543 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
544 TRACE_RET(chip, TRANSPORT_FAILED);
545 }
546
547 break;
548 }
549
550 TRACE_RET(chip, TRANSPORT_ERROR);
551}
552
553static int allow_medium_removal(struct scsi_cmnd *srb, struct rts51x_chip *chip)
554{
555 int prevent;
556
557 prevent = srb->cmnd[4] & 0x1;
558
559 scsi_set_resid(srb, 0);
560
561 if (prevent) {
562 rts51x_set_sense_type(chip, SCSI_LUN(srb),
563 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
564 TRACE_RET(chip, TRANSPORT_FAILED);
565 }
566
567 return TRANSPORT_GOOD;
568}
569
570static void ms_mode_sense(struct rts51x_chip *chip, u8 cmd,
571 int lun, u8 *buf, int buf_len)
572{
573 struct ms_info *ms_card = &(chip->ms_card);
574 int sys_info_offset;
575 int data_size = buf_len;
576 int support_format = 0;
577 int i = 0;
578
579 if (cmd == MODE_SENSE) {
580 sys_info_offset = 8;
581 if (data_size > 0x68)
582 data_size = 0x68;
583 buf[i++] = 0x67;
584 } else {
585 sys_info_offset = 12;
586 if (data_size > 0x6C)
587 data_size = 0x6C;
588 buf[i++] = 0x00;
589 buf[i++] = 0x6A;
590 }
591
592
593 if (check_card_ready(chip, lun)) {
594 if (CHK_MSXC(ms_card)) {
595 support_format = 1;
596 buf[i++] = 0x40;
597 } else if (CHK_MSPRO(ms_card)) {
598 support_format = 1;
599 buf[i++] = 0x20;
600 } else {
601 buf[i++] = 0x10;
602 }
603
604
605 if (check_card_wp(chip, lun))
606 buf[i++] = 0x80;
607 else
608 buf[i++] = 0x00;
609 } else {
610 buf[i++] = 0x00;
611 buf[i++] = 0x00;
612 }
613
614 buf[i++] = 0x00;
615
616 if (cmd == MODE_SENSE_10) {
617 buf[i++] = 0x00;
618 buf[i++] = 0x00;
619 buf[i++] = 0x00;
620
621
622 if (data_size >= 9)
623 buf[i++] = 0x20;
624 if (data_size >= 10)
625 buf[i++] = 0x62;
626 if (data_size >= 11)
627 buf[i++] = 0x00;
628 if (data_size >= 12) {
629 if (support_format)
630 buf[i++] = 0xC0;
631 else
632 buf[i++] = 0x00;
633 }
634 } else {
635
636 if (data_size >= 5)
637 buf[i++] = 0x20;
638 if (data_size >= 6)
639 buf[i++] = 0x62;
640 if (data_size >= 7)
641 buf[i++] = 0x00;
642 if (data_size >= 8) {
643 if (support_format)
644 buf[i++] = 0xC0;
645 else
646 buf[i++] = 0x00;
647 }
648 }
649
650 if (data_size > sys_info_offset) {
651
652 int len = data_size - sys_info_offset;
653 len = (len < 96) ? len : 96;
654
655 memcpy(buf + sys_info_offset, ms_card->raw_sys_info, len);
656 }
657}
658
659static int mode_sense(struct scsi_cmnd *srb, struct rts51x_chip *chip)
660{
661 unsigned int lun = SCSI_LUN(srb);
662 unsigned int dataSize;
663 int status;
664 int pro_formatter_flag;
665 unsigned char pageCode, *buf;
666 u8 card = rts51x_get_lun_card(chip, lun);
667
668 if (!check_card_ready(chip, lun)) {
669 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
670 scsi_set_resid(srb, scsi_bufflen(srb));
671 TRACE_RET(chip, TRANSPORT_FAILED);
672 }
673
674 pro_formatter_flag = 0;
675 dataSize = 8;
676
677
678 if ((get_lun2card(chip, lun) & MS_CARD)) {
679 if (!card || (card == MS_CARD)) {
680 dataSize = 108;
681 if (chip->option.rts51x_mspro_formatter_enable)
682 pro_formatter_flag = 1;
683 }
684 }
685
686 buf = kmalloc(dataSize, GFP_KERNEL);
687 if (buf == NULL)
688 TRACE_RET(chip, TRANSPORT_ERROR);
689
690 pageCode = srb->cmnd[2] & 0x3f;
691
692 if ((pageCode == 0x3F) || (pageCode == 0x1C) ||
693 (pageCode == 0x00) || (pro_formatter_flag && (pageCode == 0x20))) {
694 if (srb->cmnd[0] == MODE_SENSE) {
695 if ((pageCode == 0x3F) || (pageCode == 0x20)) {
696 ms_mode_sense(chip, srb->cmnd[0], lun, buf,
697 dataSize);
698 } else {
699 dataSize = 4;
700 buf[0] = 0x03;
701 buf[1] = 0x00;
702 if (check_card_wp(chip, lun))
703 buf[2] = 0x80;
704 else
705 buf[3] = 0x00;
706 }
707 } else {
708 if ((pageCode == 0x3F) || (pageCode == 0x20)) {
709 ms_mode_sense(chip, srb->cmnd[0], lun, buf,
710 dataSize);
711 } else {
712 dataSize = 8;
713 buf[0] = 0x00;
714 buf[1] = 0x06;
715 buf[2] = 0x00;
716 if (check_card_wp(chip, lun))
717 buf[3] = 0x80;
718 else
719 buf[3] = 0x00;
720 buf[4] = 0x00;
721 buf[5] = 0x00;
722 buf[6] = 0x00;
723 buf[7] = 0x00;
724 }
725 }
726 status = TRANSPORT_GOOD;
727 } else {
728 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
729 scsi_set_resid(srb, scsi_bufflen(srb));
730 status = TRANSPORT_FAILED;
731 }
732
733 if (status == TRANSPORT_GOOD) {
734 unsigned int len = min(scsi_bufflen(srb), dataSize);
735 rts51x_set_xfer_buf(buf, len, srb);
736 scsi_set_resid(srb, scsi_bufflen(srb) - len);
737 }
738 kfree(buf);
739
740 return status;
741}
742
743static int request_sense(struct scsi_cmnd *srb, struct rts51x_chip *chip)
744{
745 struct sense_data_t *sense;
746 unsigned int lun = SCSI_LUN(srb);
747 struct ms_info *ms_card = &(chip->ms_card);
748 unsigned char *tmp, *buf;
749
750 sense = &(chip->sense_buffer[lun]);
751
752 if ((rts51x_get_lun_card(chip, lun) == MS_CARD)
753 && PRO_UNDER_FORMATTING(ms_card)) {
754 rts51x_mspro_format_sense(chip, lun);
755 }
756
757 buf = vmalloc(scsi_bufflen(srb));
758 if (buf == NULL)
759 TRACE_RET(chip, TRANSPORT_ERROR);
760
761 tmp = (unsigned char *)sense;
762 memcpy(buf, tmp, scsi_bufflen(srb));
763
764 rts51x_set_xfer_buf(buf, scsi_bufflen(srb), srb);
765 vfree(buf);
766
767 scsi_set_resid(srb, 0);
768
769 rts51x_set_sense_type(chip, lun, SENSE_TYPE_NO_SENSE);
770 return TRANSPORT_GOOD;
771}
772
773static int read_write(struct scsi_cmnd *srb, struct rts51x_chip *chip)
774{
775 unsigned int lun = SCSI_LUN(srb);
776 int retval;
777 u32 start_sec;
778 u16 sec_cnt;
779
780 if (!check_card_ready(chip, lun) || (chip->capacity[lun] == 0)) {
781 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
782 TRACE_RET(chip, TRANSPORT_FAILED);
783 }
784
785 if (!check_lun_mc(chip, lun)) {
786 set_lun_mc(chip, lun);
787 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
788 return TRANSPORT_FAILED;
789 }
790
791 rts51x_prepare_run(chip);
792 RTS51X_SET_STAT(chip, STAT_RUN);
793
794 if ((srb->cmnd[0] == READ_10) || (srb->cmnd[0] == WRITE_10)) {
795 start_sec =
796 ((u32) srb->cmnd[2] << 24) |
797 ((u32) srb->cmnd[3] << 16) |
798 ((u32) srb->cmnd[4] << 8) |
799 ((u32) srb->cmnd[5]);
800 sec_cnt = ((u16) (srb->cmnd[7]) << 8) | srb->cmnd[8];
801 } else if ((srb->cmnd[0] == READ_6) || (srb->cmnd[0] == WRITE_6)) {
802 start_sec = ((u32) (srb->cmnd[1] & 0x1F) << 16) |
803 ((u32) srb->cmnd[2] << 8) | ((u32) srb->cmnd[3]);
804 sec_cnt = srb->cmnd[4];
805 } else if ((srb->cmnd[0] == VENDOR_CMND) &&
806 (srb->cmnd[1] == SCSI_APP_CMD) &&
807 ((srb->cmnd[2] == PP_READ10) ||
808 (srb->cmnd[2] == PP_WRITE10))) {
809 start_sec = ((u32) srb->cmnd[4] << 24) |
810 ((u32) srb->cmnd[5] << 16) |
811 ((u32) srb->cmnd[6] << 8) |
812 ((u32) srb->cmnd[7]);
813 sec_cnt = ((u16) (srb->cmnd[9]) << 8) | srb->cmnd[10];
814 } else {
815 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
816 TRACE_RET(chip, TRANSPORT_FAILED);
817 }
818
819 if ((start_sec > chip->capacity[lun]) ||
820 ((start_sec + sec_cnt) > chip->capacity[lun])) {
821 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LBA_OVER_RANGE);
822 TRACE_RET(chip, TRANSPORT_FAILED);
823 }
824
825 if (sec_cnt == 0) {
826 scsi_set_resid(srb, 0);
827 return TRANSPORT_GOOD;
828 }
829
830 if ((srb->sc_data_direction == DMA_TO_DEVICE)
831 && check_card_wp(chip, lun)) {
832 RTS51X_DEBUGP("Write protected card!\n");
833 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
834 TRACE_RET(chip, TRANSPORT_FAILED);
835 }
836
837 retval = rts51x_card_rw(srb, chip, start_sec, sec_cnt);
838 if (retval != STATUS_SUCCESS) {
839 if (srb->sc_data_direction == DMA_FROM_DEVICE) {
840 rts51x_set_sense_type(chip, lun,
841 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
842 } else {
843 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
844 }
845 TRACE_RET(chip, TRANSPORT_FAILED);
846 }
847
848 scsi_set_resid(srb, 0);
849
850 return TRANSPORT_GOOD;
851}
852
853static int read_format_capacity(struct scsi_cmnd *srb, struct rts51x_chip *chip)
854{
855 unsigned char *buf;
856 unsigned int lun = SCSI_LUN(srb);
857 unsigned int buf_len;
858 u8 card = rts51x_get_lun_card(chip, lun);
859 int desc_cnt;
860 int i = 0;
861
862 if (!check_card_ready(chip, lun)) {
863 if (!chip->option.rts51x_mspro_formatter_enable) {
864 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
865 TRACE_RET(chip, TRANSPORT_FAILED);
866 }
867 }
868
869 buf_len = (scsi_bufflen(srb) > 12) ? 0x14 : 12;
870
871 buf = kmalloc(buf_len, GFP_KERNEL);
872 if (buf == NULL)
873 TRACE_RET(chip, TRANSPORT_ERROR);
874
875 buf[i++] = 0;
876 buf[i++] = 0;
877 buf[i++] = 0;
878
879
880 if ((buf_len > 12) && chip->option.rts51x_mspro_formatter_enable &&
881 (chip->lun2card[lun] & MS_CARD) && (!card || (card == MS_CARD))) {
882 buf[i++] = 0x10;
883 desc_cnt = 2;
884 } else {
885 buf[i++] = 0x08;
886 desc_cnt = 1;
887 }
888
889 while (desc_cnt) {
890 if (check_card_ready(chip, lun)) {
891 buf[i++] = (unsigned char)((chip->capacity[lun]) >> 24);
892 buf[i++] = (unsigned char)((chip->capacity[lun]) >> 16);
893 buf[i++] = (unsigned char)((chip->capacity[lun]) >> 8);
894 buf[i++] = (unsigned char)(chip->capacity[lun]);
895
896 if (desc_cnt == 2)
897
898 buf[i++] = 2;
899 else
900 buf[i++] = 0;
901 } else {
902 buf[i++] = 0xFF;
903 buf[i++] = 0xFF;
904 buf[i++] = 0xFF;
905 buf[i++] = 0xFF;
906
907 if (desc_cnt == 2)
908
909 buf[i++] = 3;
910 else
911 buf[i++] = 0;
912 }
913
914 buf[i++] = 0x00;
915 buf[i++] = 0x02;
916 buf[i++] = 0x00;
917
918 desc_cnt--;
919 }
920
921 buf_len = min(scsi_bufflen(srb), buf_len);
922 rts51x_set_xfer_buf(buf, buf_len, srb);
923 kfree(buf);
924
925 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
926
927 return TRANSPORT_GOOD;
928}
929
930static int read_capacity(struct scsi_cmnd *srb, struct rts51x_chip *chip)
931{
932 unsigned char *buf;
933 unsigned int lun = SCSI_LUN(srb);
934
935 if (!check_card_ready(chip, lun)) {
936 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
937 TRACE_RET(chip, TRANSPORT_FAILED);
938 }
939
940 if (!check_lun_mc(chip, lun)) {
941 set_lun_mc(chip, lun);
942 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_CHANGE);
943 return TRANSPORT_FAILED;
944 }
945
946 buf = kmalloc(8, GFP_KERNEL);
947 if (buf == NULL)
948 TRACE_RET(chip, TRANSPORT_ERROR);
949
950 buf[0] = (unsigned char)((chip->capacity[lun] - 1) >> 24);
951 buf[1] = (unsigned char)((chip->capacity[lun] - 1) >> 16);
952 buf[2] = (unsigned char)((chip->capacity[lun] - 1) >> 8);
953 buf[3] = (unsigned char)(chip->capacity[lun] - 1);
954
955 buf[4] = 0x00;
956 buf[5] = 0x00;
957 buf[6] = 0x02;
958 buf[7] = 0x00;
959
960 rts51x_set_xfer_buf(buf, scsi_bufflen(srb), srb);
961 kfree(buf);
962
963 scsi_set_resid(srb, 0);
964
965 return TRANSPORT_GOOD;
966}
967
968static int get_dev_status(struct scsi_cmnd *srb, struct rts51x_chip *chip)
969{
970 unsigned int lun = SCSI_LUN(srb);
971 unsigned int buf_len;
972 u8 status[32] = { 0 };
973
974 rts51x_pp_status(chip, lun, status, 32);
975
976 buf_len = min(scsi_bufflen(srb), (unsigned int)sizeof(status));
977 rts51x_set_xfer_buf(status, buf_len, srb);
978 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
979
980 return TRANSPORT_GOOD;
981}
982
983static int read_status(struct scsi_cmnd *srb, struct rts51x_chip *chip)
984{
985 u8 rts51x_status[16];
986 unsigned int buf_len;
987 unsigned int lun = SCSI_LUN(srb);
988
989 rts51x_read_status(chip, lun, rts51x_status, 16);
990
991 buf_len = min(scsi_bufflen(srb), (unsigned int)sizeof(rts51x_status));
992 rts51x_set_xfer_buf(rts51x_status, buf_len, srb);
993 scsi_set_resid(srb, scsi_bufflen(srb) - buf_len);
994
995 return TRANSPORT_GOOD;
996}
997
998static int read_mem(struct scsi_cmnd *srb, struct rts51x_chip *chip)
999{
1000 unsigned int lun = SCSI_LUN(srb);
1001 unsigned short addr, len, i;
1002 int retval;
1003 u8 *buf;
1004
1005 rts51x_prepare_run(chip);
1006 RTS51X_SET_STAT(chip, STAT_RUN);
1007
1008 addr = ((u16) srb->cmnd[2] << 8) | srb->cmnd[3];
1009 len = ((u16) srb->cmnd[4] << 8) | srb->cmnd[5];
1010
1011 if (addr < 0xe000) {
1012 RTS51X_DEBUGP("filter!addr=0x%x\n", addr);
1013 return TRANSPORT_GOOD;
1014 }
1015
1016 buf = vmalloc(len);
1017 if (!buf)
1018 TRACE_RET(chip, TRANSPORT_ERROR);
1019
1020 for (i = 0; i < len; i++) {
1021 retval = rts51x_ep0_read_register(chip, addr + i, buf + i);
1022 if (retval != STATUS_SUCCESS) {
1023 vfree(buf);
1024 rts51x_set_sense_type(chip, lun,
1025 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1026 TRACE_RET(chip, TRANSPORT_FAILED);
1027 }
1028 }
1029
1030 len = (unsigned short)min(scsi_bufflen(srb), (unsigned int)len);
1031 rts51x_set_xfer_buf(buf, len, srb);
1032 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1033
1034 vfree(buf);
1035
1036 return TRANSPORT_GOOD;
1037}
1038
1039static int write_mem(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1040{
1041 unsigned int lun = SCSI_LUN(srb);
1042 unsigned short addr, len, i;
1043 int retval;
1044 u8 *buf;
1045
1046 rts51x_prepare_run(chip);
1047 RTS51X_SET_STAT(chip, STAT_RUN);
1048
1049 addr = ((u16) srb->cmnd[2] << 8) | srb->cmnd[3];
1050 len = ((u16) srb->cmnd[4] << 8) | srb->cmnd[5];
1051
1052 if (addr < 0xe000) {
1053 RTS51X_DEBUGP("filter!addr=0x%x\n", addr);
1054 return TRANSPORT_GOOD;
1055 }
1056
1057 len = (unsigned short)min(scsi_bufflen(srb), (unsigned int)len);
1058 buf = vmalloc(len);
1059 if (!buf)
1060 TRACE_RET(chip, TRANSPORT_ERROR);
1061
1062 rts51x_get_xfer_buf(buf, len, srb);
1063
1064 for (i = 0; i < len; i++) {
1065 retval =
1066 rts51x_ep0_write_register(chip, addr + i, 0xFF, buf[i]);
1067 if (retval != STATUS_SUCCESS) {
1068 vfree(buf);
1069 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
1070 TRACE_RET(chip, TRANSPORT_FAILED);
1071 }
1072 }
1073
1074 vfree(buf);
1075 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1076
1077 return TRANSPORT_GOOD;
1078}
1079
1080static int get_sd_csd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1081{
1082 struct sd_info *sd_card = &(chip->sd_card);
1083 unsigned int lun = SCSI_LUN(srb);
1084
1085 if (!check_card_ready(chip, lun)) {
1086 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1087 TRACE_RET(chip, TRANSPORT_FAILED);
1088 }
1089
1090 if (rts51x_get_lun_card(chip, lun) != SD_CARD) {
1091 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1092 TRACE_RET(chip, TRANSPORT_FAILED);
1093 }
1094
1095 scsi_set_resid(srb, 0);
1096 rts51x_set_xfer_buf(sd_card->raw_csd, scsi_bufflen(srb), srb);
1097
1098 return TRANSPORT_GOOD;
1099}
1100
1101static int read_phy_register(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1102{
1103 int retval;
1104 u8 addr, len, i;
1105 u8 *buf;
1106
1107 rts51x_prepare_run(chip);
1108 RTS51X_SET_STAT(chip, STAT_RUN);
1109
1110 addr = srb->cmnd[5];
1111 len = srb->cmnd[7];
1112
1113 if (len) {
1114 buf = vmalloc(len);
1115 if (!buf)
1116 TRACE_RET(chip, TRANSPORT_ERROR);
1117
1118 for (i = 0; i < len; i++) {
1119 retval =
1120 rts51x_read_phy_register(chip, addr + i, buf + i);
1121 if (retval != STATUS_SUCCESS) {
1122 vfree(buf);
1123 rts51x_set_sense_type(chip, SCSI_LUN(srb),
1124 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1125 TRACE_RET(chip, TRANSPORT_FAILED);
1126 }
1127 }
1128
1129 len = min(scsi_bufflen(srb), (unsigned int)len);
1130 rts51x_set_xfer_buf(buf, len, srb);
1131 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1132
1133 vfree(buf);
1134 }
1135
1136 return TRANSPORT_GOOD;
1137}
1138
1139static int write_phy_register(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1140{
1141 int retval;
1142 u8 addr, len, i;
1143 u8 *buf;
1144
1145 rts51x_prepare_run(chip);
1146 RTS51X_SET_STAT(chip, STAT_RUN);
1147
1148 addr = srb->cmnd[5];
1149 len = srb->cmnd[7];
1150
1151 if (len) {
1152 len = min(scsi_bufflen(srb), (unsigned int)len);
1153
1154 buf = vmalloc(len);
1155 if (buf == NULL)
1156 TRACE_RET(chip, TRANSPORT_ERROR);
1157
1158 rts51x_get_xfer_buf(buf, len, srb);
1159 scsi_set_resid(srb, scsi_bufflen(srb) - len);
1160
1161 for (i = 0; i < len; i++) {
1162 retval =
1163 rts51x_write_phy_register(chip, addr + i, buf[i]);
1164 if (retval != STATUS_SUCCESS) {
1165 vfree(buf);
1166 rts51x_set_sense_type(chip, SCSI_LUN(srb),
1167 SENSE_TYPE_MEDIA_WRITE_ERR);
1168 TRACE_RET(chip, TRANSPORT_FAILED);
1169 }
1170 }
1171
1172 vfree(buf);
1173 }
1174
1175 return TRANSPORT_GOOD;
1176}
1177
1178static int get_card_bus_width(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1179{
1180 unsigned int lun = SCSI_LUN(srb);
1181 u8 card, bus_width;
1182
1183 if (!check_card_ready(chip, lun)) {
1184 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1185 TRACE_RET(chip, TRANSPORT_FAILED);
1186 }
1187
1188 card = rts51x_get_lun_card(chip, lun);
1189 if ((card == SD_CARD) || (card == MS_CARD)) {
1190 bus_width = chip->card_bus_width[lun];
1191 } else {
1192 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1193 TRACE_RET(chip, TRANSPORT_FAILED);
1194 }
1195
1196 scsi_set_resid(srb, 0);
1197 rts51x_set_xfer_buf(&bus_width, scsi_bufflen(srb), srb);
1198
1199 return TRANSPORT_GOOD;
1200}
1201
1202#ifdef _MSG_TRACE
1203static int trace_msg_cmd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1204{
1205 unsigned char *buf = NULL;
1206 u8 clear;
1207 unsigned int buf_len;
1208
1209 buf_len =
1210 4 +
1211 ((2 + MSG_FUNC_LEN + MSG_FILE_LEN + TIME_VAL_LEN) * TRACE_ITEM_CNT);
1212
1213 if ((scsi_bufflen(srb) < buf_len) || (scsi_sglist(srb) == NULL)) {
1214 rts51x_set_sense_type(chip, SCSI_LUN(srb),
1215 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1216 TRACE_RET(chip, TRANSPORT_FAILED);
1217 }
1218
1219 clear = srb->cmnd[2];
1220
1221 buf = vmalloc(scsi_bufflen(srb));
1222 if (buf == NULL)
1223 TRACE_RET(chip, TRANSPORT_ERROR);
1224
1225 rts51x_trace_msg(chip, buf, clear);
1226
1227 rts51x_set_xfer_buf(buf, scsi_bufflen(srb), srb);
1228 vfree(buf);
1229
1230 scsi_set_resid(srb, 0);
1231 return TRANSPORT_GOOD;
1232}
1233#endif
1234
1235static int rw_mem_cmd_buf(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1236{
1237 int retval = STATUS_SUCCESS;
1238 unsigned int lun = SCSI_LUN(srb);
1239 u8 cmd_type, mask, value, idx, mode, len;
1240 u16 addr;
1241 u32 timeout;
1242
1243 rts51x_prepare_run(chip);
1244 RTS51X_SET_STAT(chip, STAT_RUN);
1245
1246 switch (srb->cmnd[3]) {
1247 case INIT_BATCHCMD:
1248 rts51x_init_cmd(chip);
1249 break;
1250
1251 case ADD_BATCHCMD:
1252 cmd_type = srb->cmnd[4];
1253 if (cmd_type > 2) {
1254 rts51x_set_sense_type(chip, lun,
1255 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1256 TRACE_RET(chip, TRANSPORT_FAILED);
1257 }
1258 addr = (srb->cmnd[5] << 8) | srb->cmnd[6];
1259 mask = srb->cmnd[7];
1260 value = srb->cmnd[8];
1261 rts51x_add_cmd(chip, cmd_type, addr, mask, value);
1262 break;
1263
1264 case SEND_BATCHCMD:
1265 mode = srb->cmnd[4];
1266 len = srb->cmnd[5];
1267 timeout =
1268 ((u32) srb->cmnd[6] << 24) | ((u32) srb->
1269 cmnd[7] << 16) | ((u32) srb->
1270 cmnd[8] <<
1271 8) | ((u32)
1272 srb->
1273 cmnd
1274 [9]);
1275 retval = rts51x_send_cmd(chip, mode, 1000);
1276 if (retval != STATUS_SUCCESS) {
1277 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
1278 TRACE_RET(chip, TRANSPORT_FAILED);
1279 }
1280 if (mode & STAGE_R) {
1281 retval = rts51x_get_rsp(chip, len, timeout);
1282 if (retval != STATUS_SUCCESS) {
1283 rts51x_set_sense_type(chip, lun,
1284 SENSE_TYPE_MEDIA_UNRECOVER_READ_ERR);
1285 TRACE_RET(chip, TRANSPORT_FAILED);
1286 }
1287 }
1288 break;
1289
1290 case GET_BATCHRSP:
1291 idx = srb->cmnd[4];
1292 value = chip->rsp_buf[idx];
1293 if (scsi_bufflen(srb) < 1) {
1294 rts51x_set_sense_type(chip, lun,
1295 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1296 TRACE_RET(chip, TRANSPORT_FAILED);
1297 }
1298 rts51x_set_xfer_buf(&value, 1, srb);
1299 scsi_set_resid(srb, 0);
1300 break;
1301
1302 default:
1303 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1304 TRACE_RET(chip, TRANSPORT_FAILED);
1305 }
1306
1307 if (retval != STATUS_SUCCESS) {
1308 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_ERR);
1309 TRACE_RET(chip, TRANSPORT_FAILED);
1310 }
1311
1312 return TRANSPORT_GOOD;
1313}
1314
1315static int suit_cmd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1316{
1317 int result;
1318
1319 switch (srb->cmnd[3]) {
1320 case INIT_BATCHCMD:
1321 case ADD_BATCHCMD:
1322 case SEND_BATCHCMD:
1323 case GET_BATCHRSP:
1324 result = rw_mem_cmd_buf(srb, chip);
1325 break;
1326 default:
1327 result = TRANSPORT_ERROR;
1328 }
1329
1330 return result;
1331}
1332
1333static int app_cmd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1334{
1335 int result;
1336
1337 switch (srb->cmnd[2]) {
1338 case PP_READ10:
1339 case PP_WRITE10:
1340 result = read_write(srb, chip);
1341 break;
1342
1343 case SUIT_CMD:
1344 result = suit_cmd(srb, chip);
1345 break;
1346
1347 case READ_PHY:
1348 result = read_phy_register(srb, chip);
1349 break;
1350
1351 case WRITE_PHY:
1352 result = write_phy_register(srb, chip);
1353 break;
1354
1355 case GET_DEV_STATUS:
1356 result = get_dev_status(srb, chip);
1357 break;
1358
1359 default:
1360 rts51x_set_sense_type(chip, SCSI_LUN(srb),
1361 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1362 TRACE_RET(chip, TRANSPORT_FAILED);
1363 }
1364
1365 return result;
1366}
1367
1368static int vendor_cmnd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1369{
1370 int result = TRANSPORT_GOOD;
1371
1372 switch (srb->cmnd[1]) {
1373 case READ_STATUS:
1374 result = read_status(srb, chip);
1375 break;
1376
1377 case READ_MEM:
1378 result = read_mem(srb, chip);
1379 break;
1380
1381 case WRITE_MEM:
1382 result = write_mem(srb, chip);
1383 break;
1384
1385 case GET_BUS_WIDTH:
1386 result = get_card_bus_width(srb, chip);
1387 break;
1388
1389 case GET_SD_CSD:
1390 result = get_sd_csd(srb, chip);
1391 break;
1392
1393#ifdef _MSG_TRACE
1394 case TRACE_MSG:
1395 result = trace_msg_cmd(srb, chip);
1396 break;
1397#endif
1398
1399 case SCSI_APP_CMD:
1400 result = app_cmd(srb, chip);
1401 break;
1402
1403 default:
1404 rts51x_set_sense_type(chip, SCSI_LUN(srb),
1405 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1406 TRACE_RET(chip, TRANSPORT_FAILED);
1407 }
1408
1409 return result;
1410}
1411
1412static int ms_format_cmnd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1413{
1414 struct ms_info *ms_card = &(chip->ms_card);
1415 unsigned int lun = SCSI_LUN(srb);
1416 int retval, quick_format;
1417
1418 if (rts51x_get_lun_card(chip, lun) != MS_CARD) {
1419 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
1420 TRACE_RET(chip, TRANSPORT_FAILED);
1421 }
1422
1423 if ((srb->cmnd[3] != 0x4D) || (srb->cmnd[4] != 0x47)
1424 || (srb->cmnd[5] != 0x66) || (srb->cmnd[6] != 0x6D)
1425 || (srb->cmnd[7] != 0x74)) {
1426 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1427 TRACE_RET(chip, TRANSPORT_FAILED);
1428 }
1429
1430 if (srb->cmnd[8] & 0x01)
1431 quick_format = 0;
1432 else
1433 quick_format = 1;
1434
1435 if (!(chip->card_ready & MS_CARD)) {
1436 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1437 TRACE_RET(chip, TRANSPORT_FAILED);
1438 }
1439
1440 if (chip->card_wp & MS_CARD) {
1441 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
1442 TRACE_RET(chip, TRANSPORT_FAILED);
1443 }
1444
1445 if (!CHK_MSPRO(ms_card)) {
1446 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
1447 TRACE_RET(chip, TRANSPORT_FAILED);
1448 }
1449
1450 rts51x_prepare_run(chip);
1451 RTS51X_SET_STAT(chip, STAT_RUN);
1452
1453 retval = rts51x_mspro_format(srb, chip, MS_SHORT_DATA_LEN, quick_format);
1454 if (retval != STATUS_SUCCESS) {
1455 rts51x_set_sense_type(chip, lun, SENSE_TYPE_FORMAT_CMD_FAILED);
1456 TRACE_RET(chip, TRANSPORT_FAILED);
1457 }
1458
1459 scsi_set_resid(srb, 0);
1460 return TRANSPORT_GOOD;
1461}
1462
1463#ifdef SUPPORT_PCGL_1P18
1464static int get_ms_information(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1465{
1466 struct ms_info *ms_card = &(chip->ms_card);
1467 unsigned int lun = SCSI_LUN(srb);
1468 u8 dev_info_id, data_len;
1469 u8 *buf;
1470 unsigned int buf_len;
1471 int i;
1472
1473 if (!check_card_ready(chip, lun)) {
1474 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1475 TRACE_RET(chip, TRANSPORT_FAILED);
1476 }
1477 if ((rts51x_get_lun_card(chip, lun) != MS_CARD)) {
1478 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
1479 TRACE_RET(chip, TRANSPORT_FAILED);
1480 }
1481
1482 if ((srb->cmnd[2] != 0xB0) || (srb->cmnd[4] != 0x4D) ||
1483 (srb->cmnd[5] != 0x53) || (srb->cmnd[6] != 0x49) ||
1484 (srb->cmnd[7] != 0x44)) {
1485 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1486 TRACE_RET(chip, TRANSPORT_FAILED);
1487 }
1488
1489 dev_info_id = srb->cmnd[3];
1490 if ((CHK_MSXC(ms_card) && (dev_info_id == 0x10)) ||
1491 (!CHK_MSXC(ms_card) && (dev_info_id == 0x13)) ||
1492 !CHK_MSPRO(ms_card)) {
1493 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1494 TRACE_RET(chip, TRANSPORT_FAILED);
1495 }
1496
1497 if (dev_info_id == 0x15)
1498 buf_len = data_len = 0x3A;
1499 else
1500 buf_len = data_len = 0x6A;
1501
1502 buf = kmalloc(buf_len, GFP_KERNEL);
1503 if (!buf)
1504 TRACE_RET(chip, TRANSPORT_ERROR);
1505
1506 i = 0;
1507
1508 buf[i++] = 0x00;
1509 buf[i++] = data_len;
1510
1511 if (CHK_MSXC(ms_card))
1512 buf[i++] = 0x03;
1513 else
1514 buf[i++] = 0x02;
1515
1516 buf[i++] = 0x01;
1517
1518 buf[i++] = 0x00;
1519 buf[i++] = 0x00;
1520 buf[i++] = 0x00;
1521
1522 buf[i++] = 0x01;
1523
1524
1525
1526 buf[i++] = dev_info_id;
1527
1528 if (dev_info_id == 0x15)
1529 data_len = 0x31;
1530 else
1531 data_len = 0x61;
1532 buf[i++] = 0x00;
1533 buf[i++] = data_len;
1534
1535 buf[i++] = 0x80;
1536 if ((dev_info_id == 0x10) || (dev_info_id == 0x13)) {
1537
1538 memcpy(buf + i, ms_card->raw_sys_info, 96);
1539 } else {
1540
1541 memcpy(buf + i, ms_card->raw_model_name, 48);
1542 }
1543
1544 rts51x_set_xfer_buf(buf, buf_len, srb);
1545
1546 if (dev_info_id == 0x15)
1547 scsi_set_resid(srb, scsi_bufflen(srb) - 0x3C);
1548 else
1549 scsi_set_resid(srb, scsi_bufflen(srb) - 0x6C);
1550
1551 kfree(buf);
1552 return STATUS_SUCCESS;
1553}
1554#endif
1555
1556static int ms_sp_cmnd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1557{
1558 int retval = TRANSPORT_ERROR;
1559
1560 if (srb->cmnd[2] == MS_FORMAT)
1561 retval = ms_format_cmnd(srb, chip);
1562#ifdef SUPPORT_PCGL_1P18
1563 else if (srb->cmnd[2] == GET_MS_INFORMATION)
1564 retval = get_ms_information(srb, chip);
1565#endif
1566
1567 return retval;
1568}
1569
1570#ifdef SUPPORT_CPRM
1571static int sd_extention_cmnd(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1572{
1573 unsigned int lun = SCSI_LUN(srb);
1574 int result;
1575
1576 rts51x_prepare_run(chip);
1577 RTS51X_SET_STAT(chip, STAT_RUN);
1578
1579 rts51x_sd_cleanup_work(chip);
1580
1581 if (!check_card_ready(chip, lun)) {
1582 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1583 TRACE_RET(chip, TRANSPORT_FAILED);
1584 }
1585 if ((rts51x_get_lun_card(chip, lun) != SD_CARD)) {
1586 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
1587 TRACE_RET(chip, TRANSPORT_FAILED);
1588 }
1589
1590 switch (srb->cmnd[0]) {
1591 case SD_PASS_THRU_MODE:
1592 result = rts51x_sd_pass_thru_mode(srb, chip);
1593 break;
1594
1595 case SD_EXECUTE_NO_DATA:
1596 result = rts51x_sd_execute_no_data(srb, chip);
1597 break;
1598
1599 case SD_EXECUTE_READ:
1600 result = rts51x_sd_execute_read_data(srb, chip);
1601 break;
1602
1603 case SD_EXECUTE_WRITE:
1604 result = rts51x_sd_execute_write_data(srb, chip);
1605 break;
1606
1607 case SD_GET_RSP:
1608 result = rts51x_sd_get_cmd_rsp(srb, chip);
1609 break;
1610
1611 case SD_HW_RST:
1612 result = rts51x_sd_hw_rst(srb, chip);
1613 break;
1614
1615 default:
1616 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1617 TRACE_RET(chip, TRANSPORT_FAILED);
1618 }
1619
1620 return result;
1621}
1622#endif
1623
1624#ifdef SUPPORT_MAGIC_GATE
1625static int mg_report_key(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1626{
1627 struct ms_info *ms_card = &(chip->ms_card);
1628 unsigned int lun = SCSI_LUN(srb);
1629 int retval;
1630 u8 key_format;
1631
1632 rts51x_prepare_run(chip);
1633 RTS51X_SET_STAT(chip, STAT_RUN);
1634
1635 rts51x_ms_cleanup_work(chip);
1636
1637 if (!check_card_ready(chip, lun)) {
1638 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1639 TRACE_RET(chip, TRANSPORT_FAILED);
1640 }
1641 if ((rts51x_get_lun_card(chip, lun) != MS_CARD)) {
1642 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
1643 TRACE_RET(chip, TRANSPORT_FAILED);
1644 }
1645
1646 if (srb->cmnd[7] != KC_MG_R_PRO) {
1647 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1648 TRACE_RET(chip, TRANSPORT_FAILED);
1649 }
1650
1651 if (!CHK_MSPRO(ms_card)) {
1652 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
1653 TRACE_RET(chip, TRANSPORT_FAILED);
1654 }
1655
1656 key_format = srb->cmnd[10] & 0x3F;
1657
1658 switch (key_format) {
1659 case KF_GET_LOC_EKB:
1660 if ((scsi_bufflen(srb) == 0x41C) &&
1661 (srb->cmnd[8] == 0x04) && (srb->cmnd[9] == 0x1C)) {
1662 retval = rts51x_mg_get_local_EKB(srb, chip);
1663 if (retval != STATUS_SUCCESS)
1664 TRACE_RET(chip, TRANSPORT_FAILED);
1665 } else {
1666 rts51x_set_sense_type(chip, lun,
1667 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1668 TRACE_RET(chip, TRANSPORT_FAILED);
1669 }
1670 break;
1671
1672 case KF_RSP_CHG:
1673 if ((scsi_bufflen(srb) == 0x24) &&
1674 (srb->cmnd[8] == 0x00) && (srb->cmnd[9] == 0x24)) {
1675 retval = rts51x_mg_get_rsp_chg(srb, chip);
1676 if (retval != STATUS_SUCCESS)
1677 TRACE_RET(chip, TRANSPORT_FAILED);
1678 } else {
1679 rts51x_set_sense_type(chip, lun,
1680 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1681 TRACE_RET(chip, TRANSPORT_FAILED);
1682 }
1683 break;
1684
1685 case KF_GET_ICV:
1686 ms_card->mg_entry_num = srb->cmnd[5];
1687 if ((scsi_bufflen(srb) == 0x404) &&
1688 (srb->cmnd[8] == 0x04) &&
1689 (srb->cmnd[9] == 0x04) &&
1690 (srb->cmnd[2] == 0x00) &&
1691 (srb->cmnd[3] == 0x00) &&
1692 (srb->cmnd[4] == 0x00) && (srb->cmnd[5] < 32)) {
1693 retval = rts51x_mg_get_ICV(srb, chip);
1694 if (retval != STATUS_SUCCESS)
1695 TRACE_RET(chip, TRANSPORT_FAILED);
1696 } else {
1697 rts51x_set_sense_type(chip, lun,
1698 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1699 TRACE_RET(chip, TRANSPORT_FAILED);
1700 }
1701 break;
1702
1703 default:
1704 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1705 TRACE_RET(chip, TRANSPORT_FAILED);
1706 }
1707
1708 scsi_set_resid(srb, 0);
1709 return TRANSPORT_GOOD;
1710}
1711
1712static int mg_send_key(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1713{
1714 struct ms_info *ms_card = &(chip->ms_card);
1715 unsigned int lun = SCSI_LUN(srb);
1716 int retval;
1717 u8 key_format;
1718
1719 rts51x_prepare_run(chip);
1720 RTS51X_SET_STAT(chip, STAT_RUN);
1721
1722 rts51x_ms_cleanup_work(chip);
1723
1724 if (!check_card_ready(chip, lun)) {
1725 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_NOT_PRESENT);
1726 TRACE_RET(chip, TRANSPORT_FAILED);
1727 }
1728 if (check_card_wp(chip, lun)) {
1729 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_WRITE_PROTECT);
1730 TRACE_RET(chip, TRANSPORT_FAILED);
1731 }
1732 if ((rts51x_get_lun_card(chip, lun) != MS_CARD)) {
1733 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_LUN_NOT_SUPPORT);
1734 TRACE_RET(chip, TRANSPORT_FAILED);
1735 }
1736
1737 if (srb->cmnd[7] != KC_MG_R_PRO) {
1738 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1739 TRACE_RET(chip, TRANSPORT_FAILED);
1740 }
1741
1742 if (!CHK_MSPRO(ms_card)) {
1743 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MG_INCOMPATIBLE_MEDIUM);
1744 TRACE_RET(chip, TRANSPORT_FAILED);
1745 }
1746
1747 key_format = srb->cmnd[10] & 0x3F;
1748
1749 switch (key_format) {
1750 case KF_SET_LEAF_ID:
1751 if ((scsi_bufflen(srb) == 0x0C) &&
1752 (srb->cmnd[8] == 0x00) && (srb->cmnd[9] == 0x0C)) {
1753 retval = rts51x_mg_set_leaf_id(srb, chip);
1754 if (retval != STATUS_SUCCESS)
1755 TRACE_RET(chip, TRANSPORT_FAILED);
1756 } else {
1757 rts51x_set_sense_type(chip, lun,
1758 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1759 TRACE_RET(chip, TRANSPORT_FAILED);
1760 }
1761 break;
1762
1763 case KF_CHG_HOST:
1764 if ((scsi_bufflen(srb) == 0x0C) &&
1765 (srb->cmnd[8] == 0x00) && (srb->cmnd[9] == 0x0C)) {
1766 retval = rts51x_mg_chg(srb, chip);
1767 if (retval != STATUS_SUCCESS)
1768 TRACE_RET(chip, TRANSPORT_FAILED);
1769 } else {
1770 rts51x_set_sense_type(chip, lun,
1771 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1772 TRACE_RET(chip, TRANSPORT_FAILED);
1773 }
1774 break;
1775
1776 case KF_RSP_HOST:
1777 if ((scsi_bufflen(srb) == 0x0C) &&
1778 (srb->cmnd[8] == 0x00) && (srb->cmnd[9] == 0x0C)) {
1779 retval = rts51x_mg_rsp(srb, chip);
1780 if (retval != STATUS_SUCCESS)
1781 TRACE_RET(chip, TRANSPORT_FAILED);
1782 } else {
1783 rts51x_set_sense_type(chip, lun,
1784 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1785 TRACE_RET(chip, TRANSPORT_FAILED);
1786 }
1787 break;
1788
1789 case KF_SET_ICV:
1790 ms_card->mg_entry_num = srb->cmnd[5];
1791 if ((scsi_bufflen(srb) == 0x404) &&
1792 (srb->cmnd[8] == 0x04) &&
1793 (srb->cmnd[9] == 0x04) &&
1794 (srb->cmnd[2] == 0x00) &&
1795 (srb->cmnd[3] == 0x00) &&
1796 (srb->cmnd[4] == 0x00) && (srb->cmnd[5] < 32)) {
1797 retval = rts51x_mg_set_ICV(srb, chip);
1798 if (retval != STATUS_SUCCESS)
1799 TRACE_RET(chip, TRANSPORT_FAILED);
1800 } else {
1801 rts51x_set_sense_type(chip, lun,
1802 SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1803 TRACE_RET(chip, TRANSPORT_FAILED);
1804 }
1805 break;
1806
1807 default:
1808 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1809 TRACE_RET(chip, TRANSPORT_FAILED);
1810 }
1811
1812 scsi_set_resid(srb, 0);
1813 return TRANSPORT_GOOD;
1814}
1815#endif
1816
1817int rts51x_scsi_handler(struct scsi_cmnd *srb, struct rts51x_chip *chip)
1818{
1819 struct ms_info *ms_card = &(chip->ms_card);
1820 unsigned int lun = SCSI_LUN(srb);
1821 int result = TRANSPORT_GOOD;
1822
1823 if ((rts51x_get_lun_card(chip, lun) == MS_CARD) &&
1824 (ms_card->format_status == FORMAT_IN_PROGRESS)) {
1825 if ((srb->cmnd[0] != REQUEST_SENSE)
1826 && (srb->cmnd[0] != INQUIRY)) {
1827
1828 rts51x_set_sense_data(chip, lun, CUR_ERR, 0x02, 0, 0x04, 0x04,
1829 0, (u16) (ms_card->progress));
1830 TRACE_RET(chip, TRANSPORT_FAILED);
1831 }
1832 }
1833
1834 switch (srb->cmnd[0]) {
1835 case READ_10:
1836 case WRITE_10:
1837 case READ_6:
1838 case WRITE_6:
1839 result = read_write(srb, chip);
1840 break;
1841
1842 case TEST_UNIT_READY:
1843 result = test_unit_ready(srb, chip);
1844 break;
1845
1846 case INQUIRY:
1847 result = inquiry(srb, chip);
1848 break;
1849
1850 case READ_CAPACITY:
1851 result = read_capacity(srb, chip);
1852 break;
1853
1854 case START_STOP:
1855 result = start_stop_unit(srb, chip);
1856 break;
1857
1858 case ALLOW_MEDIUM_REMOVAL:
1859 result = allow_medium_removal(srb, chip);
1860 break;
1861
1862 case REQUEST_SENSE:
1863 result = request_sense(srb, chip);
1864 break;
1865
1866 case MODE_SENSE:
1867 case MODE_SENSE_10:
1868 result = mode_sense(srb, chip);
1869 break;
1870
1871 case 0x23:
1872 result = read_format_capacity(srb, chip);
1873 break;
1874
1875 case VENDOR_CMND:
1876 result = vendor_cmnd(srb, chip);
1877 break;
1878
1879 case MS_SP_CMND:
1880 result = ms_sp_cmnd(srb, chip);
1881 break;
1882
1883#ifdef SUPPORT_CPRM
1884 case SD_PASS_THRU_MODE:
1885 case SD_EXECUTE_NO_DATA:
1886 case SD_EXECUTE_READ:
1887 case SD_EXECUTE_WRITE:
1888 case SD_GET_RSP:
1889 case SD_HW_RST:
1890 result = sd_extention_cmnd(srb, chip);
1891 break;
1892#endif
1893
1894#ifdef SUPPORT_MAGIC_GATE
1895 case CMD_MSPRO_MG_RKEY:
1896 result = mg_report_key(srb, chip);
1897 break;
1898
1899 case CMD_MSPRO_MG_SKEY:
1900 result = mg_send_key(srb, chip);
1901 break;
1902#endif
1903
1904 case FORMAT_UNIT:
1905 case MODE_SELECT:
1906 case VERIFY:
1907 result = TRANSPORT_GOOD;
1908 break;
1909
1910 default:
1911 rts51x_set_sense_type(chip, lun, SENSE_TYPE_MEDIA_INVALID_CMD_FIELD);
1912 result = TRANSPORT_FAILED;
1913 }
1914
1915 return result;
1916}
1917
1918
1919
1920
1921
1922int slave_alloc(struct scsi_device *sdev)
1923{
1924
1925
1926
1927
1928
1929 sdev->inquiry_len = 36;
1930 return 0;
1931}
1932
1933int slave_configure(struct scsi_device *sdev)
1934{
1935
1936
1937
1938
1939
1940
1941
1942
1943 blk_queue_dma_alignment(sdev->request_queue, (512 - 1));
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959 if (sdev->scsi_level < SCSI_2)
1960 sdev->scsi_level = sdev->sdev_target->scsi_level = SCSI_2;
1961
1962 return 0;
1963}
1964
1965
1966
1967
1968
1969
1970#undef SPRINTF
1971#define SPRINTF(args...) seq_printf(m, ##args)
1972
1973static int write_info(struct Scsi_Host *host, char *buffer, int length)
1974{
1975
1976 return length;
1977}
1978
1979static int show_info(struct seq_file *m, struct Scsi_Host *host)
1980{
1981
1982 SPRINTF(" Host scsi%d: %s\n", host->host_no, RTS51X_NAME);
1983
1984
1985 SPRINTF(" Vendor: Realtek Corp.\n");
1986 SPRINTF(" Product: RTS51xx USB Card Reader\n");
1987 SPRINTF(" Version: %s\n", DRIVER_VERSION);
1988 SPRINTF(" Build: %s\n", __TIME__);
1989 return 0;
1990}
1991
1992
1993
1994int queuecommand_lck(struct scsi_cmnd *srb, void (*done) (struct scsi_cmnd *))
1995{
1996 struct rts51x_chip *chip = host_to_rts51x(srb->device->host);
1997
1998
1999 if (chip->srb != NULL) {
2000 RTS51X_DEBUGP("Error in %s: chip->srb = %p\n",
2001 __func__, chip->srb);
2002 return SCSI_MLQUEUE_HOST_BUSY;
2003 }
2004
2005
2006 if (test_bit(FLIDX_DISCONNECTING, &chip->usb->dflags)) {
2007 RTS51X_DEBUGP("Fail command during disconnect\n");
2008 srb->result = DID_NO_CONNECT << 16;
2009 done(srb);
2010 return 0;
2011 }
2012
2013
2014 srb->scsi_done = done;
2015 chip->srb = srb;
2016 complete(&chip->usb->cmnd_ready);
2017
2018 return 0;
2019}
2020
2021DEF_SCSI_QCMD(queuecommand)
2022
2023
2024
2025
2026int command_abort(struct scsi_cmnd *srb)
2027{
2028 struct rts51x_chip *chip = host_to_rts51x(srb->device->host);
2029
2030 RTS51X_DEBUGP("%s called\n", __func__);
2031
2032
2033
2034 scsi_lock(rts51x_to_host(chip));
2035
2036
2037 if (chip->srb != srb) {
2038 scsi_unlock(rts51x_to_host(chip));
2039 RTS51X_DEBUGP("-- nothing to abort\n");
2040 return FAILED;
2041 }
2042
2043
2044
2045
2046
2047
2048 set_bit(FLIDX_TIMED_OUT, &chip->usb->dflags);
2049 if (!test_bit(FLIDX_RESETTING, &chip->usb->dflags)) {
2050 set_bit(FLIDX_ABORTING, &chip->usb->dflags);
2051
2052 }
2053 scsi_unlock(rts51x_to_host(chip));
2054
2055
2056 wait_for_completion(&chip->usb->notify);
2057 return SUCCESS;
2058}
2059
2060
2061
2062static int device_reset(struct scsi_cmnd *srb)
2063{
2064 int result = 0;
2065
2066 RTS51X_DEBUGP("%s called\n", __func__);
2067
2068 return result < 0 ? FAILED : SUCCESS;
2069}
2070
2071
2072int bus_reset(struct scsi_cmnd *srb)
2073{
2074 int result = 0;
2075
2076 RTS51X_DEBUGP("%s called\n", __func__);
2077
2078 return result < 0 ? FAILED : SUCCESS;
2079}
2080
2081static const char *rts5139_info(struct Scsi_Host *host)
2082{
2083 return "SCSI emulation for RTS5139 USB card reader";
2084}
2085
2086struct scsi_host_template rts51x_host_template = {
2087
2088 .name = RTS51X_NAME,
2089 .proc_name = RTS51X_NAME,
2090 .show_info = show_info,
2091 .write_info = write_info,
2092 .info = rts5139_info,
2093
2094
2095 .queuecommand = queuecommand,
2096
2097
2098 .eh_abort_handler = command_abort,
2099 .eh_device_reset_handler = device_reset,
2100 .eh_bus_reset_handler = bus_reset,
2101
2102
2103 .can_queue = 1,
2104 .cmd_per_lun = 1,
2105
2106
2107 .this_id = -1,
2108
2109 .slave_alloc = slave_alloc,
2110 .slave_configure = slave_configure,
2111
2112
2113 .sg_tablesize = SG_ALL,
2114
2115
2116 .max_sectors = 240,
2117
2118
2119
2120
2121
2122 .use_clustering = 1,
2123
2124
2125 .emulated = 1,
2126
2127
2128 .skip_settle_delay = 1,
2129
2130
2131
2132
2133
2134 .module = THIS_MODULE
2135};
2136
2137