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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152#include <linux/major.h>
153
154#include <linux/module.h>
155
156#include <linux/errno.h>
157#include <linux/signal.h>
158#include <linux/sched.h>
159#include <linux/timer.h>
160#include <linux/fs.h>
161#include <linux/kernel.h>
162#include <linux/hdreg.h>
163#include <linux/genhd.h>
164#include <linux/ioport.h>
165#include <linux/devfs_fs_kernel.h>
166#include <linux/string.h>
167#include <linux/slab.h>
168#include <linux/init.h>
169#include <linux/interrupt.h>
170
171#include <asm/system.h>
172#include <asm/io.h>
173#include <asm/uaccess.h>
174#include <asm/dma.h>
175
176#include <linux/cdrom.h>
177#include "cdu31a.h"
178
179#define MAJOR_NR CDU31A_CDROM_MAJOR
180#include <linux/blk.h>
181
182#define CDU31A_READAHEAD 4
183#define CDU31A_MAX_CONSECUTIVE_ATTENTIONS 10
184
185#define DEBUG 0
186
187
188#undef SONY_POLL_EACH_BYTE
189
190
191
192
193
194
195static struct {
196 unsigned short base;
197 short int_num;
198
199} cdu31a_addresses[] __initdata = {
200 {0}
201};
202
203static int handle_sony_cd_attention(void);
204static int read_subcode(void);
205static void sony_get_toc(void);
206static int scd_spinup(void);
207
208static int scd_open(struct cdrom_device_info *, int);
209static void do_sony_cd_cmd(unsigned char cmd,
210 unsigned char *params,
211 unsigned int num_params,
212 unsigned char *result_buffer,
213 unsigned int *result_size);
214static void size_to_buf(unsigned int size, unsigned char *buf);
215
216
217static unsigned int sony_next_block;
218static unsigned int sony_blocks_left = 0;
219
220
221
222
223
224static unsigned int cdu31a_port = 0;
225MODULE_PARM(cdu31a_port, "i");
226
227
228
229
230
231static volatile unsigned short sony_cd_cmd_reg;
232static volatile unsigned short sony_cd_param_reg;
233static volatile unsigned short sony_cd_write_reg;
234static volatile unsigned short sony_cd_control_reg;
235static volatile unsigned short sony_cd_status_reg;
236static volatile unsigned short sony_cd_result_reg;
237static volatile unsigned short sony_cd_read_reg;
238static volatile unsigned short sony_cd_fifost_reg;
239
240
241static int sony_spun_up = 0;
242
243static int sony_speed = 0;
244
245static int sony_xa_mode = 0;
246
247
248static int sony_raw_data_mode = 1;
249
250
251static unsigned int sony_usage = 0;
252
253
254static int sony_pas_init = 0;
255
256
257static struct s_sony_session_toc single_toc;
258
259
260
261static struct s_all_sessions_toc sony_toc;
262
263
264static int sony_toc_read = 0;
265
266
267static struct s_sony_subcode last_sony_subcode;
268
269
270static volatile int sony_inuse = 0;
271
272
273static DECLARE_WAIT_QUEUE_HEAD(sony_wait);
274
275static struct task_struct *has_cd_task = NULL;
276
277
278
279static int is_double_speed = 0;
280static int is_a_cdu31a = 1;
281
282static int is_auto_eject = 1;
283
284
285
286
287
288static volatile int sony_audio_status = CDROM_AUDIO_NO_STATUS;
289
290
291
292
293
294
295
296
297static unsigned volatile char cur_pos_msf[3] = { 0, 0, 0 };
298static unsigned volatile char final_pos_msf[3] = { 0, 0, 0 };
299
300
301static int cdu31a_irq = 0;
302MODULE_PARM(cdu31a_irq, "i");
303
304
305
306DECLARE_WAIT_QUEUE_HEAD(cdu31a_irq_wait);
307
308static int curr_control_reg = 0;
309
310
311
312
313static char disk_changed;
314
315
316
317
318static char readahead_buffer[CD_FRAMESIZE_RAW];
319static int readahead_dataleft = 0;
320static int readahead_bad = 0;
321
322
323
324
325static struct timer_list cdu31a_abort_timer;
326
327
328
329
330static int abort_read_started = 0;
331
332
333
334
335
336
337static int scd_disk_change(kdev_t full_dev)
338{
339 int retval;
340
341 retval = disk_changed;
342 disk_changed = 0;
343
344 return retval;
345}
346
347
348
349
350
351static int scd_media_changed(struct cdrom_device_info *cdi, int disc_nr)
352{
353 return scd_disk_change(cdi->dev);
354}
355
356
357
358
359
360static int scd_drive_status(struct cdrom_device_info *cdi, int slot_nr)
361{
362 if (CDSL_CURRENT != slot_nr) {
363
364 return -EINVAL;
365 }
366 if (scd_spinup() == 0) {
367 sony_spun_up = 1;
368 }
369 return sony_spun_up ? CDS_DISC_OK : CDS_DRIVE_NOT_READY;
370}
371
372static inline void enable_interrupts(void)
373{
374 curr_control_reg |= (SONY_ATTN_INT_EN_BIT
375 | SONY_RES_RDY_INT_EN_BIT
376 | SONY_DATA_RDY_INT_EN_BIT);
377 outb(curr_control_reg, sony_cd_control_reg);
378}
379
380static inline void disable_interrupts(void)
381{
382 curr_control_reg &= ~(SONY_ATTN_INT_EN_BIT
383 | SONY_RES_RDY_INT_EN_BIT
384 | SONY_DATA_RDY_INT_EN_BIT);
385 outb(curr_control_reg, sony_cd_control_reg);
386}
387
388
389
390
391
392static inline void sony_sleep(void)
393{
394 unsigned long flags;
395
396 if (cdu31a_irq <= 0) {
397 current->state = TASK_INTERRUPTIBLE;
398 schedule_timeout(0);
399 } else {
400
401 save_flags(flags);
402 cli();
403 enable_interrupts();
404 interruptible_sleep_on(&cdu31a_irq_wait);
405 restore_flags(flags);
406 }
407}
408
409
410
411
412
413
414static inline int is_attention(void)
415{
416 return ((inb(sony_cd_status_reg) & SONY_ATTN_BIT) != 0);
417}
418
419static inline int is_busy(void)
420{
421 return ((inb(sony_cd_status_reg) & SONY_BUSY_BIT) != 0);
422}
423
424static inline int is_data_ready(void)
425{
426 return ((inb(sony_cd_status_reg) & SONY_DATA_RDY_BIT) != 0);
427}
428
429static inline int is_data_requested(void)
430{
431 return ((inb(sony_cd_status_reg) & SONY_DATA_REQUEST_BIT) != 0);
432}
433
434static inline int is_result_ready(void)
435{
436 return ((inb(sony_cd_status_reg) & SONY_RES_RDY_BIT) != 0);
437}
438
439static inline int is_param_write_rdy(void)
440{
441 return ((inb(sony_cd_fifost_reg) & SONY_PARAM_WRITE_RDY_BIT) != 0);
442}
443
444static inline int is_result_reg_not_empty(void)
445{
446 return ((inb(sony_cd_fifost_reg) & SONY_RES_REG_NOT_EMP_BIT) != 0);
447}
448
449static inline void reset_drive(void)
450{
451 curr_control_reg = 0;
452 readahead_dataleft = 0;
453 sony_toc_read = 0;
454 outb(SONY_DRIVE_RESET_BIT, sony_cd_control_reg);
455}
456
457
458
459
460
461static int scd_reset(struct cdrom_device_info *cdi)
462{
463 int retry_count;
464
465 reset_drive();
466
467 retry_count = jiffies + SONY_RESET_TIMEOUT;
468 while (time_before(jiffies, retry_count) && (!is_attention())) {
469 sony_sleep();
470 }
471
472 return 0;
473}
474
475static inline void clear_attention(void)
476{
477 outb(curr_control_reg | SONY_ATTN_CLR_BIT, sony_cd_control_reg);
478}
479
480static inline void clear_result_ready(void)
481{
482 outb(curr_control_reg | SONY_RES_RDY_CLR_BIT, sony_cd_control_reg);
483}
484
485static inline void clear_data_ready(void)
486{
487 outb(curr_control_reg | SONY_DATA_RDY_CLR_BIT,
488 sony_cd_control_reg);
489}
490
491static inline void clear_param_reg(void)
492{
493 outb(curr_control_reg | SONY_PARAM_CLR_BIT, sony_cd_control_reg);
494}
495
496static inline unsigned char read_status_register(void)
497{
498 return (inb(sony_cd_status_reg));
499}
500
501static inline unsigned char read_result_register(void)
502{
503 return (inb(sony_cd_result_reg));
504}
505
506static inline unsigned char read_data_register(void)
507{
508 return (inb(sony_cd_read_reg));
509}
510
511static inline void write_param(unsigned char param)
512{
513 outb(param, sony_cd_param_reg);
514}
515
516static inline void write_cmd(unsigned char cmd)
517{
518 outb(curr_control_reg | SONY_RES_RDY_INT_EN_BIT,
519 sony_cd_control_reg);
520 outb(cmd, sony_cd_cmd_reg);
521}
522
523static void cdu31a_interrupt(int irq, void *dev_id, struct pt_regs *regs)
524{
525 unsigned char val;
526
527 if (abort_read_started) {
528
529
530
531
532 while (is_result_reg_not_empty()) {
533 val = read_result_register();
534 }
535 clear_data_ready();
536 clear_result_ready();
537
538
539 while (is_data_requested()) {
540 val = read_data_register();
541 }
542 abort_read_started = 0;
543
544
545 if (waitqueue_active(&cdu31a_irq_wait)) {
546 disable_interrupts();
547 wake_up(&cdu31a_irq_wait);
548 }
549 } else if (waitqueue_active(&cdu31a_irq_wait)) {
550 disable_interrupts();
551 wake_up(&cdu31a_irq_wait);
552 } else {
553 disable_interrupts();
554 printk
555 ("CDU31A: Got an interrupt but nothing was waiting\n");
556 }
557}
558
559
560
561
562static unsigned char *translate_error(unsigned char err_code)
563{
564 static unsigned char errbuf[80];
565
566 switch (err_code) {
567 case 0x10:
568 return "illegal command ";
569 case 0x11:
570 return "illegal parameter ";
571
572 case 0x20:
573 return "not loaded ";
574 case 0x21:
575 return "no disc ";
576 case 0x22:
577 return "not spinning ";
578 case 0x23:
579 return "spinning ";
580 case 0x25:
581 return "spindle servo ";
582 case 0x26:
583 return "focus servo ";
584 case 0x29:
585 return "eject mechanism ";
586 case 0x2a:
587 return "audio playing ";
588 case 0x2c:
589 return "emergency eject ";
590
591 case 0x30:
592 return "focus ";
593 case 0x31:
594 return "frame sync ";
595 case 0x32:
596 return "subcode address ";
597 case 0x33:
598 return "block sync ";
599 case 0x34:
600 return "header address ";
601
602 case 0x40:
603 return "illegal track read ";
604 case 0x41:
605 return "mode 0 read ";
606 case 0x42:
607 return "illegal mode read ";
608 case 0x43:
609 return "illegal block size read ";
610 case 0x44:
611 return "mode read ";
612 case 0x45:
613 return "form read ";
614 case 0x46:
615 return "leadout read ";
616 case 0x47:
617 return "buffer overrun ";
618
619 case 0x53:
620 return "unrecoverable CIRC ";
621 case 0x57:
622 return "unrecoverable LECC ";
623
624 case 0x60:
625 return "no TOC ";
626 case 0x61:
627 return "invalid subcode data ";
628 case 0x63:
629 return "focus on TOC read ";
630 case 0x64:
631 return "frame sync on TOC read ";
632 case 0x65:
633 return "TOC data ";
634
635 case 0x70:
636 return "hardware failure ";
637 case 0x91:
638 return "leadin ";
639 case 0x92:
640 return "leadout ";
641 case 0x93:
642 return "data track ";
643 }
644 sprintf(errbuf, "unknown 0x%02x ", err_code);
645 return errbuf;
646}
647
648
649
650
651
652static void set_drive_params(int want_doublespeed)
653{
654 unsigned char res_reg[12];
655 unsigned int res_size;
656 unsigned char params[3];
657
658
659 params[0] = SONY_SD_AUTO_SPIN_DOWN_TIME;
660 params[1] = 0x00;
661 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD,
662 params, 2, res_reg, &res_size);
663 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20)) {
664 printk(" Unable to set spin-down time: 0x%2.2x\n",
665 res_reg[1]);
666 }
667
668 params[0] = SONY_SD_MECH_CONTROL;
669 params[1] = SONY_AUTO_SPIN_UP_BIT;
670
671 if (is_auto_eject)
672 params[1] |= SONY_AUTO_EJECT_BIT;
673
674 if (is_double_speed && want_doublespeed) {
675 params[1] |= SONY_DOUBLE_SPEED_BIT;
676
677 }
678 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD,
679 params, 2, res_reg, &res_size);
680 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20)) {
681 printk(" Unable to set mechanical parameters: 0x%2.2x\n",
682 res_reg[1]);
683 }
684}
685
686
687
688
689
690static int scd_select_speed(struct cdrom_device_info *cdi, int speed)
691{
692 if (speed == 0)
693 sony_speed = 1;
694 else
695 sony_speed = speed - 1;
696
697 set_drive_params(sony_speed);
698 return 0;
699}
700
701
702
703
704
705static int scd_lock_door(struct cdrom_device_info *cdi, int lock)
706{
707 if (lock == 0 && sony_usage == 1) {
708
709 is_auto_eject = 1;
710 } else {
711 is_auto_eject = 0;
712 }
713 set_drive_params(sony_speed);
714 return 0;
715}
716
717
718
719
720static void restart_on_error(void)
721{
722 unsigned char res_reg[12];
723 unsigned int res_size;
724 unsigned int retry_count;
725
726
727 printk("cdu31a: Resetting drive on error\n");
728 reset_drive();
729 retry_count = jiffies + SONY_RESET_TIMEOUT;
730 while (time_before(jiffies, retry_count) && (!is_attention())) {
731 sony_sleep();
732 }
733 set_drive_params(sony_speed);
734 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, &res_size);
735 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20)) {
736 printk("cdu31a: Unable to spin up drive: 0x%2.2x\n",
737 res_reg[1]);
738 }
739
740 current->state = TASK_INTERRUPTIBLE;
741 schedule_timeout(2 * HZ);
742
743 sony_get_toc();
744}
745
746
747
748
749
750static int write_params(unsigned char *params, int num_params)
751{
752 unsigned int retry_count;
753
754
755 retry_count = SONY_READY_RETRIES;
756 while ((retry_count > 0) && (!is_param_write_rdy())) {
757 retry_count--;
758 }
759 if (!is_param_write_rdy()) {
760 return -EIO;
761 }
762
763 while (num_params > 0) {
764 write_param(*params);
765 params++;
766 num_params--;
767 }
768
769 return 0;
770}
771
772
773
774
775
776
777
778
779static void
780get_result(unsigned char *result_buffer, unsigned int *result_size)
781{
782 unsigned char a, b;
783 int i;
784 unsigned int retry_count;
785
786
787 while (handle_sony_cd_attention());
788
789 retry_count = jiffies + SONY_JIFFIES_TIMEOUT;
790 while (time_before(jiffies, retry_count)
791 && (is_busy() || (!(is_result_ready())))) {
792 sony_sleep();
793
794 while (handle_sony_cd_attention());
795 }
796 if (is_busy() || (!(is_result_ready()))) {
797#if DEBUG
798 printk("CDU31A timeout out %d\n", __LINE__);
799#endif
800 result_buffer[0] = 0x20;
801 result_buffer[1] = SONY_TIMEOUT_OP_ERR;
802 *result_size = 2;
803 return;
804 }
805
806
807
808
809
810 clear_result_ready();
811 a = read_result_register();
812 *result_buffer = a;
813 result_buffer++;
814
815
816 if ((a & 0xf0) == 0x50) {
817 *result_size = 1;
818 return;
819 }
820
821 b = read_result_register();
822 *result_buffer = b;
823 result_buffer++;
824 *result_size = 2;
825
826
827
828
829
830
831
832
833
834 if ((a & 0xf0) != 0x20) {
835 if (b > 8) {
836 for (i = 0; i < 8; i++) {
837 *result_buffer = read_result_register();
838 result_buffer++;
839 (*result_size)++;
840 }
841 b = b - 8;
842
843 while (b > 10) {
844 retry_count = SONY_READY_RETRIES;
845 while ((retry_count > 0)
846 && (!is_result_ready())) {
847 retry_count--;
848 }
849 if (!is_result_ready()) {
850#if DEBUG
851 printk("CDU31A timeout out %d\n",
852 __LINE__);
853#endif
854 result_buffer[0] = 0x20;
855 result_buffer[1] =
856 SONY_TIMEOUT_OP_ERR;
857 *result_size = 2;
858 return;
859 }
860
861 clear_result_ready();
862
863 for (i = 0; i < 10; i++) {
864 *result_buffer =
865 read_result_register();
866 result_buffer++;
867 (*result_size)++;
868 }
869 b = b - 10;
870 }
871
872 if (b > 0) {
873 retry_count = SONY_READY_RETRIES;
874 while ((retry_count > 0)
875 && (!is_result_ready())) {
876 retry_count--;
877 }
878 if (!is_result_ready()) {
879#if DEBUG
880 printk("CDU31A timeout out %d\n",
881 __LINE__);
882#endif
883 result_buffer[0] = 0x20;
884 result_buffer[1] =
885 SONY_TIMEOUT_OP_ERR;
886 *result_size = 2;
887 return;
888 }
889 }
890 }
891
892 while (b > 0) {
893 *result_buffer = read_result_register();
894 result_buffer++;
895 (*result_size)++;
896 b--;
897 }
898 }
899}
900
901
902
903
904
905
906static void
907do_sony_cd_cmd(unsigned char cmd,
908 unsigned char *params,
909 unsigned int num_params,
910 unsigned char *result_buffer, unsigned int *result_size)
911{
912 unsigned int retry_count;
913 int num_retries;
914 int recursive_call;
915 unsigned long flags;
916
917
918 save_flags(flags);
919 cli();
920 if (current != has_cd_task) {
921 while (sony_inuse) {
922 interruptible_sleep_on(&sony_wait);
923 if (signal_pending(current)) {
924 result_buffer[0] = 0x20;
925 result_buffer[1] = SONY_SIGNAL_OP_ERR;
926 *result_size = 2;
927 restore_flags(flags);
928 return;
929 }
930 }
931 sony_inuse = 1;
932 has_cd_task = current;
933 recursive_call = 0;
934 } else {
935 recursive_call = 1;
936 }
937
938 num_retries = 0;
939retry_cd_operation:
940
941 while (handle_sony_cd_attention());
942
943 sti();
944
945 retry_count = jiffies + SONY_JIFFIES_TIMEOUT;
946 while (time_before(jiffies, retry_count) && (is_busy())) {
947 sony_sleep();
948
949 while (handle_sony_cd_attention());
950 }
951 if (is_busy()) {
952#if DEBUG
953 printk("CDU31A timeout out %d\n", __LINE__);
954#endif
955 result_buffer[0] = 0x20;
956 result_buffer[1] = SONY_TIMEOUT_OP_ERR;
957 *result_size = 2;
958 } else {
959 clear_result_ready();
960 clear_param_reg();
961
962 write_params(params, num_params);
963 write_cmd(cmd);
964
965 get_result(result_buffer, result_size);
966 }
967
968 if (((result_buffer[0] & 0xf0) == 0x20)
969 && (num_retries < MAX_CDU31A_RETRIES)) {
970 num_retries++;
971 current->state = TASK_INTERRUPTIBLE;
972 schedule_timeout(HZ / 10);
973 goto retry_cd_operation;
974 }
975
976 if (!recursive_call) {
977 has_cd_task = NULL;
978 sony_inuse = 0;
979 wake_up_interruptible(&sony_wait);
980 }
981
982 restore_flags(flags);
983}
984
985
986
987
988
989
990
991
992
993
994
995static int handle_sony_cd_attention(void)
996{
997 unsigned char atten_code;
998 static int num_consecutive_attentions = 0;
999 volatile int val;
1000
1001
1002#if 0*DEBUG
1003 printk("Entering handle_sony_cd_attention\n");
1004#endif
1005 if (is_attention()) {
1006 if (num_consecutive_attentions >
1007 CDU31A_MAX_CONSECUTIVE_ATTENTIONS) {
1008 printk
1009 ("cdu31a: Too many consecutive attentions: %d\n",
1010 num_consecutive_attentions);
1011 num_consecutive_attentions = 0;
1012#if DEBUG
1013 printk("Leaving handle_sony_cd_attention at %d\n",
1014 __LINE__);
1015#endif
1016 return (0);
1017 }
1018
1019 clear_attention();
1020 atten_code = read_result_register();
1021
1022 switch (atten_code) {
1023
1024 case SONY_MECH_LOADED_ATTN:
1025 disk_changed = 1;
1026 sony_toc_read = 0;
1027 sony_audio_status = CDROM_AUDIO_NO_STATUS;
1028 sony_blocks_left = 0;
1029 break;
1030
1031 case SONY_SPIN_DOWN_COMPLETE_ATTN:
1032
1033 sony_spun_up = 0;
1034 break;
1035
1036 case SONY_AUDIO_PLAY_DONE_ATTN:
1037 sony_audio_status = CDROM_AUDIO_COMPLETED;
1038 read_subcode();
1039 break;
1040
1041 case SONY_EJECT_PUSHED_ATTN:
1042 if (is_auto_eject) {
1043 sony_audio_status = CDROM_AUDIO_INVALID;
1044 }
1045 break;
1046
1047 case SONY_LEAD_IN_ERR_ATTN:
1048 case SONY_LEAD_OUT_ERR_ATTN:
1049 case SONY_DATA_TRACK_ERR_ATTN:
1050 case SONY_AUDIO_PLAYBACK_ERR_ATTN:
1051 sony_audio_status = CDROM_AUDIO_ERROR;
1052 break;
1053 }
1054
1055 num_consecutive_attentions++;
1056#if DEBUG
1057 printk("Leaving handle_sony_cd_attention at %d\n",
1058 __LINE__);
1059#endif
1060 return (1);
1061 } else if (abort_read_started) {
1062 while (is_result_reg_not_empty()) {
1063 val = read_result_register();
1064 }
1065 clear_data_ready();
1066 clear_result_ready();
1067
1068 while (is_data_requested()) {
1069 val = read_data_register();
1070 }
1071 abort_read_started = 0;
1072#if DEBUG
1073 printk("Leaving handle_sony_cd_attention at %d\n",
1074 __LINE__);
1075#endif
1076 return (1);
1077 }
1078
1079 num_consecutive_attentions = 0;
1080#if 0*DEBUG
1081 printk("Leaving handle_sony_cd_attention at %d\n", __LINE__);
1082#endif
1083 return (0);
1084}
1085
1086
1087
1088static inline unsigned int int_to_bcd(unsigned int val)
1089{
1090 int retval;
1091
1092
1093 retval = (val / 10) << 4;
1094 retval = retval | val % 10;
1095 return (retval);
1096}
1097
1098
1099
1100static unsigned int bcd_to_int(unsigned int bcd)
1101{
1102 return ((((bcd >> 4) & 0x0f) * 10) + (bcd & 0x0f));
1103}
1104
1105
1106
1107
1108
1109
1110static void log_to_msf(unsigned int log, unsigned char *msf)
1111{
1112 log = log + LOG_START_OFFSET;
1113 msf[0] = int_to_bcd(log / 4500);
1114 log = log % 4500;
1115 msf[1] = int_to_bcd(log / 75);
1116 msf[2] = int_to_bcd(log % 75);
1117}
1118
1119
1120
1121
1122
1123static unsigned int msf_to_log(unsigned char *msf)
1124{
1125 unsigned int log;
1126
1127
1128 log = msf[2];
1129 log += msf[1] * 75;
1130 log += msf[0] * 4500;
1131 log = log - LOG_START_OFFSET;
1132
1133 return log;
1134}
1135
1136
1137
1138
1139
1140
1141static void size_to_buf(unsigned int size, unsigned char *buf)
1142{
1143 buf[0] = size / 65536;
1144 size = size % 65536;
1145 buf[1] = size / 256;
1146 buf[2] = size % 256;
1147}
1148
1149
1150
1151
1152
1153
1154
1155static int
1156start_request(unsigned int sector, unsigned int nsect, int read_nsect_only)
1157{
1158 unsigned char params[6];
1159 unsigned int read_size;
1160 unsigned int retry_count;
1161
1162
1163#if DEBUG
1164 printk("Entering start_request\n");
1165#endif
1166 log_to_msf(sector, params);
1167
1168 if (read_nsect_only) {
1169 read_size = nsect;
1170 }
1171
1172
1173
1174
1175 else if ((sector + nsect) >= sony_toc.lead_out_start_lba) {
1176 read_size = sony_toc.lead_out_start_lba - sector;
1177 }
1178
1179 else {
1180 read_size = CDU31A_READAHEAD / 4;
1181 }
1182 size_to_buf(read_size, ¶ms[3]);
1183
1184
1185
1186
1187
1188 while (handle_sony_cd_attention());
1189
1190 retry_count = jiffies + SONY_JIFFIES_TIMEOUT;
1191 while (time_before(jiffies, retry_count) && (is_busy())) {
1192 sony_sleep();
1193
1194 while (handle_sony_cd_attention());
1195 }
1196
1197 if (is_busy()) {
1198 printk("CDU31A: Timeout while waiting to issue command\n");
1199#if DEBUG
1200 printk("Leaving start_request at %d\n", __LINE__);
1201#endif
1202 return (1);
1203 } else {
1204
1205 clear_result_ready();
1206 clear_param_reg();
1207
1208 write_params(params, 6);
1209 write_cmd(SONY_READ_BLKERR_STAT_CMD);
1210
1211 sony_blocks_left = read_size * 4;
1212 sony_next_block = sector * 4;
1213 readahead_dataleft = 0;
1214 readahead_bad = 0;
1215#if DEBUG
1216 printk("Leaving start_request at %d\n", __LINE__);
1217#endif
1218 return (0);
1219 }
1220#if DEBUG
1221 printk("Leaving start_request at %d\n", __LINE__);
1222#endif
1223}
1224
1225
1226
1227static void abort_read(void)
1228{
1229 unsigned char result_reg[2];
1230 int result_size;
1231 volatile int val;
1232
1233
1234 do_sony_cd_cmd(SONY_ABORT_CMD, NULL, 0, result_reg, &result_size);
1235 if ((result_reg[0] & 0xf0) == 0x20) {
1236 printk("CDU31A: Error aborting read, %s error\n",
1237 translate_error(result_reg[1]));
1238 }
1239
1240 while (is_result_reg_not_empty()) {
1241 val = read_result_register();
1242 }
1243 clear_data_ready();
1244 clear_result_ready();
1245
1246 while (is_data_requested()) {
1247 val = read_data_register();
1248 }
1249
1250 sony_blocks_left = 0;
1251 readahead_dataleft = 0;
1252 readahead_bad = 0;
1253}
1254
1255
1256
1257static void handle_abort_timeout(unsigned long data)
1258{
1259 unsigned long flags;
1260
1261#if DEBUG
1262 printk("Entering handle_abort_timeout\n");
1263#endif
1264 save_flags(flags);
1265 cli();
1266
1267 if (!sony_inuse) {
1268
1269
1270
1271
1272 clear_result_ready();
1273 clear_param_reg();
1274 write_cmd(SONY_ABORT_CMD);
1275
1276 sony_blocks_left = 0;
1277 readahead_dataleft = 0;
1278 readahead_bad = 0;
1279 abort_read_started = 1;
1280 }
1281 restore_flags(flags);
1282#if DEBUG
1283 printk("Leaving handle_abort_timeout\n");
1284#endif
1285}
1286
1287
1288static void
1289input_data(char *buffer,
1290 unsigned int bytesleft,
1291 unsigned int nblocks, unsigned int offset, unsigned int skip)
1292{
1293 int i;
1294 volatile unsigned char val;
1295
1296
1297#if DEBUG
1298 printk("Entering input_data\n");
1299#endif
1300
1301
1302 if (sony_xa_mode) {
1303 for (i = 0; i < CD_XA_HEAD; i++) {
1304 val = read_data_register();
1305 }
1306 }
1307
1308 clear_data_ready();
1309
1310 if (bytesleft == 2048) {
1311 insb(sony_cd_read_reg, buffer, 2048);
1312 readahead_dataleft = 0;
1313 } else {
1314
1315
1316 if (skip != 0) {
1317 insb(sony_cd_read_reg, readahead_buffer, skip);
1318 }
1319
1320
1321 insb(sony_cd_read_reg, &buffer[offset], bytesleft);
1322
1323
1324
1325 readahead_dataleft = (2048 - skip) - bytesleft;
1326 insb(sony_cd_read_reg,
1327 readahead_buffer + bytesleft, readahead_dataleft);
1328 }
1329 sony_blocks_left -= nblocks;
1330 sony_next_block += nblocks;
1331
1332
1333
1334 if (sony_xa_mode) {
1335 for (i = 0; i < CD_XA_TAIL; i++) {
1336 val = read_data_register();
1337 }
1338 }
1339#if DEBUG
1340 printk("Leaving input_data at %d\n", __LINE__);
1341#endif
1342}
1343
1344
1345static void
1346read_data_block(char *buffer,
1347 unsigned int block,
1348 unsigned int nblocks,
1349 unsigned char res_reg[], int *res_size)
1350{
1351 unsigned int retry_count;
1352 unsigned int bytesleft;
1353 unsigned int offset;
1354 unsigned int skip;
1355
1356
1357#if DEBUG
1358 printk("Entering read_data_block\n");
1359#endif
1360
1361 res_reg[0] = 0;
1362 res_reg[1] = 0;
1363 *res_size = 0;
1364
1365 if (nblocks > 4) nblocks = 4;
1366 bytesleft = nblocks * 512;
1367 offset = 0;
1368
1369
1370
1371 if (((block % 4) * 512) != ((2048 - readahead_dataleft) % 2048)) {
1372 sony_next_block += block % 4;
1373 sony_blocks_left -= block % 4;
1374 skip = (block % 4) * 512;
1375 } else {
1376 skip = 0;
1377 }
1378
1379
1380
1381 if (readahead_dataleft != 0) {
1382 if (bytesleft > readahead_dataleft) {
1383
1384
1385 memcpy(buffer,
1386 readahead_buffer + (2048 -
1387 readahead_dataleft),
1388 readahead_dataleft);
1389 bytesleft -= readahead_dataleft;
1390 offset += readahead_dataleft;
1391 readahead_dataleft = 0;
1392 } else {
1393
1394
1395 memcpy(buffer,
1396 readahead_buffer + (2048 -
1397 readahead_dataleft),
1398 bytesleft);
1399 readahead_dataleft -= bytesleft;
1400 bytesleft = 0;
1401 sony_blocks_left -= nblocks;
1402 sony_next_block += nblocks;
1403
1404
1405
1406 if (readahead_bad) {
1407 res_reg[0] = 0x20;
1408 res_reg[1] = SONY_BAD_DATA_ERR;
1409 *res_size = 2;
1410 }
1411
1412 if (readahead_dataleft == 0) {
1413 readahead_bad = 0;
1414 }
1415
1416
1417 if (sony_blocks_left == 0) {
1418 get_result(res_reg, res_size);
1419 }
1420#if DEBUG
1421 printk("Leaving read_data_block at %d\n",
1422 __LINE__);
1423#endif
1424 return;
1425 }
1426 }
1427
1428
1429 retry_count = jiffies + SONY_JIFFIES_TIMEOUT;
1430 while (time_before(jiffies, retry_count) && !(is_data_ready())) {
1431 while (handle_sony_cd_attention());
1432
1433 sony_sleep();
1434 }
1435 if (!(is_data_ready())) {
1436 if (is_result_ready()) {
1437 get_result(res_reg, res_size);
1438 if ((res_reg[0] & 0xf0) != 0x20) {
1439 printk
1440 ("CDU31A: Got result that should have been error: %d\n",
1441 res_reg[0]);
1442 res_reg[0] = 0x20;
1443 res_reg[1] = SONY_BAD_DATA_ERR;
1444 *res_size = 2;
1445 }
1446 abort_read();
1447 } else {
1448#if DEBUG
1449 printk("CDU31A timeout out %d\n", __LINE__);
1450#endif
1451 res_reg[0] = 0x20;
1452 res_reg[1] = SONY_TIMEOUT_OP_ERR;
1453 *res_size = 2;
1454 abort_read();
1455 }
1456 } else {
1457 input_data(buffer, bytesleft, nblocks, offset, skip);
1458
1459
1460 retry_count = jiffies + SONY_JIFFIES_TIMEOUT;
1461 while (time_before(jiffies, retry_count)
1462 && !(is_result_ready())) {
1463 while (handle_sony_cd_attention());
1464
1465 sony_sleep();
1466 }
1467
1468 if (!is_result_ready()) {
1469#if DEBUG
1470 printk("CDU31A timeout out %d\n", __LINE__);
1471#endif
1472 res_reg[0] = 0x20;
1473 res_reg[1] = SONY_TIMEOUT_OP_ERR;
1474 *res_size = 2;
1475 abort_read();
1476 } else {
1477 get_result(res_reg, res_size);
1478
1479
1480 if ((res_reg[0] & 0xf0) == 0x50) {
1481
1482 if ((res_reg[0] ==
1483 SONY_NO_CIRC_ERR_BLK_STAT)
1484 || (res_reg[0] ==
1485 SONY_NO_LECC_ERR_BLK_STAT)
1486 || (res_reg[0] ==
1487 SONY_RECOV_LECC_ERR_BLK_STAT)) {
1488
1489
1490
1491 if (readahead_bad) {
1492 readahead_bad = 0;
1493 res_reg[0] = 0x20;
1494 res_reg[1] =
1495 SONY_BAD_DATA_ERR;
1496 *res_size = 2;
1497 }
1498 } else {
1499 printk
1500 ("CDU31A: Data block error: 0x%x\n",
1501 res_reg[0]);
1502 res_reg[0] = 0x20;
1503 res_reg[1] = SONY_BAD_DATA_ERR;
1504 *res_size = 2;
1505
1506
1507
1508 if (bytesleft != 2048) {
1509 readahead_bad = 1;
1510 }
1511 }
1512
1513
1514 if (sony_blocks_left == 0) {
1515 get_result(res_reg, res_size);
1516 }
1517 } else if ((res_reg[0] & 0xf0) != 0x20) {
1518
1519
1520 printk
1521 ("CDU31A: Invalid block status: 0x%x\n",
1522 res_reg[0]);
1523 restart_on_error();
1524 res_reg[0] = 0x20;
1525 res_reg[1] = SONY_BAD_DATA_ERR;
1526 *res_size = 2;
1527 }
1528 }
1529 }
1530#if DEBUG
1531 printk("Leaving read_data_block at %d\n", __LINE__);
1532#endif
1533}
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543static void do_cdu31a_request(request_queue_t * q)
1544{
1545 int block;
1546 int nblock;
1547 unsigned char res_reg[12];
1548 unsigned int res_size;
1549 int num_retries;
1550 unsigned long flags;
1551
1552
1553#if DEBUG
1554 printk("Entering do_cdu31a_request\n");
1555#endif
1556
1557
1558
1559
1560
1561 save_flags(flags);
1562 cli();
1563 while (sony_inuse) {
1564 interruptible_sleep_on(&sony_wait);
1565 if (signal_pending(current)) {
1566 restore_flags(flags);
1567 if (!QUEUE_EMPTY
1568 && CURRENT->rq_status != RQ_INACTIVE) {
1569 end_request(0);
1570 }
1571 restore_flags(flags);
1572#if DEBUG
1573 printk("Leaving do_cdu31a_request at %d\n",
1574 __LINE__);
1575#endif
1576 return;
1577 }
1578 }
1579 sony_inuse = 1;
1580 has_cd_task = current;
1581
1582
1583 while (handle_sony_cd_attention());
1584
1585
1586 sony_get_toc();
1587
1588 spin_unlock_irq(&io_request_lock);
1589
1590
1591 del_timer(&cdu31a_abort_timer);
1592
1593 while (1) {
1594 cdu31a_request_startover:
1595
1596
1597
1598
1599 if (QUEUE_EMPTY || CURRENT->rq_status == RQ_INACTIVE) {
1600 goto end_do_cdu31a_request;
1601 }
1602
1603 if (!sony_spun_up) {
1604 scd_spinup();
1605 }
1606
1607
1608
1609
1610 if (MAJOR(CURRENT->rq_dev) != MAJOR_NR) {
1611 panic(DEVICE_NAME ": request list destroyed");
1612 }
1613 if (CURRENT->bh) {
1614 if (!buffer_locked(CURRENT->bh)) {
1615 panic(DEVICE_NAME ": block not locked");
1616 }
1617 }
1618
1619 block = CURRENT->sector;
1620 nblock = CURRENT->nr_sectors;
1621
1622 if (!sony_toc_read) {
1623 printk("CDU31A: TOC not read\n");
1624 end_request(0);
1625 goto cdu31a_request_startover;
1626 }
1627
1628 switch (CURRENT->cmd) {
1629 case READ:
1630
1631
1632
1633
1634#if 0
1635 if ((block / 4) < sony_toc.start_track_lba) {
1636 printk
1637 ("CDU31A: Request before beginning of media\n");
1638 end_request(0);
1639 goto cdu31a_request_startover;
1640 }
1641#endif
1642 if ((block / 4) >= sony_toc.lead_out_start_lba) {
1643 printk
1644 ("CDU31A: Request past end of media\n");
1645 end_request(0);
1646 goto cdu31a_request_startover;
1647 }
1648 if (((block + nblock) / 4) >=
1649 sony_toc.lead_out_start_lba) {
1650 printk
1651 ("CDU31A: Request past end of media\n");
1652 end_request(0);
1653 goto cdu31a_request_startover;
1654 }
1655
1656 num_retries = 0;
1657
1658 try_read_again:
1659 while (handle_sony_cd_attention());
1660
1661 if (!sony_toc_read) {
1662 printk("CDU31A: TOC not read\n");
1663 end_request(0);
1664 goto cdu31a_request_startover;
1665 }
1666
1667
1668
1669 if (sony_blocks_left == 0) {
1670 if (start_request
1671 (block / 4, CDU31A_READAHEAD / 4, 0)) {
1672 end_request(0);
1673 goto cdu31a_request_startover;
1674 }
1675 }
1676
1677
1678
1679 else if (block != sony_next_block) {
1680#if DEBUG
1681 printk
1682 ("CDU31A Warning: Read for block %d, expected %d\n",
1683 block, sony_next_block);
1684#endif
1685 abort_read();
1686 if (!sony_toc_read) {
1687 printk("CDU31A: TOC not read\n");
1688 end_request(0);
1689 goto cdu31a_request_startover;
1690 }
1691 if (start_request
1692 (block / 4, CDU31A_READAHEAD / 4, 0)) {
1693 printk
1694 ("CDU31a: start request failed\n");
1695 end_request(0);
1696 goto cdu31a_request_startover;
1697 }
1698 }
1699
1700 read_data_block(CURRENT->buffer, block, nblock,
1701 res_reg, &res_size);
1702 if (res_reg[0] == 0x20) {
1703 if (num_retries > MAX_CDU31A_RETRIES) {
1704 end_request(0);
1705 goto cdu31a_request_startover;
1706 }
1707
1708 num_retries++;
1709 if (res_reg[1] == SONY_NOT_SPIN_ERR) {
1710 do_sony_cd_cmd(SONY_SPIN_UP_CMD,
1711 NULL, 0, res_reg,
1712 &res_size);
1713 } else {
1714 printk
1715 ("CDU31A: %s error for block %d, nblock %d\n",
1716 translate_error(res_reg[1]),
1717 block, nblock);
1718 }
1719 goto try_read_again;
1720 } else {
1721 end_request(1);
1722 }
1723 break;
1724
1725 case WRITE:
1726 end_request(0);
1727 break;
1728
1729 default:
1730 panic("CDU31A: Unknown cmd");
1731 }
1732 }
1733
1734 end_do_cdu31a_request:
1735 spin_lock_irq(&io_request_lock);
1736#if 0
1737
1738 abort_read();
1739#else
1740
1741
1742 cdu31a_abort_timer.expires = jiffies + 2 * HZ;
1743 add_timer(&cdu31a_abort_timer);
1744#endif
1745
1746 has_cd_task = NULL;
1747 sony_inuse = 0;
1748 wake_up_interruptible(&sony_wait);
1749 restore_flags(flags);
1750#if DEBUG
1751 printk("Leaving do_cdu31a_request at %d\n", __LINE__);
1752#endif
1753}
1754
1755
1756
1757
1758
1759
1760static void sony_get_toc(void)
1761{
1762 unsigned char res_reg[2];
1763 unsigned int res_size;
1764 unsigned char parms[1];
1765 int session;
1766 int num_spin_ups;
1767 int totaltracks = 0;
1768 int mint = 99;
1769 int maxt = 0;
1770
1771#if DEBUG
1772 printk("Entering sony_get_toc\n");
1773#endif
1774
1775 num_spin_ups = 0;
1776 if (!sony_toc_read) {
1777 respinup_on_gettoc:
1778
1779 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg,
1780 &res_size);
1781
1782 do_sony_cd_cmd(SONY_READ_TOC_CMD, NULL, 0, res_reg,
1783 &res_size);
1784
1785
1786
1787 if ((res_size < 2)
1788 || ((res_reg[0] != 0) && (res_reg[1] != 0))) {
1789
1790 if ((res_reg[1] == SONY_AUDIO_PLAYING_ERR)
1791 || (res_reg[1] == 0)) {
1792 goto gettoc_drive_spinning;
1793 }
1794
1795
1796
1797 if ((res_reg[1] == SONY_NOT_SPIN_ERR)
1798 && (num_spin_ups < MAX_CDU31A_RETRIES)) {
1799 num_spin_ups++;
1800 goto respinup_on_gettoc;
1801 }
1802
1803 printk("cdu31a: Error reading TOC: %x %s\n",
1804 res_reg[0], translate_error(res_reg[1]));
1805 return;
1806 }
1807
1808 gettoc_drive_spinning:
1809
1810
1811
1812
1813
1814
1815#if DEBUG
1816 memset(&sony_toc, 0x0e, sizeof(sony_toc));
1817 memset(&single_toc, 0x0f, sizeof(single_toc));
1818#endif
1819 session = 1;
1820 while (1) {
1821
1822
1823
1824#if 1
1825 printk("cdu31a: Trying session %d\n", session);
1826#endif
1827 parms[0] = session;
1828 do_sony_cd_cmd(SONY_READ_TOC_SPEC_CMD,
1829 parms, 1, res_reg, &res_size);
1830
1831#if DEBUG
1832 printk("%2.2x %2.2x\n", res_reg[0], res_reg[1]);
1833#endif
1834
1835 if ((res_size < 2)
1836 || ((res_reg[0] & 0xf0) == 0x20)) {
1837
1838 if (session == 1)
1839 printk
1840 ("Yikes! Couldn't read any sessions!");
1841 break;
1842 }
1843#if DEBUG
1844 printk("Reading session %d\n", session);
1845#endif
1846
1847 parms[0] = session;
1848 do_sony_cd_cmd(SONY_REQ_TOC_DATA_SPEC_CMD,
1849 parms,
1850 1,
1851 (unsigned char *) &single_toc,
1852 &res_size);
1853 if ((res_size < 2)
1854 || ((single_toc.exec_status[0] & 0xf0) ==
1855 0x20)) {
1856 printk
1857 ("cdu31a: Error reading session %d: %x %s\n",
1858 session, single_toc.exec_status[0],
1859 translate_error(single_toc.
1860 exec_status[1]));
1861
1862
1863 return;
1864 }
1865#if DEBUG
1866 printk
1867 ("add0 %01x, con0 %01x, poi0 %02x, 1st trk %d, dsktyp %x, dum0 %x\n",
1868 single_toc.address0, single_toc.control0,
1869 single_toc.point0,
1870 bcd_to_int(single_toc.first_track_num),
1871 single_toc.disk_type, single_toc.dummy0);
1872 printk
1873 ("add1 %01x, con1 %01x, poi1 %02x, lst trk %d, dummy1 %x, dum2 %x\n",
1874 single_toc.address1, single_toc.control1,
1875 single_toc.point1,
1876 bcd_to_int(single_toc.last_track_num),
1877 single_toc.dummy1, single_toc.dummy2);
1878 printk
1879 ("add2 %01x, con2 %01x, poi2 %02x leadout start min %d, sec %d, frame %d\n",
1880 single_toc.address2, single_toc.control2,
1881 single_toc.point2,
1882 bcd_to_int(single_toc.lead_out_start_msf[0]),
1883 bcd_to_int(single_toc.lead_out_start_msf[1]),
1884 bcd_to_int(single_toc.lead_out_start_msf[2]));
1885 if (res_size > 18 && single_toc.pointb0 > 0xaf)
1886 printk
1887 ("addb0 %01x, conb0 %01x, poib0 %02x, nextsession min %d, sec %d, frame %d\n"
1888 "#mode5_ptrs %02d, max_start_outer_leadout_msf min %d, sec %d, frame %d\n",
1889 single_toc.addressb0,
1890 single_toc.controlb0,
1891 single_toc.pointb0,
1892 bcd_to_int(single_toc.
1893 next_poss_prog_area_msf
1894 [0]),
1895 bcd_to_int(single_toc.
1896 next_poss_prog_area_msf
1897 [1]),
1898 bcd_to_int(single_toc.
1899 next_poss_prog_area_msf
1900 [2]),
1901 single_toc.num_mode_5_pointers,
1902 bcd_to_int(single_toc.
1903 max_start_outer_leadout_msf
1904 [0]),
1905 bcd_to_int(single_toc.
1906 max_start_outer_leadout_msf
1907 [1]),
1908 bcd_to_int(single_toc.
1909 max_start_outer_leadout_msf
1910 [2]));
1911 if (res_size > 27 && single_toc.pointb1 > 0xaf)
1912 printk
1913 ("addb1 %01x, conb1 %01x, poib1 %02x, %x %x %x %x #skipint_ptrs %d, #skiptrkassign %d %x\n",
1914 single_toc.addressb1,
1915 single_toc.controlb1,
1916 single_toc.pointb1,
1917 single_toc.dummyb0_1[0],
1918 single_toc.dummyb0_1[1],
1919 single_toc.dummyb0_1[2],
1920 single_toc.dummyb0_1[3],
1921 single_toc.num_skip_interval_pointers,
1922 single_toc.num_skip_track_assignments,
1923 single_toc.dummyb0_2);
1924 if (res_size > 36 && single_toc.pointb2 > 0xaf)
1925 printk
1926 ("addb2 %01x, conb2 %01x, poib2 %02x, %02x %02x %02x %02x %02x %02x %02x\n",
1927 single_toc.addressb2,
1928 single_toc.controlb2,
1929 single_toc.pointb2,
1930 single_toc.tracksb2[0],
1931 single_toc.tracksb2[1],
1932 single_toc.tracksb2[2],
1933 single_toc.tracksb2[3],
1934 single_toc.tracksb2[4],
1935 single_toc.tracksb2[5],
1936 single_toc.tracksb2[6]);
1937 if (res_size > 45 && single_toc.pointb3 > 0xaf)
1938 printk
1939 ("addb3 %01x, conb3 %01x, poib3 %02x, %02x %02x %02x %02x %02x %02x %02x\n",
1940 single_toc.addressb3,
1941 single_toc.controlb3,
1942 single_toc.pointb3,
1943 single_toc.tracksb3[0],
1944 single_toc.tracksb3[1],
1945 single_toc.tracksb3[2],
1946 single_toc.tracksb3[3],
1947 single_toc.tracksb3[4],
1948 single_toc.tracksb3[5],
1949 single_toc.tracksb3[6]);
1950 if (res_size > 54 && single_toc.pointb4 > 0xaf)
1951 printk
1952 ("addb4 %01x, conb4 %01x, poib4 %02x, %02x %02x %02x %02x %02x %02x %02x\n",
1953 single_toc.addressb4,
1954 single_toc.controlb4,
1955 single_toc.pointb4,
1956 single_toc.tracksb4[0],
1957 single_toc.tracksb4[1],
1958 single_toc.tracksb4[2],
1959 single_toc.tracksb4[3],
1960 single_toc.tracksb4[4],
1961 single_toc.tracksb4[5],
1962 single_toc.tracksb4[6]);
1963 if (res_size > 63 && single_toc.pointc0 > 0xaf)
1964 printk
1965 ("addc0 %01x, conc0 %01x, poic0 %02x, %02x %02x %02x %02x %02x %02x %02x\n",
1966 single_toc.addressc0,
1967 single_toc.controlc0,
1968 single_toc.pointc0,
1969 single_toc.dummyc0[0],
1970 single_toc.dummyc0[1],
1971 single_toc.dummyc0[2],
1972 single_toc.dummyc0[3],
1973 single_toc.dummyc0[4],
1974 single_toc.dummyc0[5],
1975 single_toc.dummyc0[6]);
1976#endif
1977#undef DEBUG
1978#define DEBUG 0
1979
1980 sony_toc.lead_out_start_msf[0] =
1981 bcd_to_int(single_toc.lead_out_start_msf[0]);
1982 sony_toc.lead_out_start_msf[1] =
1983 bcd_to_int(single_toc.lead_out_start_msf[1]);
1984 sony_toc.lead_out_start_msf[2] =
1985 bcd_to_int(single_toc.lead_out_start_msf[2]);
1986 sony_toc.lead_out_start_lba =
1987 single_toc.lead_out_start_lba =
1988 msf_to_log(sony_toc.lead_out_start_msf);
1989
1990
1991
1992 if (single_toc.pointb0 != 0xb0) {
1993 memmove(((char *) &single_toc) + 27,
1994 ((char *) &single_toc) + 18,
1995 res_size - 18);
1996 res_size += 9;
1997 } else if (res_size > 18) {
1998 sony_toc.lead_out_start_msf[0] =
1999 bcd_to_int(single_toc.
2000 max_start_outer_leadout_msf
2001 [0]);
2002 sony_toc.lead_out_start_msf[1] =
2003 bcd_to_int(single_toc.
2004 max_start_outer_leadout_msf
2005 [1]);
2006 sony_toc.lead_out_start_msf[2] =
2007 bcd_to_int(single_toc.
2008 max_start_outer_leadout_msf
2009 [2]);
2010 sony_toc.lead_out_start_lba =
2011 msf_to_log(sony_toc.
2012 lead_out_start_msf);
2013 }
2014 if (single_toc.pointb1 != 0xb1) {
2015 memmove(((char *) &single_toc) + 36,
2016 ((char *) &single_toc) + 27,
2017 res_size - 27);
2018 res_size += 9;
2019 }
2020 if (single_toc.pointb2 != 0xb2) {
2021 memmove(((char *) &single_toc) + 45,
2022 ((char *) &single_toc) + 36,
2023 res_size - 36);
2024 res_size += 9;
2025 }
2026 if (single_toc.pointb3 != 0xb3) {
2027 memmove(((char *) &single_toc) + 54,
2028 ((char *) &single_toc) + 45,
2029 res_size - 45);
2030 res_size += 9;
2031 }
2032 if (single_toc.pointb4 != 0xb4) {
2033 memmove(((char *) &single_toc) + 63,
2034 ((char *) &single_toc) + 54,
2035 res_size - 54);
2036 res_size += 9;
2037 }
2038 if (single_toc.pointc0 != 0xc0) {
2039 memmove(((char *) &single_toc) + 72,
2040 ((char *) &single_toc) + 63,
2041 res_size - 63);
2042 res_size += 9;
2043 }
2044#if DEBUG
2045 printk
2046 ("start track lba %u, leadout start lba %u\n",
2047 single_toc.start_track_lba,
2048 single_toc.lead_out_start_lba);
2049 {
2050 int i;
2051 for (i = 0;
2052 i <
2053 1 +
2054 bcd_to_int(single_toc.last_track_num)
2055 -
2056 bcd_to_int(single_toc.
2057 first_track_num); i++) {
2058 printk
2059 ("trk %02d: add 0x%01x, con 0x%01x, track %02d, start min %02d, sec %02d, frame %02d\n",
2060 i,
2061 single_toc.tracks[i].address,
2062 single_toc.tracks[i].control,
2063 bcd_to_int(single_toc.
2064 tracks[i].track),
2065 bcd_to_int(single_toc.
2066 tracks[i].
2067 track_start_msf
2068 [0]),
2069 bcd_to_int(single_toc.
2070 tracks[i].
2071 track_start_msf
2072 [1]),
2073 bcd_to_int(single_toc.
2074 tracks[i].
2075 track_start_msf
2076 [2]));
2077 if (mint >
2078 bcd_to_int(single_toc.
2079 tracks[i].track))
2080 mint =
2081 bcd_to_int(single_toc.
2082 tracks[i].
2083 track);
2084 if (maxt <
2085 bcd_to_int(single_toc.
2086 tracks[i].track))
2087 maxt =
2088 bcd_to_int(single_toc.
2089 tracks[i].
2090 track);
2091 }
2092 printk
2093 ("min track number %d, max track number %d\n",
2094 mint, maxt);
2095 }
2096#endif
2097
2098
2099 if (single_toc.disk_type == 0x10 &&
2100 single_toc.first_track_num == 2 &&
2101 single_toc.last_track_num == 2 ) {
2102 sony_toc.tracks[totaltracks].address = 1;
2103 sony_toc.tracks[totaltracks].control = 4;
2104 sony_toc.tracks[totaltracks].track = 1;
2105 sony_toc.tracks[totaltracks].
2106 track_start_msf[0] = 0;
2107 sony_toc.tracks[totaltracks].
2108 track_start_msf[1] = 2;
2109 sony_toc.tracks[totaltracks].
2110 track_start_msf[2] = 0;
2111 mint = maxt = 1;
2112 totaltracks++;
2113 } else
2114
2115 {
2116 int i;
2117 for (i = 0;
2118 i <
2119 1 +
2120 bcd_to_int(single_toc.last_track_num)
2121 -
2122 bcd_to_int(single_toc.
2123 first_track_num);
2124 i++, totaltracks++) {
2125 sony_toc.tracks[totaltracks].
2126 address =
2127 single_toc.tracks[i].address;
2128 sony_toc.tracks[totaltracks].
2129 control =
2130 single_toc.tracks[i].control;
2131 sony_toc.tracks[totaltracks].
2132 track =
2133 bcd_to_int(single_toc.
2134 tracks[i].track);
2135 sony_toc.tracks[totaltracks].
2136 track_start_msf[0] =
2137 bcd_to_int(single_toc.
2138 tracks[i].
2139 track_start_msf[0]);
2140 sony_toc.tracks[totaltracks].
2141 track_start_msf[1] =
2142 bcd_to_int(single_toc.
2143 tracks[i].
2144 track_start_msf[1]);
2145 sony_toc.tracks[totaltracks].
2146 track_start_msf[2] =
2147 bcd_to_int(single_toc.
2148 tracks[i].
2149 track_start_msf[2]);
2150 if (i == 0)
2151 single_toc.
2152 start_track_lba =
2153 msf_to_log(sony_toc.
2154 tracks
2155 [totaltracks].
2156 track_start_msf);
2157 if (mint >
2158 sony_toc.tracks[totaltracks].
2159 track)
2160 mint =
2161 sony_toc.
2162 tracks[totaltracks].
2163 track;
2164 if (maxt <
2165 sony_toc.tracks[totaltracks].
2166 track)
2167 maxt =
2168 sony_toc.
2169 tracks[totaltracks].
2170 track;
2171 }
2172 }
2173 sony_toc.first_track_num = mint;
2174 sony_toc.last_track_num = maxt;
2175
2176
2177
2178
2179
2180
2181 sony_toc.disk_type = single_toc.disk_type;
2182 sony_toc.sessions = session;
2183
2184
2185 if (session == 1)
2186 single_toc.start_track_lba = 0;
2187 sony_toc.start_track_lba =
2188 single_toc.start_track_lba;
2189
2190 if (session > 1 && single_toc.pointb0 == 0xb0 &&
2191 sony_toc.lead_out_start_lba ==
2192 single_toc.lead_out_start_lba) {
2193 break;
2194 }
2195
2196
2197 if (session > 40) {
2198 printk("cdu31a: too many sessions: %d\n",
2199 session);
2200 break;
2201 }
2202 session++;
2203 }
2204 sony_toc.track_entries = totaltracks;
2205
2206 sony_toc.tracks[totaltracks].address = single_toc.address2;
2207 sony_toc.tracks[totaltracks].control = single_toc.control2;
2208 sony_toc.tracks[totaltracks].track = CDROM_LEADOUT;
2209 sony_toc.tracks[totaltracks].track_start_msf[0] =
2210 sony_toc.lead_out_start_msf[0];
2211 sony_toc.tracks[totaltracks].track_start_msf[1] =
2212 sony_toc.lead_out_start_msf[1];
2213 sony_toc.tracks[totaltracks].track_start_msf[2] =
2214 sony_toc.lead_out_start_msf[2];
2215
2216 sony_toc_read = 1;
2217#undef DEBUG
2218#if DEBUG
2219 printk
2220 ("Disk session %d, start track: %d, stop track: %d\n",
2221 session, single_toc.start_track_lba,
2222 single_toc.lead_out_start_lba);
2223#endif
2224 }
2225#if DEBUG
2226 printk("Leaving sony_get_toc\n");
2227#endif
2228}
2229
2230
2231
2232
2233
2234
2235static int scd_get_last_session(struct cdrom_device_info *cdi,
2236 struct cdrom_multisession *ms_info)
2237{
2238 if (ms_info == NULL)
2239 return 1;
2240
2241 if (!sony_toc_read)
2242 sony_get_toc();
2243
2244 ms_info->addr_format = CDROM_LBA;
2245 ms_info->addr.lba = sony_toc.start_track_lba;
2246 ms_info->xa_flag = sony_toc.disk_type == SONY_XA_DISK_TYPE ||
2247 sony_toc.disk_type == 0x10 ;
2248
2249 return 0;
2250}
2251
2252
2253
2254
2255static int find_track(int track)
2256{
2257 int i;
2258
2259 for (i = 0; i <= sony_toc.track_entries; i++) {
2260 if (sony_toc.tracks[i].track == track) {
2261 return i;
2262 }
2263 }
2264
2265 return -1;
2266}
2267
2268
2269
2270
2271
2272static int read_subcode(void)
2273{
2274 unsigned int res_size;
2275
2276
2277 do_sony_cd_cmd(SONY_REQ_SUBCODE_ADDRESS_CMD,
2278 NULL,
2279 0, (unsigned char *) &last_sony_subcode, &res_size);
2280 if ((res_size < 2)
2281 || ((last_sony_subcode.exec_status[0] & 0xf0) == 0x20)) {
2282 printk("Sony CDROM error %s (read_subcode)\n",
2283 translate_error(last_sony_subcode.exec_status[1]));
2284 return -EIO;
2285 }
2286
2287 last_sony_subcode.track_num =
2288 bcd_to_int(last_sony_subcode.track_num);
2289 last_sony_subcode.index_num =
2290 bcd_to_int(last_sony_subcode.index_num);
2291 last_sony_subcode.abs_msf[0] =
2292 bcd_to_int(last_sony_subcode.abs_msf[0]);
2293 last_sony_subcode.abs_msf[1] =
2294 bcd_to_int(last_sony_subcode.abs_msf[1]);
2295 last_sony_subcode.abs_msf[2] =
2296 bcd_to_int(last_sony_subcode.abs_msf[2]);
2297
2298 last_sony_subcode.rel_msf[0] =
2299 bcd_to_int(last_sony_subcode.rel_msf[0]);
2300 last_sony_subcode.rel_msf[1] =
2301 bcd_to_int(last_sony_subcode.rel_msf[1]);
2302 last_sony_subcode.rel_msf[2] =
2303 bcd_to_int(last_sony_subcode.rel_msf[2]);
2304 return 0;
2305}
2306
2307
2308
2309
2310
2311static int
2312scd_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn)
2313{
2314 unsigned char resbuffer[2 + 14];
2315 unsigned char *mcnp = mcn->medium_catalog_number;
2316 unsigned char *resp = resbuffer + 3;
2317 unsigned int res_size;
2318
2319 memset(mcn->medium_catalog_number, 0, 14);
2320 do_sony_cd_cmd(SONY_REQ_UPC_EAN_CMD,
2321 NULL, 0, resbuffer, &res_size);
2322 if ((res_size < 2) || ((resbuffer[0] & 0xf0) == 0x20));
2323 else {
2324
2325 *mcnp++ = (*resp >> 4) + '0';
2326 *mcnp++ = (*resp++ & 0x0f) + '0';
2327 *mcnp++ = (*resp >> 4) + '0';
2328 *mcnp++ = (*resp++ & 0x0f) + '0';
2329 *mcnp++ = (*resp >> 4) + '0';
2330 *mcnp++ = (*resp++ & 0x0f) + '0';
2331 *mcnp++ = (*resp >> 4) + '0';
2332 *mcnp++ = (*resp++ & 0x0f) + '0';
2333 *mcnp++ = (*resp >> 4) + '0';
2334 *mcnp++ = (*resp++ & 0x0f) + '0';
2335 *mcnp++ = (*resp >> 4) + '0';
2336 *mcnp++ = (*resp++ & 0x0f) + '0';
2337 *mcnp++ = (*resp >> 4) + '0';
2338 }
2339 *mcnp = '\0';
2340 return 0;
2341}
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351static int sony_get_subchnl_info(struct cdrom_subchnl *schi)
2352{
2353
2354 while (handle_sony_cd_attention());
2355
2356 sony_get_toc();
2357 if (!sony_toc_read) {
2358 return -EIO;
2359 }
2360
2361 switch (sony_audio_status) {
2362 case CDROM_AUDIO_NO_STATUS:
2363 case CDROM_AUDIO_PLAY:
2364 if (read_subcode() < 0) {
2365 return -EIO;
2366 }
2367 break;
2368
2369 case CDROM_AUDIO_PAUSED:
2370 case CDROM_AUDIO_COMPLETED:
2371 break;
2372
2373#if 0
2374 case CDROM_AUDIO_NO_STATUS:
2375 schi->cdsc_audiostatus = sony_audio_status;
2376 return 0;
2377 break;
2378#endif
2379 case CDROM_AUDIO_INVALID:
2380 case CDROM_AUDIO_ERROR:
2381 default:
2382 return -EIO;
2383 }
2384
2385 schi->cdsc_audiostatus = sony_audio_status;
2386 schi->cdsc_adr = last_sony_subcode.address;
2387 schi->cdsc_ctrl = last_sony_subcode.control;
2388 schi->cdsc_trk = last_sony_subcode.track_num;
2389 schi->cdsc_ind = last_sony_subcode.index_num;
2390 if (schi->cdsc_format == CDROM_MSF) {
2391 schi->cdsc_absaddr.msf.minute =
2392 last_sony_subcode.abs_msf[0];
2393 schi->cdsc_absaddr.msf.second =
2394 last_sony_subcode.abs_msf[1];
2395 schi->cdsc_absaddr.msf.frame =
2396 last_sony_subcode.abs_msf[2];
2397
2398 schi->cdsc_reladdr.msf.minute =
2399 last_sony_subcode.rel_msf[0];
2400 schi->cdsc_reladdr.msf.second =
2401 last_sony_subcode.rel_msf[1];
2402 schi->cdsc_reladdr.msf.frame =
2403 last_sony_subcode.rel_msf[2];
2404 } else if (schi->cdsc_format == CDROM_LBA) {
2405 schi->cdsc_absaddr.lba =
2406 msf_to_log(last_sony_subcode.abs_msf);
2407 schi->cdsc_reladdr.lba =
2408 msf_to_log(last_sony_subcode.rel_msf);
2409 }
2410
2411 return 0;
2412}
2413
2414
2415
2416
2417
2418static void
2419read_audio_data(char *buffer, unsigned char res_reg[], int *res_size)
2420{
2421 unsigned int retry_count;
2422 int result_read;
2423
2424
2425 res_reg[0] = 0;
2426 res_reg[1] = 0;
2427 *res_size = 0;
2428 result_read = 0;
2429
2430
2431 retry_count = jiffies + SONY_JIFFIES_TIMEOUT;
2432 continue_read_audio_wait:
2433 while (time_before(jiffies, retry_count) && !(is_data_ready())
2434 && !(is_result_ready() || result_read)) {
2435 while (handle_sony_cd_attention());
2436
2437 sony_sleep();
2438 }
2439 if (!(is_data_ready())) {
2440 if (is_result_ready() && !result_read) {
2441 get_result(res_reg, res_size);
2442
2443
2444 if ((res_reg[0] & 0xf0) == 0x50) {
2445 result_read = 1;
2446 goto continue_read_audio_wait;
2447 }
2448
2449 else if ((res_reg[0] & 0xf0) != 0x20) {
2450 printk
2451 ("CDU31A: Got result that should have been error: %d\n",
2452 res_reg[0]);
2453 res_reg[0] = 0x20;
2454 res_reg[1] = SONY_BAD_DATA_ERR;
2455 *res_size = 2;
2456 }
2457 abort_read();
2458 } else {
2459#if DEBUG
2460 printk("CDU31A timeout out %d\n", __LINE__);
2461#endif
2462 res_reg[0] = 0x20;
2463 res_reg[1] = SONY_TIMEOUT_OP_ERR;
2464 *res_size = 2;
2465 abort_read();
2466 }
2467 } else {
2468 clear_data_ready();
2469
2470
2471 if (sony_raw_data_mode) {
2472 insb(sony_cd_read_reg, buffer + CD_XA_HEAD,
2473 CD_FRAMESIZE_RAW1);
2474 } else {
2475
2476 insb(sony_cd_read_reg, buffer, CD_FRAMESIZE_RAW);
2477 }
2478
2479
2480 if (!result_read) {
2481
2482 retry_count = jiffies + SONY_JIFFIES_TIMEOUT;
2483 while (time_before(jiffies, retry_count)
2484 && !(is_result_ready())) {
2485 while (handle_sony_cd_attention());
2486
2487 sony_sleep();
2488 }
2489
2490 if (!is_result_ready()) {
2491#if DEBUG
2492 printk("CDU31A timeout out %d\n",
2493 __LINE__);
2494#endif
2495 res_reg[0] = 0x20;
2496 res_reg[1] = SONY_TIMEOUT_OP_ERR;
2497 *res_size = 2;
2498 abort_read();
2499 return;
2500 } else {
2501 get_result(res_reg, res_size);
2502 }
2503 }
2504
2505 if ((res_reg[0] & 0xf0) == 0x50) {
2506 if ((res_reg[0] == SONY_NO_CIRC_ERR_BLK_STAT)
2507 || (res_reg[0] == SONY_NO_LECC_ERR_BLK_STAT)
2508 || (res_reg[0] == SONY_RECOV_LECC_ERR_BLK_STAT)
2509 || (res_reg[0] == SONY_NO_ERR_DETECTION_STAT)) {
2510
2511 } else {
2512 printk("CDU31A: Data block error: 0x%x\n",
2513 res_reg[0]);
2514 res_reg[0] = 0x20;
2515 res_reg[1] = SONY_BAD_DATA_ERR;
2516 *res_size = 2;
2517 }
2518 } else if ((res_reg[0] & 0xf0) != 0x20) {
2519
2520
2521 printk("CDU31A: Invalid block status: 0x%x\n",
2522 res_reg[0]);
2523 restart_on_error();
2524 res_reg[0] = 0x20;
2525 res_reg[1] = SONY_BAD_DATA_ERR;
2526 *res_size = 2;
2527 }
2528 }
2529}
2530
2531
2532
2533static int read_audio(struct cdrom_read_audio *ra)
2534{
2535 int retval;
2536 unsigned char params[2];
2537 unsigned char res_reg[12];
2538 unsigned int res_size;
2539 unsigned int cframe;
2540 unsigned long flags;
2541
2542
2543
2544
2545
2546 save_flags(flags);
2547 cli();
2548 while (sony_inuse) {
2549 interruptible_sleep_on(&sony_wait);
2550 if (signal_pending(current)) {
2551 restore_flags(flags);
2552 return -EAGAIN;
2553 }
2554 }
2555 sony_inuse = 1;
2556 has_cd_task = current;
2557 restore_flags(flags);
2558
2559 if (!sony_spun_up) {
2560 scd_spinup();
2561 }
2562
2563
2564 params[0] = SONY_SD_DECODE_PARAM;
2565 params[1] = 0x06 | sony_raw_data_mode;
2566 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD,
2567 params, 2, res_reg, &res_size);
2568 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20)) {
2569 printk("CDU31A: Unable to set decode params: 0x%2.2x\n",
2570 res_reg[1]);
2571 return -EIO;
2572 }
2573
2574
2575
2576
2577
2578 retval = 0;
2579
2580 if (start_request(ra->addr.lba, ra->nframes, 1)) {
2581 retval = -EIO;
2582 goto exit_read_audio;
2583 }
2584
2585
2586 cframe = 0;
2587 while (cframe < ra->nframes) {
2588 read_audio_data(readahead_buffer, res_reg, &res_size);
2589 if ((res_reg[0] & 0xf0) == 0x20) {
2590 if (res_reg[1] == SONY_BAD_DATA_ERR) {
2591 printk
2592 ("CDU31A: Data error on audio sector %d\n",
2593 ra->addr.lba + cframe);
2594 } else if (res_reg[1] == SONY_ILL_TRACK_R_ERR) {
2595
2596 sony_raw_data_mode =
2597 (sony_raw_data_mode) ? 0 : 1;
2598
2599
2600 params[0] = SONY_SD_DECODE_PARAM;
2601 params[1] = 0x06 | sony_raw_data_mode;
2602 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD,
2603 params,
2604 2, res_reg, &res_size);
2605 if ((res_size < 2)
2606 || ((res_reg[0] & 0xf0) == 0x20)) {
2607 printk
2608 ("CDU31A: Unable to set decode params: 0x%2.2x\n",
2609 res_reg[1]);
2610 retval = -EIO;
2611 goto exit_read_audio;
2612 }
2613
2614
2615 if (start_request
2616 (ra->addr.lba + cframe,
2617 ra->nframes - cframe, 1)) {
2618 retval = -EIO;
2619 goto exit_read_audio;
2620 }
2621
2622
2623
2624
2625 read_audio_data(readahead_buffer, res_reg,
2626 &res_size);
2627 if ((res_reg[0] & 0xf0) == 0x20) {
2628 if (res_reg[1] ==
2629 SONY_BAD_DATA_ERR) {
2630 printk
2631 ("CDU31A: Data error on audio sector %d\n",
2632 ra->addr.lba +
2633 cframe);
2634 } else {
2635 printk
2636 ("CDU31A: Error reading audio data on sector %d: %s\n",
2637 ra->addr.lba + cframe,
2638 translate_error
2639 (res_reg[1]));
2640 retval = -EIO;
2641 goto exit_read_audio;
2642 }
2643 } else {
2644 copy_to_user((char *) (ra->buf +
2645 (CD_FRAMESIZE_RAW
2646 * cframe)),
2647 (char *)
2648 readahead_buffer,
2649 CD_FRAMESIZE_RAW);
2650 }
2651 } else {
2652 printk
2653 ("CDU31A: Error reading audio data on sector %d: %s\n",
2654 ra->addr.lba + cframe,
2655 translate_error(res_reg[1]));
2656 retval = -EIO;
2657 goto exit_read_audio;
2658 }
2659 } else {
2660 copy_to_user((char *) (ra->buf +
2661 (CD_FRAMESIZE_RAW *
2662 cframe)),
2663 (char *) readahead_buffer,
2664 CD_FRAMESIZE_RAW);
2665 }
2666
2667 cframe++;
2668 }
2669
2670 get_result(res_reg, &res_size);
2671 if ((res_reg[0] & 0xf0) == 0x20) {
2672 printk("CDU31A: Error return from audio read: %s\n",
2673 translate_error(res_reg[1]));
2674 retval = -EIO;
2675 goto exit_read_audio;
2676 }
2677
2678 exit_read_audio:
2679
2680
2681 params[0] = SONY_SD_DECODE_PARAM;
2682 if (!sony_xa_mode) {
2683 params[1] = 0x0f;
2684 } else {
2685 params[1] = 0x07;
2686 }
2687 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD,
2688 params, 2, res_reg, &res_size);
2689 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20)) {
2690 printk("CDU31A: Unable to reset decode params: 0x%2.2x\n",
2691 res_reg[1]);
2692 return -EIO;
2693 }
2694
2695 has_cd_task = NULL;
2696 sony_inuse = 0;
2697 wake_up_interruptible(&sony_wait);
2698
2699 return (retval);
2700}
2701
2702static int
2703do_sony_cd_cmd_chk(const char *name,
2704 unsigned char cmd,
2705 unsigned char *params,
2706 unsigned int num_params,
2707 unsigned char *result_buffer, unsigned int *result_size)
2708{
2709 do_sony_cd_cmd(cmd, params, num_params, result_buffer,
2710 result_size);
2711 if ((*result_size < 2) || ((result_buffer[0] & 0xf0) == 0x20)) {
2712 printk("Sony CDROM error %s (CDROM%s)\n",
2713 translate_error(result_buffer[1]), name);
2714 return -EIO;
2715 }
2716 return 0;
2717}
2718
2719
2720
2721
2722
2723static int scd_tray_move(struct cdrom_device_info *cdi, int position)
2724{
2725 if (position == 1 ) {
2726 unsigned char res_reg[12];
2727 unsigned int res_size;
2728
2729 do_sony_cd_cmd(SONY_AUDIO_STOP_CMD, NULL, 0, res_reg,
2730 &res_size);
2731 do_sony_cd_cmd(SONY_SPIN_DOWN_CMD, NULL, 0, res_reg,
2732 &res_size);
2733
2734 sony_audio_status = CDROM_AUDIO_INVALID;
2735 return do_sony_cd_cmd_chk("EJECT", SONY_EJECT_CMD, NULL, 0,
2736 res_reg, &res_size);
2737 } else {
2738 if (0 == scd_spinup())
2739 sony_spun_up = 1;
2740 return 0;
2741 }
2742}
2743
2744
2745
2746
2747static int scd_audio_ioctl(struct cdrom_device_info *cdi,
2748 unsigned int cmd, void *arg)
2749{
2750 unsigned char res_reg[12];
2751 unsigned int res_size;
2752 unsigned char params[7];
2753 int i;
2754
2755
2756 switch (cmd) {
2757 case CDROMSTART:
2758 return do_sony_cd_cmd_chk("START", SONY_SPIN_UP_CMD, NULL,
2759 0, res_reg, &res_size);
2760 break;
2761
2762 case CDROMSTOP:
2763 do_sony_cd_cmd(SONY_AUDIO_STOP_CMD, NULL, 0, res_reg,
2764 &res_size);
2765
2766
2767
2768
2769
2770 sony_audio_status = CDROM_AUDIO_NO_STATUS;
2771 return do_sony_cd_cmd_chk("STOP", SONY_SPIN_DOWN_CMD, NULL,
2772 0, res_reg, &res_size);
2773
2774 case CDROMPAUSE:
2775 if (do_sony_cd_cmd_chk
2776 ("PAUSE", SONY_AUDIO_STOP_CMD, NULL, 0, res_reg,
2777 &res_size))
2778 return -EIO;
2779
2780 if (read_subcode() < 0) {
2781 return -EIO;
2782 }
2783 cur_pos_msf[0] = last_sony_subcode.abs_msf[0];
2784 cur_pos_msf[1] = last_sony_subcode.abs_msf[1];
2785 cur_pos_msf[2] = last_sony_subcode.abs_msf[2];
2786 sony_audio_status = CDROM_AUDIO_PAUSED;
2787 return 0;
2788 break;
2789
2790 case CDROMRESUME:
2791 if (sony_audio_status != CDROM_AUDIO_PAUSED) {
2792 return -EINVAL;
2793 }
2794
2795 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg,
2796 &res_size);
2797
2798
2799 params[1] = int_to_bcd(cur_pos_msf[0]);
2800 params[2] = int_to_bcd(cur_pos_msf[1]);
2801 params[3] = int_to_bcd(cur_pos_msf[2]);
2802 params[4] = int_to_bcd(final_pos_msf[0]);
2803 params[5] = int_to_bcd(final_pos_msf[1]);
2804 params[6] = int_to_bcd(final_pos_msf[2]);
2805 params[0] = 0x03;
2806 if (do_sony_cd_cmd_chk
2807 ("RESUME", SONY_AUDIO_PLAYBACK_CMD, params, 7, res_reg,
2808 &res_size) < 0)
2809 return -EIO;
2810 sony_audio_status = CDROM_AUDIO_PLAY;
2811 return 0;
2812
2813 case CDROMPLAYMSF:
2814 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg,
2815 &res_size);
2816
2817
2818 for (i = 1; i < 7; i++) {
2819 params[i] =
2820 int_to_bcd(((unsigned char *) arg)[i - 1]);
2821 }
2822 params[0] = 0x03;
2823 if (do_sony_cd_cmd_chk
2824 ("PLAYMSF", SONY_AUDIO_PLAYBACK_CMD, params, 7,
2825 res_reg, &res_size) < 0)
2826 return -EIO;
2827
2828
2829 final_pos_msf[0] = bcd_to_int(params[4]);
2830 final_pos_msf[1] = bcd_to_int(params[5]);
2831 final_pos_msf[2] = bcd_to_int(params[6]);
2832 sony_audio_status = CDROM_AUDIO_PLAY;
2833 return 0;
2834
2835 case CDROMREADTOCHDR:
2836 {
2837 struct cdrom_tochdr *hdr;
2838
2839 sony_get_toc();
2840 if (!sony_toc_read) {
2841 return -EIO;
2842 }
2843
2844 hdr = (struct cdrom_tochdr *) arg;
2845 hdr->cdth_trk0 = sony_toc.first_track_num;
2846 hdr->cdth_trk1 = sony_toc.last_track_num;
2847 }
2848 return 0;
2849
2850 case CDROMREADTOCENTRY:
2851 {
2852 struct cdrom_tocentry *entry;
2853 int track_idx;
2854 unsigned char *msf_val = NULL;
2855
2856 sony_get_toc();
2857 if (!sony_toc_read) {
2858 return -EIO;
2859 }
2860
2861 entry = (struct cdrom_tocentry *) arg;
2862
2863 track_idx = find_track(entry->cdte_track);
2864 if (track_idx < 0) {
2865 return -EINVAL;
2866 }
2867
2868 entry->cdte_adr =
2869 sony_toc.tracks[track_idx].address;
2870 entry->cdte_ctrl =
2871 sony_toc.tracks[track_idx].control;
2872 msf_val =
2873 sony_toc.tracks[track_idx].track_start_msf;
2874
2875
2876 if (entry->cdte_format == CDROM_LBA) {
2877 entry->cdte_addr.lba = msf_to_log(msf_val);
2878 } else if (entry->cdte_format == CDROM_MSF) {
2879 entry->cdte_addr.msf.minute = *msf_val;
2880 entry->cdte_addr.msf.second =
2881 *(msf_val + 1);
2882 entry->cdte_addr.msf.frame =
2883 *(msf_val + 2);
2884 }
2885 }
2886 return 0;
2887 break;
2888
2889 case CDROMPLAYTRKIND:
2890 {
2891 struct cdrom_ti *ti = (struct cdrom_ti *) arg;
2892 int track_idx;
2893
2894 sony_get_toc();
2895 if (!sony_toc_read) {
2896 return -EIO;
2897 }
2898
2899 if ((ti->cdti_trk0 < sony_toc.first_track_num)
2900 || (ti->cdti_trk0 > sony_toc.last_track_num)
2901 || (ti->cdti_trk1 < ti->cdti_trk0)) {
2902 return -EINVAL;
2903 }
2904
2905 track_idx = find_track(ti->cdti_trk0);
2906 if (track_idx < 0) {
2907 return -EINVAL;
2908 }
2909 params[1] =
2910 int_to_bcd(sony_toc.tracks[track_idx].
2911 track_start_msf[0]);
2912 params[2] =
2913 int_to_bcd(sony_toc.tracks[track_idx].
2914 track_start_msf[1]);
2915 params[3] =
2916 int_to_bcd(sony_toc.tracks[track_idx].
2917 track_start_msf[2]);
2918
2919
2920
2921
2922
2923 if (ti->cdti_trk1 >= sony_toc.last_track_num) {
2924 track_idx = find_track(CDROM_LEADOUT);
2925 } else {
2926 track_idx = find_track(ti->cdti_trk1 + 1);
2927 }
2928 if (track_idx < 0) {
2929 return -EINVAL;
2930 }
2931 params[4] =
2932 int_to_bcd(sony_toc.tracks[track_idx].
2933 track_start_msf[0]);
2934 params[5] =
2935 int_to_bcd(sony_toc.tracks[track_idx].
2936 track_start_msf[1]);
2937 params[6] =
2938 int_to_bcd(sony_toc.tracks[track_idx].
2939 track_start_msf[2]);
2940 params[0] = 0x03;
2941
2942 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg,
2943 &res_size);
2944
2945 do_sony_cd_cmd(SONY_AUDIO_PLAYBACK_CMD, params, 7,
2946 res_reg, &res_size);
2947
2948 if ((res_size < 2)
2949 || ((res_reg[0] & 0xf0) == 0x20)) {
2950 printk("Params: %x %x %x %x %x %x %x\n",
2951 params[0], params[1], params[2],
2952 params[3], params[4], params[5],
2953 params[6]);
2954 printk
2955 ("Sony CDROM error %s (CDROMPLAYTRKIND)\n",
2956 translate_error(res_reg[1]));
2957 return -EIO;
2958 }
2959
2960
2961 final_pos_msf[0] = bcd_to_int(params[4]);
2962 final_pos_msf[1] = bcd_to_int(params[5]);
2963 final_pos_msf[2] = bcd_to_int(params[6]);
2964 sony_audio_status = CDROM_AUDIO_PLAY;
2965 return 0;
2966 }
2967
2968 case CDROMVOLCTRL:
2969 {
2970 struct cdrom_volctrl *volctrl =
2971 (struct cdrom_volctrl *) arg;
2972
2973 params[0] = SONY_SD_AUDIO_VOLUME;
2974 params[1] = volctrl->channel0;
2975 params[2] = volctrl->channel1;
2976 return do_sony_cd_cmd_chk("VOLCTRL",
2977 SONY_SET_DRIVE_PARAM_CMD,
2978 params, 3, res_reg,
2979 &res_size);
2980 }
2981 case CDROMSUBCHNL:
2982 return sony_get_subchnl_info((struct cdrom_subchnl *) arg);
2983
2984 default:
2985 return -EINVAL;
2986 }
2987}
2988
2989static int scd_dev_ioctl(struct cdrom_device_info *cdi,
2990 unsigned int cmd, unsigned long arg)
2991{
2992 int i;
2993
2994 switch (cmd) {
2995 case CDROMREADAUDIO:
2996
2997 {
2998 struct cdrom_read_audio ra;
2999
3000
3001 sony_get_toc();
3002 if (!sony_toc_read) {
3003 return -EIO;
3004 }
3005
3006 if (copy_from_user(&ra, (char *) arg, sizeof(ra)))
3007 return -EFAULT;
3008
3009 if (ra.nframes == 0) {
3010 return 0;
3011 }
3012
3013 i = verify_area(VERIFY_WRITE, ra.buf,
3014 CD_FRAMESIZE_RAW * ra.nframes);
3015 if (i < 0)
3016 return i;
3017
3018 if (ra.addr_format == CDROM_LBA) {
3019 if ((ra.addr.lba >=
3020 sony_toc.lead_out_start_lba)
3021 || (ra.addr.lba + ra.nframes >=
3022 sony_toc.lead_out_start_lba)) {
3023 return -EINVAL;
3024 }
3025 } else if (ra.addr_format == CDROM_MSF) {
3026 if ((ra.addr.msf.minute >= 75)
3027 || (ra.addr.msf.second >= 60)
3028 || (ra.addr.msf.frame >= 75)) {
3029 return -EINVAL;
3030 }
3031
3032 ra.addr.lba = ((ra.addr.msf.minute * 4500)
3033 + (ra.addr.msf.second * 75)
3034 + ra.addr.msf.frame);
3035 if ((ra.addr.lba >=
3036 sony_toc.lead_out_start_lba)
3037 || (ra.addr.lba + ra.nframes >=
3038 sony_toc.lead_out_start_lba)) {
3039 return -EINVAL;
3040 }
3041
3042
3043
3044
3045 ra.addr.lba -= LOG_START_OFFSET;
3046 } else {
3047 return -EINVAL;
3048 }
3049
3050 return (read_audio(&ra));
3051 }
3052 return 0;
3053 break;
3054
3055 default:
3056 return -EINVAL;
3057 }
3058}
3059
3060static int scd_spinup(void)
3061{
3062 unsigned char res_reg[12];
3063 unsigned int res_size;
3064 int num_spin_ups;
3065
3066 num_spin_ups = 0;
3067
3068 respinup_on_open:
3069 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, &res_size);
3070
3071
3072
3073 if ((res_size < 2) || ((res_reg[0] != 0) && (res_reg[1] != 0))) {
3074 printk("Sony CDROM %s error (scd_open, spin up)\n",
3075 translate_error(res_reg[1]));
3076 return 1;
3077 }
3078
3079 do_sony_cd_cmd(SONY_READ_TOC_CMD, NULL, 0, res_reg, &res_size);
3080
3081
3082
3083 if ((res_size < 2) || ((res_reg[0] != 0) && (res_reg[1] != 0))) {
3084
3085 if ((res_reg[1] == SONY_AUDIO_PLAYING_ERR)
3086 || (res_reg[1] == 0)) {
3087 return 0;
3088 }
3089
3090
3091
3092 if ((res_reg[1] == SONY_NOT_SPIN_ERR)
3093 && (num_spin_ups < MAX_CDU31A_RETRIES)) {
3094 num_spin_ups++;
3095 goto respinup_on_open;
3096 }
3097
3098 printk("Sony CDROM error %s (scd_open, read toc)\n",
3099 translate_error(res_reg[1]));
3100 do_sony_cd_cmd(SONY_SPIN_DOWN_CMD, NULL, 0, res_reg,
3101 &res_size);
3102 return 1;
3103 }
3104 return 0;
3105}
3106
3107
3108
3109
3110
3111static int scd_open(struct cdrom_device_info *cdi, int openmode)
3112{
3113 unsigned char res_reg[12];
3114 unsigned int res_size;
3115 unsigned char params[2];
3116
3117 if (sony_usage == 0) {
3118 if (scd_spinup() != 0)
3119 return -EIO;
3120 sony_get_toc();
3121 if (!sony_toc_read) {
3122 do_sony_cd_cmd(SONY_SPIN_DOWN_CMD, NULL, 0,
3123 res_reg, &res_size);
3124 return -EIO;
3125 }
3126
3127
3128
3129
3130 if ((sony_toc.disk_type != 0x00)
3131 && (!is_double_speed)) {
3132 params[0] = SONY_SD_DECODE_PARAM;
3133 params[1] = 0x07;
3134 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD,
3135 params, 2, res_reg, &res_size);
3136 if ((res_size < 2)
3137 || ((res_reg[0] & 0xf0) == 0x20)) {
3138 printk
3139 ("CDU31A: Unable to set XA params: 0x%2.2x\n",
3140 res_reg[1]);
3141 }
3142 sony_xa_mode = 1;
3143 }
3144
3145 else if (sony_xa_mode) {
3146 params[0] = SONY_SD_DECODE_PARAM;
3147 params[1] = 0x0f;
3148 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD,
3149 params, 2, res_reg, &res_size);
3150 if ((res_size < 2)
3151 || ((res_reg[0] & 0xf0) == 0x20)) {
3152 printk
3153 ("CDU31A: Unable to reset XA params: 0x%2.2x\n",
3154 res_reg[1]);
3155 }
3156 sony_xa_mode = 0;
3157 }
3158
3159 sony_spun_up = 1;
3160 }
3161
3162 sony_usage++;
3163
3164 return 0;
3165}
3166
3167
3168
3169
3170
3171
3172static void scd_release(struct cdrom_device_info *cdi)
3173{
3174 if (sony_usage == 1) {
3175 unsigned char res_reg[12];
3176 unsigned int res_size;
3177
3178 do_sony_cd_cmd(SONY_SPIN_DOWN_CMD, NULL, 0, res_reg,
3179 &res_size);
3180
3181 sony_spun_up = 0;
3182 }
3183 sony_usage--;
3184}
3185
3186struct block_device_operations scd_bdops =
3187{
3188 owner: THIS_MODULE,
3189 open: cdrom_open,
3190 release: cdrom_release,
3191 ioctl: cdrom_ioctl,
3192 check_media_change: cdrom_media_changed,
3193};
3194
3195static struct cdrom_device_ops scd_dops = {
3196 open:scd_open,
3197 release:scd_release,
3198 drive_status:scd_drive_status,
3199 media_changed:scd_media_changed,
3200 tray_move:scd_tray_move,
3201 lock_door:scd_lock_door,
3202 select_speed:scd_select_speed,
3203 get_last_session:scd_get_last_session,
3204 get_mcn:scd_get_mcn,
3205 reset:scd_reset,
3206 audio_ioctl:scd_audio_ioctl,
3207 dev_ioctl:scd_dev_ioctl,
3208 capability:CDC_OPEN_TRAY | CDC_CLOSE_TRAY | CDC_LOCK |
3209 CDC_SELECT_SPEED | CDC_MULTI_SESSION |
3210 CDC_MULTI_SESSION | CDC_MCN |
3211 CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO |
3212 CDC_RESET | CDC_IOCTLS | CDC_DRIVE_STATUS,
3213 n_minors:1,
3214};
3215
3216static struct cdrom_device_info scd_info = {
3217 ops:&scd_dops,
3218 speed:2,
3219 capacity:1,
3220 name:"cdu31a"
3221};
3222
3223
3224static char *load_mech[] __initdata =
3225 { "caddy", "tray", "pop-up", "unknown" };
3226
3227static void __init
3228get_drive_configuration(unsigned short base_io,
3229 unsigned char res_reg[], unsigned int *res_size)
3230{
3231 int retry_count;
3232
3233
3234
3235 cdu31a_port = base_io;
3236
3237
3238 sony_cd_cmd_reg = cdu31a_port + SONY_CMD_REG_OFFSET;
3239 sony_cd_param_reg = cdu31a_port + SONY_PARAM_REG_OFFSET;
3240 sony_cd_write_reg = cdu31a_port + SONY_WRITE_REG_OFFSET;
3241 sony_cd_control_reg = cdu31a_port + SONY_CONTROL_REG_OFFSET;
3242 sony_cd_status_reg = cdu31a_port + SONY_STATUS_REG_OFFSET;
3243 sony_cd_result_reg = cdu31a_port + SONY_RESULT_REG_OFFSET;
3244 sony_cd_read_reg = cdu31a_port + SONY_READ_REG_OFFSET;
3245 sony_cd_fifost_reg = cdu31a_port + SONY_FIFOST_REG_OFFSET;
3246
3247
3248
3249
3250
3251
3252 if (read_status_register() != 0xff) {
3253
3254
3255
3256
3257 reset_drive();
3258 retry_count = jiffies + SONY_RESET_TIMEOUT;
3259 while (time_before(jiffies, retry_count)
3260 && (!is_attention())) {
3261 sony_sleep();
3262 }
3263
3264#if 0
3265
3266 if (!is_attention()) {
3267 res_reg[0] = 0x20;
3268 return;
3269 }
3270#endif
3271
3272
3273
3274
3275 do_sony_cd_cmd(SONY_REQ_DRIVE_CONFIG_CMD,
3276 NULL,
3277 0, (unsigned char *) res_reg, res_size);
3278 return;
3279 }
3280
3281
3282 res_reg[0] = 0x20;
3283}
3284
3285#ifndef MODULE
3286
3287
3288
3289
3290
3291static int __init cdu31a_setup(char *strings)
3292{
3293 int ints[4];
3294
3295 (void) get_options(strings, ARRAY_SIZE(ints), ints);
3296
3297 if (ints[0] > 0) {
3298 cdu31a_port = ints[1];
3299 }
3300 if (ints[0] > 1) {
3301 cdu31a_irq = ints[2];
3302 }
3303 if ((strings != NULL) && (*strings != '\0')) {
3304 if (strcmp(strings, "PAS") == 0) {
3305 sony_pas_init = 1;
3306 } else {
3307 printk("CDU31A: Unknown interface type: %s\n",
3308 strings);
3309 }
3310 }
3311
3312 return 1;
3313}
3314
3315__setup("cdu31a=", cdu31a_setup);
3316
3317#endif
3318
3319static int cdu31a_block_size;
3320
3321
3322
3323
3324int __init cdu31a_init(void)
3325{
3326 struct s_sony_drive_config drive_config;
3327 unsigned int res_size;
3328 char msg[255];
3329 char buf[40];
3330 int i;
3331 int drive_found;
3332 int tmp_irq;
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342 if (sony_pas_init) {
3343 outb(0xbc, 0x9a01);
3344 outb(0xe2, 0x9a01);
3345 }
3346
3347 drive_found = 0;
3348
3349
3350 if (cdu31a_port == 0xffff) {
3351 } else if (cdu31a_port != 0) {
3352 tmp_irq = cdu31a_irq;
3353 cdu31a_irq = 0;
3354
3355 get_drive_configuration(cdu31a_port,
3356 drive_config.exec_status,
3357 &res_size);
3358 if ((res_size > 2)
3359 && ((drive_config.exec_status[0] & 0xf0) == 0x00)) {
3360 drive_found = 1;
3361 }
3362
3363 cdu31a_irq = tmp_irq;
3364 } else {
3365 cdu31a_irq = 0;
3366 i = 0;
3367 while ((cdu31a_addresses[i].base != 0)
3368 && (!drive_found)) {
3369 if (check_region(cdu31a_addresses[i].base, 4)) {
3370 i++;
3371 continue;
3372 }
3373 get_drive_configuration(cdu31a_addresses[i].base,
3374 drive_config.exec_status,
3375 &res_size);
3376 if ((res_size > 2)
3377 && ((drive_config.exec_status[0] & 0xf0) ==
3378 0x00)) {
3379 drive_found = 1;
3380 cdu31a_irq = cdu31a_addresses[i].int_num;
3381 } else {
3382 i++;
3383 }
3384 }
3385 }
3386
3387 if (drive_found) {
3388 int deficiency = 0;
3389
3390 if (!request_region(cdu31a_port, 4, "cdu31a"))
3391 goto errout3;
3392
3393 if (devfs_register_blkdev(MAJOR_NR, "cdu31a", &scd_bdops)) {
3394 printk("Unable to get major %d for CDU-31a\n",
3395 MAJOR_NR);
3396 goto errout2;
3397 }
3398
3399 if (SONY_HWC_DOUBLE_SPEED(drive_config)) {
3400 is_double_speed = 1;
3401 }
3402
3403 tmp_irq = cdu31a_irq;
3404 cdu31a_irq = 0;
3405
3406 set_drive_params(sony_speed);
3407
3408 cdu31a_irq = tmp_irq;
3409
3410 if (cdu31a_irq > 0) {
3411 if (request_irq
3412 (cdu31a_irq, cdu31a_interrupt, SA_INTERRUPT,
3413 "cdu31a", NULL)) {
3414 printk
3415 ("Unable to grab IRQ%d for the CDU31A driver\n",
3416 cdu31a_irq);
3417 cdu31a_irq = 0;
3418 }
3419 }
3420
3421 sprintf(msg, "Sony I/F CDROM : %8.8s %16.16s %8.8s\n",
3422 drive_config.vendor_id,
3423 drive_config.product_id,
3424 drive_config.product_rev_level);
3425 sprintf(buf, " Capabilities: %s",
3426 load_mech[SONY_HWC_GET_LOAD_MECH(drive_config)]);
3427 strcat(msg, buf);
3428 if (SONY_HWC_AUDIO_PLAYBACK(drive_config)) {
3429 strcat(msg, ", audio");
3430 } else
3431 deficiency |= CDC_PLAY_AUDIO;
3432 if (SONY_HWC_EJECT(drive_config)) {
3433 strcat(msg, ", eject");
3434 } else
3435 deficiency |= CDC_OPEN_TRAY;
3436 if (SONY_HWC_LED_SUPPORT(drive_config)) {
3437 strcat(msg, ", LED");
3438 }
3439 if (SONY_HWC_ELECTRIC_VOLUME(drive_config)) {
3440 strcat(msg, ", elec. Vol");
3441 }
3442 if (SONY_HWC_ELECTRIC_VOLUME_CTL(drive_config)) {
3443 strcat(msg, ", sep. Vol");
3444 }
3445 if (is_double_speed) {
3446 strcat(msg, ", double speed");
3447 } else
3448 deficiency |= CDC_SELECT_SPEED;
3449 if (cdu31a_irq > 0) {
3450 sprintf(buf, ", irq %d", cdu31a_irq);
3451 strcat(msg, buf);
3452 }
3453 strcat(msg, "\n");
3454
3455 is_a_cdu31a =
3456 strcmp("CD-ROM CDU31A", drive_config.product_id) == 0;
3457
3458 blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR),
3459 DEVICE_REQUEST);
3460 read_ahead[MAJOR_NR] = CDU31A_READAHEAD;
3461 cdu31a_block_size = 1024;
3462
3463 blksize_size[MAJOR_NR] = &cdu31a_block_size;
3464
3465 init_timer(&cdu31a_abort_timer);
3466 cdu31a_abort_timer.function = handle_abort_timeout;
3467
3468 scd_info.dev = MKDEV(MAJOR_NR, 0);
3469 scd_info.mask = deficiency;
3470 strncpy(scd_info.name, "cdu31a", sizeof(scd_info.name));
3471
3472 if (register_cdrom(&scd_info)) {
3473 goto errout0;
3474 }
3475 devfs_plain_cdrom(&scd_info, &scd_bdops);
3476 }
3477
3478
3479 disk_changed = 1;
3480
3481 if (drive_found) {
3482 return (0);
3483 } else {
3484 goto errout3;
3485 }
3486 errout0:
3487 printk("Unable to register CDU-31a with Uniform cdrom driver\n");
3488 blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR));
3489 if (devfs_unregister_blkdev(MAJOR_NR, "cdu31a")) {
3490 printk("Can't unregister block device for cdu31a\n");
3491 }
3492 errout2:
3493 release_region(cdu31a_port, 4);
3494 errout3:
3495 return -EIO;
3496}
3497
3498
3499void __exit cdu31a_exit(void)
3500{
3501 if (unregister_cdrom(&scd_info)) {
3502 printk
3503 ("Can't unregister cdu31a from Uniform cdrom driver\n");
3504 return;
3505 }
3506 if ((devfs_unregister_blkdev(MAJOR_NR, "cdu31a") == -EINVAL)) {
3507 printk("Can't unregister cdu31a\n");
3508 return;
3509 }
3510
3511 blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR));
3512
3513 if (cdu31a_irq > 0)
3514 free_irq(cdu31a_irq, NULL);
3515
3516 release_region(cdu31a_port, 4);
3517 printk(KERN_INFO "cdu31a module released.\n");
3518}
3519
3520#ifdef MODULE
3521module_init(cdu31a_init);
3522#endif
3523module_exit(cdu31a_exit);
3524
3525MODULE_LICENSE("GPL");
3526EXPORT_NO_SYMBOLS;
3527