This source file includes following definitions.
- scd_disk_change
- enable_interrupts
- disable_interrupts
- cdu31a_interrupt
- sony_sleep
- is_attention
- is_busy
- is_data_ready
- is_data_requested
- is_result_ready
- is_param_write_rdy
- is_result_reg_not_empty
- reset_drive
- clear_attention
- clear_result_ready
- clear_data_ready
- clear_param_reg
- read_status_register
- read_result_register
- read_data_register
- write_param
- write_cmd
- set_drive_params
- restart_on_error
- write_params
- get_result
- do_sony_cd_cmd
- handle_sony_cd_attention
- int_to_bcd
- bcd_to_int
- log_to_msf
- msf_to_log
- size_to_buf
- start_request
- abort_read
- input_data
- read_data_block
- do_cdu31a_request
- mcovlp
- sony_get_toc
- find_track
- read_subcode
- sony_get_subchnl_info
- read_audio_data
- read_audio
- scd_ioctl
- scd_open
- scd_release
- get_drive_configuration
- cdu31a_setup
- cdu31a_init
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
153
154
155 #include <linux/errno.h>
156 #include <linux/signal.h>
157 #include <linux/sched.h>
158 #include <linux/timer.h>
159 #include <linux/fs.h>
160 #include <linux/kernel.h>
161 #include <linux/hdreg.h>
162 #include <linux/genhd.h>
163 #include <linux/ioport.h>
164 #include <linux/string.h>
165 #include <linux/malloc.h>
166
167 #include <asm/system.h>
168 #include <asm/io.h>
169 #include <asm/segment.h>
170 #include <asm/dma.h>
171
172 #include <linux/cdrom.h>
173 #include <linux/cdu31a.h>
174
175 #define MAJOR_NR CDU31A_CDROM_MAJOR
176 #include "blk.h"
177
178 #define DEBUG 0
179
180 #define CDU31A_READAHEAD 64
181 #define CDU31A_MAX_CONSECUTIVE_ATTENTIONS 10
182
183
184 #undef SONY_POLL_EACH_BYTE
185
186
187
188
189
190
191 static struct
192 {
193 unsigned short base;
194 short int_num;
195
196 } cdu31a_addresses[] =
197 {
198 { 0x340, 0 },
199 { 0x1f88, 0 },
200 { 0x230, 0 },
201 { 0x360, 0 },
202 { 0x320, 0 },
203 { 0x330, 0 },
204 { 0x634, 0 },
205 { 0x654, 0 },
206 { 0 }
207 };
208
209 static int handle_sony_cd_attention(void);
210 static int read_subcode(void);
211 static void sony_get_toc(int dev);
212 static int scd_open(struct inode *inode, struct file *filp);
213 static void do_sony_cd_cmd(unsigned char cmd,
214 unsigned char *params,
215 unsigned int num_params,
216 unsigned char *result_buffer,
217 unsigned int *result_size);
218 static void size_to_buf(unsigned int size,
219 unsigned char *buf);
220
221
222 static unsigned int sony_next_block;
223 static unsigned int sony_blocks_left = 0;
224
225
226
227
228
229 static unsigned short sony_cd_base_io = 0;
230
231
232
233
234
235 static volatile unsigned short sony_cd_cmd_reg;
236 static volatile unsigned short sony_cd_param_reg;
237 static volatile unsigned short sony_cd_write_reg;
238 static volatile unsigned short sony_cd_control_reg;
239 static volatile unsigned short sony_cd_status_reg;
240 static volatile unsigned short sony_cd_result_reg;
241 static volatile unsigned short sony_cd_read_reg;
242 static volatile unsigned short sony_cd_fifost_reg;
243
244
245 static int sony_spun_up = 0;
246
247 static int sony_xa_mode = 0;
248
249
250 static int sony_raw_data_mode = 1;
251
252
253 static unsigned int sony_usage = 0;
254
255
256 static struct s_sony_session_toc *(ses_tocs[MAX_TRACKS]);
257
258
259
260 static struct s_sony_subcode * volatile last_sony_subcode;
261
262
263 static volatile int sony_inuse = 0;
264
265
266 static struct wait_queue * sony_wait = NULL;
267
268 static struct task_struct *has_cd_task = NULL;
269
270
271
272 static int is_double_speed = 0;
273
274
275
276
277
278 static volatile int sony_audio_status = CDROM_AUDIO_NO_STATUS;
279
280
281
282
283
284
285
286
287 static unsigned volatile char cur_pos_msf[3] = { 0, 0, 0 };
288 static unsigned volatile char final_pos_msf[3] = { 0, 0, 0 };
289
290
291 static int irq_used = 0;
292
293
294
295 static struct wait_queue *cdu31a_irq_wait = NULL;
296
297 static int curr_control_reg = 0;
298
299
300
301
302
303 static char disk_changed[MAX_TRACKS];
304
305
306
307
308 static char *readahead_buffer = NULL;
309 static int readahead_dataleft = 0;
310 static int readahead_bad = 0;
311
312
313
314
315
316
317 static int
318 scd_disk_change(dev_t full_dev)
319 {
320 int retval, target;
321
322
323 target = MINOR(full_dev);
324
325 if (target >= MAX_TRACKS) {
326 printk("Sony CD-ROM request error: invalid device.\n");
327 return 0;
328 }
329
330 retval = disk_changed[target];
331 disk_changed[target] = 0;
332
333 return retval;
334 }
335
336 static inline void
337 enable_interrupts(void)
338 {
339 curr_control_reg |= ( SONY_ATTN_INT_EN_BIT
340 | SONY_RES_RDY_INT_EN_BIT
341 | SONY_DATA_RDY_INT_EN_BIT);
342 outb(curr_control_reg, sony_cd_control_reg);
343 }
344
345 static inline void
346 disable_interrupts(void)
347 {
348 curr_control_reg &= ~( SONY_ATTN_INT_EN_BIT
349 | SONY_RES_RDY_INT_EN_BIT
350 | SONY_DATA_RDY_INT_EN_BIT);
351 outb(curr_control_reg, sony_cd_control_reg);
352 }
353
354 static void
355 cdu31a_interrupt(int unused)
356 {
357 disable_interrupts();
358 if (cdu31a_irq_wait != NULL)
359 {
360 wake_up(&cdu31a_irq_wait);
361 }
362 else
363 {
364 printk("CDU31A: Got an interrupt but nothing was waiting\n");
365 }
366 }
367
368
369
370
371
372 static inline void
373 sony_sleep(void)
374 {
375 if (irq_used <= 0)
376 {
377 current->state = TASK_INTERRUPTIBLE;
378 current->timeout = jiffies;
379 schedule();
380 }
381 else
382 {
383 cli();
384 enable_interrupts();
385 interruptible_sleep_on(&cdu31a_irq_wait);
386 sti();
387 }
388 }
389
390
391
392
393
394
395 static inline int
396 is_attention(void)
397 {
398 return((inb(sony_cd_status_reg) & SONY_ATTN_BIT) != 0);
399 }
400
401 static inline int
402 is_busy(void)
403 {
404 return((inb(sony_cd_status_reg) & SONY_BUSY_BIT) != 0);
405 }
406
407 static inline int
408 is_data_ready(void)
409 {
410 return((inb(sony_cd_status_reg) & SONY_DATA_RDY_BIT) != 0);
411 }
412
413 static inline int
414 is_data_requested(void)
415 {
416 return((inb(sony_cd_status_reg) & SONY_DATA_REQUEST_BIT) != 0);
417 }
418
419 static inline int
420 is_result_ready(void)
421 {
422 return((inb(sony_cd_status_reg) & SONY_RES_RDY_BIT) != 0);
423 }
424
425 static inline int
426 is_param_write_rdy(void)
427 {
428 return((inb(sony_cd_fifost_reg) & SONY_PARAM_WRITE_RDY_BIT) != 0);
429 }
430
431 static inline int
432 is_result_reg_not_empty(void)
433 {
434 return((inb(sony_cd_fifost_reg) & SONY_RES_REG_NOT_EMP_BIT) != 0);
435 }
436
437 static inline void
438 reset_drive(void)
439 {
440 curr_control_reg = 0;
441 outb(SONY_DRIVE_RESET_BIT, sony_cd_control_reg);
442 }
443
444 static inline void
445 clear_attention(void)
446 {
447 outb(curr_control_reg | SONY_ATTN_CLR_BIT, sony_cd_control_reg);
448 }
449
450 static inline void
451 clear_result_ready(void)
452 {
453 outb(curr_control_reg | SONY_RES_RDY_CLR_BIT, sony_cd_control_reg);
454 }
455
456 static inline void
457 clear_data_ready(void)
458 {
459 outb(curr_control_reg | SONY_DATA_RDY_CLR_BIT, sony_cd_control_reg);
460 }
461
462 static inline void
463 clear_param_reg(void)
464 {
465 outb(curr_control_reg | SONY_PARAM_CLR_BIT, sony_cd_control_reg);
466 }
467
468 static inline unsigned char
469 read_status_register(void)
470 {
471 return(inb(sony_cd_status_reg));
472 }
473
474 static inline unsigned char
475 read_result_register(void)
476 {
477 return(inb(sony_cd_result_reg));
478 }
479
480 static inline unsigned char
481 read_data_register(void)
482 {
483 return(inb(sony_cd_read_reg));
484 }
485
486 static inline void
487 write_param(unsigned char param)
488 {
489 outb(param, sony_cd_param_reg);
490 }
491
492 static inline void
493 write_cmd(unsigned char cmd)
494 {
495 outb(curr_control_reg | SONY_RES_RDY_INT_EN_BIT, sony_cd_control_reg);
496 outb(cmd, sony_cd_cmd_reg);
497 }
498
499
500
501
502
503 static void
504 set_drive_params(void)
505 {
506 unsigned char res_reg[12];
507 unsigned int res_size;
508 unsigned char params[3];
509
510
511 params[0] = SONY_SD_MECH_CONTROL;
512 params[1] = 0x03;
513 if (is_double_speed)
514 {
515 params[1] |= 0x04;
516 }
517 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD,
518 params,
519 2,
520 res_reg,
521 &res_size);
522 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
523 {
524 printk(" Unable to set mechanical parameters: 0x%2.2x\n", res_reg[1]);
525 }
526 }
527
528
529
530
531 static void
532 restart_on_error(void)
533 {
534 unsigned char res_reg[12];
535 unsigned int res_size;
536 unsigned int retry_count;
537
538
539 printk("cdu31a: Resetting drive on error\n");
540 reset_drive();
541 retry_count = jiffies + SONY_RESET_TIMEOUT;
542 while ((retry_count > jiffies) && (!is_attention()))
543 {
544 sony_sleep();
545 }
546 set_drive_params();
547 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, &res_size);
548 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
549 {
550 printk("cdu31a: Unable to spin up drive: 0x%2.2x\n", res_reg[1]);
551 }
552
553 current->state = TASK_INTERRUPTIBLE;
554 current->timeout = jiffies + 200;
555 schedule();
556
557 do_sony_cd_cmd(SONY_READ_TOC_CMD, NULL, 0, res_reg, &res_size);
558 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
559 {
560 printk("cdu31a: Unable to read TOC: 0x%2.2x\n", res_reg[1]);
561 }
562 }
563
564
565
566
567
568 static int
569 write_params(unsigned char *params,
570 int num_params)
571 {
572 unsigned int retry_count;
573
574
575 retry_count = SONY_READY_RETRIES;
576 while ((retry_count > 0) && (!is_param_write_rdy()))
577 {
578 retry_count--;
579 }
580 if (!is_param_write_rdy())
581 {
582 return -EIO;
583 }
584
585 while (num_params > 0)
586 {
587 write_param(*params);
588 params++;
589 num_params--;
590 }
591
592 return 0;
593 }
594
595
596
597
598
599
600
601
602 static void
603 get_result(unsigned char *result_buffer,
604 unsigned int *result_size)
605 {
606 unsigned char a, b;
607 int i;
608 unsigned int retry_count;
609
610
611 while (handle_sony_cd_attention())
612 ;
613
614 retry_count = jiffies + SONY_JIFFIES_TIMEOUT;
615 while ((retry_count > jiffies) && (is_busy() || (!(is_result_ready()))))
616 {
617 sony_sleep();
618
619 while (handle_sony_cd_attention())
620 ;
621 }
622 if (is_busy() || (!(is_result_ready())))
623 {
624 #if DEBUG
625 printk("CDU31A timeout out %d\n", __LINE__);
626 #endif
627 result_buffer[0] = 0x20;
628 result_buffer[1] = SONY_TIMEOUT_OP_ERR;
629 *result_size = 2;
630 return;
631 }
632
633
634
635
636
637 clear_result_ready();
638 a = read_result_register();
639 *result_buffer = a;
640 result_buffer++;
641
642
643 if ((a & 0xf0) == 0x50)
644 {
645 *result_size = 1;
646 return;
647 }
648
649 b = read_result_register();
650 *result_buffer = b;
651 result_buffer++;
652 *result_size = 2;
653
654
655
656
657
658
659
660
661
662 if ((a & 0xf0) != 0x20)
663 {
664 if (b > 8)
665 {
666 for (i=0; i<8; i++)
667 {
668 *result_buffer = read_result_register();
669 result_buffer++;
670 (*result_size)++;
671 }
672 b = b - 8;
673
674 while (b > 10)
675 {
676 retry_count = SONY_READY_RETRIES;
677 while ((retry_count > 0) && (!is_result_ready()))
678 {
679 retry_count--;
680 }
681 if (!is_result_ready())
682 {
683 #if DEBUG
684 printk("CDU31A timeout out %d\n", __LINE__);
685 #endif
686 result_buffer[0] = 0x20;
687 result_buffer[1] = SONY_TIMEOUT_OP_ERR;
688 *result_size = 2;
689 return;
690 }
691
692 clear_result_ready();
693
694 for (i=0; i<10; i++)
695 {
696 *result_buffer = read_result_register();
697 result_buffer++;
698 (*result_size)++;
699 }
700 b = b - 10;
701 }
702
703 if (b > 0)
704 {
705 retry_count = SONY_READY_RETRIES;
706 while ((retry_count > 0) && (!is_result_ready()))
707 {
708 retry_count--;
709 }
710 if (!is_result_ready())
711 {
712 #if DEBUG
713 printk("CDU31A timeout out %d\n", __LINE__);
714 #endif
715 result_buffer[0] = 0x20;
716 result_buffer[1] = SONY_TIMEOUT_OP_ERR;
717 *result_size = 2;
718 return;
719 }
720 }
721 }
722
723 while (b > 0)
724 {
725 *result_buffer = read_result_register();
726 result_buffer++;
727 (*result_size)++;
728 b--;
729 }
730 }
731 }
732
733
734
735
736
737
738 static void
739 do_sony_cd_cmd(unsigned char cmd,
740 unsigned char *params,
741 unsigned int num_params,
742 unsigned char *result_buffer,
743 unsigned int *result_size)
744 {
745 unsigned int retry_count;
746 int num_retries;
747 int recursive_call;
748
749
750 cli();
751 if (current != has_cd_task)
752 {
753 while (sony_inuse)
754 {
755 interruptible_sleep_on(&sony_wait);
756 if (current->signal & ~current->blocked)
757 {
758 result_buffer[0] = 0x20;
759 result_buffer[1] = SONY_SIGNAL_OP_ERR;
760 *result_size = 2;
761 return;
762 }
763 }
764 sony_inuse = 1;
765 has_cd_task = current;
766 recursive_call = 0;
767 }
768 else
769 {
770 recursive_call = 1;
771 }
772 sti();
773
774 num_retries = 0;
775 retry_cd_operation:
776
777 while (handle_sony_cd_attention())
778 ;
779
780 retry_count = jiffies + SONY_JIFFIES_TIMEOUT;
781 while ((retry_count > jiffies) && (is_busy()))
782 {
783 sony_sleep();
784
785 while (handle_sony_cd_attention())
786 ;
787 }
788 if (is_busy())
789 {
790 #if DEBUG
791 printk("CDU31A timeout out %d\n", __LINE__);
792 #endif
793 result_buffer[0] = 0x20;
794 result_buffer[1] = SONY_TIMEOUT_OP_ERR;
795 *result_size = 2;
796 }
797 else
798 {
799 clear_result_ready();
800 clear_param_reg();
801
802 write_params(params, num_params);
803 write_cmd(cmd);
804
805 get_result(result_buffer, result_size);
806 }
807
808 if ( ((result_buffer[0] & 0xf0) == 0x20)
809 && (num_retries < MAX_CDU31A_RETRIES))
810 {
811 num_retries++;
812 current->state = TASK_INTERRUPTIBLE;
813 current->timeout = jiffies + 10;
814 schedule();
815 goto retry_cd_operation;
816 }
817
818 if (!recursive_call)
819 {
820 has_cd_task = NULL;
821 sony_inuse = 0;
822 wake_up_interruptible(&sony_wait);
823 }
824 }
825
826
827
828
829
830
831
832
833
834
835
836 static int
837 handle_sony_cd_attention(void)
838 {
839 unsigned char atten_code;
840 static int num_consecutive_attentions = 0;
841 int i;
842
843
844 if (is_attention())
845 {
846 if (num_consecutive_attentions > CDU31A_MAX_CONSECUTIVE_ATTENTIONS)
847 {
848 printk("cdu31a: Too many consecutive attentions: %d\n",
849 num_consecutive_attentions);
850 num_consecutive_attentions = 0;
851 return(0);
852 }
853
854 clear_attention();
855 atten_code = read_result_register();
856
857 switch (atten_code)
858 {
859
860 case SONY_MECH_LOADED_ATTN:
861 for (i=0; i<MAX_TRACKS; i++)
862 {
863 disk_changed[i] = 1;
864 if (ses_tocs[i] != NULL)
865 {
866 kfree_s(ses_tocs[i], sizeof(struct s_sony_session_toc));
867 ses_tocs[i] = NULL;
868 }
869 }
870 sony_audio_status = CDROM_AUDIO_NO_STATUS;
871 sony_blocks_left = 0;
872 break;
873
874 case SONY_SPIN_DOWN_COMPLETE_ATTN:
875
876 sony_spun_up = 0;
877 break;
878
879 case SONY_AUDIO_PLAY_DONE_ATTN:
880 sony_audio_status = CDROM_AUDIO_COMPLETED;
881 read_subcode();
882 break;
883
884 case SONY_EJECT_PUSHED_ATTN:
885 sony_audio_status = CDROM_AUDIO_INVALID;
886 break;
887
888 case SONY_LEAD_IN_ERR_ATTN:
889 case SONY_LEAD_OUT_ERR_ATTN:
890 case SONY_DATA_TRACK_ERR_ATTN:
891 case SONY_AUDIO_PLAYBACK_ERR_ATTN:
892 sony_audio_status = CDROM_AUDIO_ERROR;
893 break;
894 }
895
896 num_consecutive_attentions++;
897 return(1);
898 }
899
900 num_consecutive_attentions = 0;
901 return(0);
902 }
903
904
905
906 static inline unsigned int
907 int_to_bcd(unsigned int val)
908 {
909 int retval;
910
911
912 retval = (val / 10) << 4;
913 retval = retval | val % 10;
914 return(retval);
915 }
916
917
918
919 static unsigned int
920 bcd_to_int(unsigned int bcd)
921 {
922 return((((bcd >> 4) & 0x0f) * 10) + (bcd & 0x0f));
923 }
924
925
926
927
928
929
930 static void
931 log_to_msf(unsigned int log, unsigned char *msf)
932 {
933 log = log + LOG_START_OFFSET;
934 msf[0] = int_to_bcd(log / 4500);
935 log = log % 4500;
936 msf[1] = int_to_bcd(log / 75);
937 msf[2] = int_to_bcd(log % 75);
938 }
939
940
941
942
943
944 static unsigned int
945 msf_to_log(unsigned char *msf)
946 {
947 unsigned int log;
948
949
950 log = bcd_to_int(msf[2]);
951 log += bcd_to_int(msf[1]) * 75;
952 log += bcd_to_int(msf[0]) * 4500;
953 log = log - LOG_START_OFFSET;
954
955 return log;
956 }
957
958
959
960
961
962
963 static void
964 size_to_buf(unsigned int size,
965 unsigned char *buf)
966 {
967 buf[0] = size / 65536;
968 size = size % 65536;
969 buf[1] = size / 256;
970 buf[2] = size % 256;
971 }
972
973
974
975
976
977
978
979 static int
980 start_request(unsigned int sector,
981 unsigned int nsect,
982 int read_nsect_only,
983 int dev)
984 {
985 unsigned char params[6];
986 unsigned int read_size;
987 unsigned int retry_count;
988
989
990 log_to_msf(sector, params);
991
992 if (read_nsect_only)
993 {
994 read_size = nsect;
995 }
996
997
998
999
1000 else if ((sector + nsect) >= ses_tocs[dev]->lead_out_start_lba)
1001 {
1002 read_size = ses_tocs[dev]->lead_out_start_lba - sector;
1003 }
1004
1005 else
1006 {
1007 read_size = CDU31A_READAHEAD;
1008 }
1009 size_to_buf(read_size, ¶ms[3]);
1010
1011
1012
1013
1014
1015 while (handle_sony_cd_attention())
1016 ;
1017
1018 retry_count = jiffies + SONY_JIFFIES_TIMEOUT;
1019 while ((retry_count > jiffies) && (is_busy()))
1020 {
1021 sony_sleep();
1022
1023 while (handle_sony_cd_attention())
1024 ;
1025 }
1026
1027 if (is_busy())
1028 {
1029 printk("CDU31A: Timeout while waiting to issue command\n");
1030 return(1);
1031 }
1032 else
1033 {
1034
1035 clear_result_ready();
1036 clear_param_reg();
1037
1038 write_params(params, 6);
1039 write_cmd(SONY_READ_BLKERR_STAT_CMD);
1040
1041 sony_blocks_left = read_size * 4;
1042 sony_next_block = sector * 4;
1043 readahead_dataleft = 0;
1044 readahead_bad = 0;
1045 return(0);
1046 }
1047 }
1048
1049
1050
1051 static void
1052 abort_read(void)
1053 {
1054 unsigned char result_reg[2];
1055 int result_size;
1056 volatile int val;
1057
1058
1059 do_sony_cd_cmd(SONY_ABORT_CMD, NULL, 0, result_reg, &result_size);
1060 if ((result_reg[0] & 0xf0) == 0x20)
1061 {
1062 printk("CDU31A: Error aborting read, error = 0x%2.2x\n",
1063 result_reg[1]);
1064 }
1065
1066 while (is_result_reg_not_empty())
1067 {
1068 val = read_result_register();
1069 }
1070 clear_data_ready();
1071 clear_result_ready();
1072
1073 while (is_data_requested())
1074 {
1075 val = read_data_register();
1076 }
1077
1078 sony_blocks_left = 0;
1079 readahead_dataleft = 0;
1080 readahead_bad = 0;
1081 }
1082
1083
1084 static void
1085 input_data(char *buffer,
1086 unsigned int bytesleft,
1087 unsigned int nblocks,
1088 unsigned int offset,
1089 unsigned int skip)
1090 {
1091 int i;
1092 volatile unsigned char val;
1093
1094
1095
1096
1097 if (sony_xa_mode)
1098 {
1099 for(i=0; i<CD_XA_HEAD; i++)
1100 {
1101 val = read_data_register();
1102 }
1103 }
1104
1105 clear_data_ready();
1106
1107 if (bytesleft == 2048)
1108 {
1109 insb(sony_cd_read_reg, buffer, 2048);
1110 readahead_dataleft = 0;
1111 }
1112 else
1113 {
1114
1115
1116 if (skip != 0)
1117 {
1118 insb(sony_cd_read_reg, readahead_buffer, skip);
1119 }
1120
1121
1122 insb(sony_cd_read_reg, &buffer[offset], bytesleft);
1123
1124
1125
1126 readahead_dataleft = (2048 - skip) - bytesleft;
1127 insb(sony_cd_read_reg,
1128 readahead_buffer + bytesleft,
1129 readahead_dataleft);
1130 }
1131 sony_blocks_left -= nblocks;
1132 sony_next_block += nblocks;
1133
1134
1135
1136 if (sony_xa_mode)
1137 {
1138 for(i=0; i<CD_XA_TAIL; i++)
1139 {
1140 val = read_data_register();
1141 }
1142 }
1143 }
1144
1145
1146 static void
1147 read_data_block(char *buffer,
1148 unsigned int block,
1149 unsigned int nblocks,
1150 unsigned char res_reg[],
1151 int *res_size)
1152 {
1153 unsigned int retry_count;
1154 unsigned int bytesleft;
1155 unsigned int offset;
1156 unsigned int skip;
1157
1158
1159 res_reg[0] = 0;
1160 res_reg[1] = 0;
1161 *res_size = 0;
1162 bytesleft = nblocks * 512;
1163 offset = 0;
1164
1165
1166
1167 if (((block % 4) * 512) != ((2048 - readahead_dataleft) % 2048))
1168 {
1169 sony_next_block += block % 4;
1170 sony_blocks_left -= block % 4;
1171 skip = (block % 4) * 512;
1172 }
1173 else
1174 {
1175 skip = 0;
1176 }
1177
1178
1179
1180 if (readahead_dataleft != 0)
1181 {
1182 if (bytesleft > readahead_dataleft)
1183 {
1184
1185
1186 memcpy(buffer,
1187 readahead_buffer + (2048 - readahead_dataleft),
1188 readahead_dataleft);
1189 readahead_dataleft = 0;
1190 bytesleft -= readahead_dataleft;
1191 offset += readahead_dataleft;
1192 }
1193 else
1194 {
1195
1196
1197 memcpy(buffer,
1198 readahead_buffer + (2048 - readahead_dataleft),
1199 bytesleft);
1200 readahead_dataleft -= bytesleft;
1201 bytesleft = 0;
1202 sony_blocks_left -= nblocks;
1203 sony_next_block += nblocks;
1204
1205
1206
1207 if (readahead_bad)
1208 {
1209 res_reg[0] = 0x20;
1210 res_reg[1] = SONY_BAD_DATA_ERR;
1211 *res_size = 2;
1212 }
1213
1214 if (readahead_dataleft == 0)
1215 {
1216 readahead_bad = 0;
1217 }
1218
1219
1220 if (sony_blocks_left == 0)
1221 {
1222 get_result(res_reg, res_size);
1223 }
1224 return;
1225 }
1226 }
1227
1228
1229 retry_count = jiffies + SONY_JIFFIES_TIMEOUT;
1230 while ((retry_count > jiffies) && !(is_data_ready()))
1231 {
1232 while (handle_sony_cd_attention())
1233 ;
1234
1235 sony_sleep();
1236 }
1237 if (!(is_data_ready()))
1238 {
1239 if (is_result_ready())
1240 {
1241 get_result(res_reg, res_size);
1242 if ((res_reg[0] & 0xf0) != 0x20)
1243 {
1244 printk("CDU31A: Got result that should have been error: %d\n",
1245 res_reg[0]);
1246 res_reg[0] = 0x20;
1247 res_reg[1] = SONY_BAD_DATA_ERR;
1248 *res_size = 2;
1249 }
1250 abort_read();
1251 }
1252 else
1253 {
1254 #if DEBUG
1255 printk("CDU31A timeout out %d\n", __LINE__);
1256 #endif
1257 res_reg[0] = 0x20;
1258 res_reg[1] = SONY_TIMEOUT_OP_ERR;
1259 *res_size = 2;
1260 abort_read();
1261 }
1262 }
1263 else
1264 {
1265 input_data(buffer, bytesleft, nblocks, offset, skip);
1266
1267
1268 retry_count = jiffies + SONY_JIFFIES_TIMEOUT;
1269 while ((retry_count > jiffies) && !(is_result_ready()))
1270 {
1271 while (handle_sony_cd_attention())
1272 ;
1273
1274 sony_sleep();
1275 }
1276
1277 if (!is_result_ready())
1278 {
1279 #if DEBUG
1280 printk("CDU31A timeout out %d\n", __LINE__);
1281 #endif
1282 res_reg[0] = 0x20;
1283 res_reg[1] = SONY_TIMEOUT_OP_ERR;
1284 *res_size = 2;
1285 abort_read();
1286 }
1287 else
1288 {
1289 get_result(res_reg, res_size);
1290
1291
1292 if ((res_reg[0] & 0xf0) == 0x50)
1293 {
1294
1295 if ( (res_reg[0] == SONY_NO_CIRC_ERR_BLK_STAT)
1296 || (res_reg[0] == SONY_NO_LECC_ERR_BLK_STAT)
1297 || (res_reg[0] == SONY_RECOV_LECC_ERR_BLK_STAT))
1298 {
1299
1300
1301
1302 if (readahead_bad)
1303 {
1304 readahead_bad = 0;
1305 res_reg[0] = 0x20;
1306 res_reg[1] = SONY_BAD_DATA_ERR;
1307 *res_size = 2;
1308 }
1309 }
1310 else
1311 {
1312 printk("CDU31A: Data block error: 0x%x\n", res_reg[0]);
1313 res_reg[0] = 0x20;
1314 res_reg[1] = SONY_BAD_DATA_ERR;
1315 *res_size = 2;
1316
1317
1318
1319 if (bytesleft != 2048)
1320 {
1321 readahead_bad = 1;
1322 }
1323 }
1324
1325
1326 if (sony_blocks_left == 0)
1327 {
1328 get_result(res_reg, res_size);
1329 }
1330 }
1331 else if ((res_reg[0] & 0xf0) != 0x20)
1332 {
1333
1334
1335 printk("CDU31A: Invalid block status: 0x%x\n", res_reg[0]);
1336 restart_on_error();
1337 res_reg[0] = 0x20;
1338 res_reg[1] = SONY_BAD_DATA_ERR;
1339 *res_size = 2;
1340 }
1341 }
1342 }
1343 }
1344
1345
1346
1347
1348
1349
1350
1351
1352 static void
1353 do_cdu31a_request(void)
1354 {
1355 int block;
1356 unsigned int dev;
1357 int nblock;
1358 unsigned char res_reg[12];
1359 unsigned int res_size;
1360 int num_retries;
1361
1362
1363
1364
1365
1366
1367 cli();
1368 while (sony_inuse)
1369 {
1370 interruptible_sleep_on(&sony_wait);
1371 if (current->signal & ~current->blocked)
1372 {
1373 return;
1374 }
1375 }
1376 sony_inuse = 1;
1377 has_cd_task = current;
1378 sti();
1379
1380
1381 while (handle_sony_cd_attention())
1382 ;
1383
1384 while (1)
1385 {
1386 cdu31a_request_startover:
1387
1388
1389
1390
1391 if (!(CURRENT) || CURRENT->dev < 0)
1392 {
1393 goto end_do_cdu31a_request;
1394 }
1395
1396 if (!sony_spun_up)
1397 {
1398 struct inode in;
1399
1400
1401
1402
1403 in.i_rdev = CURRENT->dev;
1404 scd_open(&in,NULL);
1405 }
1406
1407
1408
1409
1410 if (MAJOR(CURRENT->dev) != MAJOR_NR)
1411 {
1412 panic(DEVICE_NAME ": request list destroyed");
1413 }
1414 if (CURRENT->bh)
1415 {
1416 if (!CURRENT->bh->b_lock)
1417 {
1418 panic(DEVICE_NAME ": block not locked");
1419 }
1420 }
1421
1422 dev = MINOR(CURRENT->dev);
1423 block = CURRENT->sector;
1424 nblock = CURRENT->nr_sectors;
1425
1426
1427 if (dev > MAX_TRACKS)
1428 {
1429 printk("CDU31A: Invalid device request: %d\n", dev);
1430 end_request(0);
1431 goto cdu31a_request_startover;
1432 }
1433 else if (ses_tocs[dev] == NULL)
1434 {
1435 printk("CDU31A: session TOC not read: %d\n", dev);
1436 end_request(0);
1437 goto cdu31a_request_startover;
1438 }
1439
1440
1441 if ((dev != 0) && (block == 64))
1442 {
1443 if (ses_tocs[dev]->first_track_num == ses_tocs[dev]->last_track_num)
1444 {
1445 printk("CDU31A: Not a multi-session disk: %d\n", dev);
1446 end_request(0);
1447 goto cdu31a_request_startover;
1448 }
1449
1450
1451 block += (ses_tocs[dev]->start_track_lba * 4);
1452 }
1453
1454 switch(CURRENT->cmd)
1455 {
1456 case READ:
1457
1458
1459
1460
1461 if ((block / 4) < ses_tocs[dev]->start_track_lba)
1462 {
1463 printk("CDU31A: Request before beginning of media\n");
1464 end_request(0);
1465 goto cdu31a_request_startover;
1466 }
1467 if ((block / 4) >= ses_tocs[dev]->lead_out_start_lba)
1468 {
1469 printk("CDU31A: Request past end of media\n");
1470 end_request(0);
1471 goto cdu31a_request_startover;
1472 }
1473 if (((block + nblock) / 4) >= ses_tocs[dev]->lead_out_start_lba)
1474 {
1475 printk("CDU31A: Request past end of media\n");
1476 end_request(0);
1477 goto cdu31a_request_startover;
1478 }
1479
1480 num_retries = 0;
1481
1482 try_read_again:
1483 while (handle_sony_cd_attention())
1484 ;
1485
1486 if (ses_tocs[dev] == NULL)
1487 {
1488 printk("CDU31A: session TOC not read: %d\n", dev);
1489 end_request(0);
1490 goto cdu31a_request_startover;
1491 }
1492
1493
1494
1495 if (sony_blocks_left == 0)
1496 {
1497 if (start_request(block / 4, CDU31A_READAHEAD / 4, 0, dev))
1498 {
1499 end_request(0);
1500 goto cdu31a_request_startover;
1501 }
1502 }
1503
1504
1505
1506 else if (block != sony_next_block)
1507 {
1508 #if DEBUG
1509 printk("CDU31A Warning: Read for block %d, expected %d\n",
1510 block,
1511 sony_next_block);
1512 #endif
1513 abort_read();
1514 if (ses_tocs[dev] == NULL)
1515 {
1516 printk("CDU31A: session TOC not read: %d\n", dev);
1517 end_request(0);
1518 goto cdu31a_request_startover;
1519 }
1520 else if (start_request(block / 4, CDU31A_READAHEAD / 4, 0, dev))
1521 {
1522 end_request(0);
1523 goto cdu31a_request_startover;
1524 }
1525 }
1526
1527 read_data_block(CURRENT->buffer, block, nblock, res_reg, &res_size);
1528 if (res_reg[0] == 0x20)
1529 {
1530 if (num_retries > MAX_CDU31A_RETRIES)
1531 {
1532 end_request(0);
1533 goto cdu31a_request_startover;
1534 }
1535
1536 num_retries++;
1537 if (res_reg[1] == SONY_NOT_SPIN_ERR)
1538 {
1539 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, &res_size);
1540 }
1541 else
1542 {
1543 printk("CDU31A: Read error: 0x%2.2x\n", res_reg[1]);
1544 }
1545 goto try_read_again;
1546 }
1547 else
1548 {
1549 end_request(1);
1550 }
1551 break;
1552
1553 case WRITE:
1554 end_request(0);
1555 break;
1556
1557 default:
1558 panic("CDU31A: Unknown cmd");
1559 }
1560 }
1561
1562 end_do_cdu31a_request:
1563 #if 0
1564
1565 abort_read();
1566 #endif
1567
1568 has_cd_task = NULL;
1569 sony_inuse = 0;
1570 wake_up_interruptible(&sony_wait);
1571 }
1572
1573
1574 static void
1575 mcovlp(char *dst,
1576 char *src,
1577 int size)
1578 {
1579 src += (size - 1);
1580 dst += (size - 1);
1581 while (size > 0)
1582 {
1583 *dst = *src;
1584 size--;
1585 dst--;
1586 src--;
1587 }
1588 }
1589
1590
1591
1592
1593
1594
1595 static void
1596 sony_get_toc(int dev)
1597 {
1598 unsigned int res_size;
1599 unsigned char parms[1];
1600
1601
1602 if (dev >= MAX_TRACKS)
1603 {
1604 printk("CDU31A: Request for invalid TOC track: %d\n", dev);
1605 }
1606 else if (ses_tocs[dev] == NULL)
1607 {
1608 ses_tocs[dev] = kmalloc(sizeof(struct s_sony_session_toc), 0);
1609 if (ses_tocs[dev] == NULL)
1610 {
1611 printk("CDU31A: Unable to alloc mem for TOC\n");
1612 }
1613 else
1614 {
1615 parms[0] = dev+1;
1616 do_sony_cd_cmd(SONY_REQ_TOC_DATA_SPEC_CMD,
1617 parms,
1618 1,
1619 (unsigned char *) ses_tocs[dev],
1620 &res_size);
1621 if ((res_size < 2) || ((ses_tocs[dev]->exec_status[0] & 0xf0) == 0x20))
1622 {
1623 kfree_s(ses_tocs[dev], sizeof(struct s_sony_session_toc));
1624 ses_tocs[dev] = NULL;
1625 return;
1626 }
1627
1628
1629
1630 if (ses_tocs[dev]->pointb0 != 0xb0)
1631 {
1632 mcovlp(((char *) ses_tocs[dev]) + 27,
1633 ((char *) ses_tocs[dev]) + 18,
1634 res_size - 18);
1635 res_size += 9;
1636 }
1637 if (ses_tocs[dev]->pointb1 != 0xb1)
1638 {
1639 mcovlp(((char *) ses_tocs[dev]) + 36,
1640 ((char *) ses_tocs[dev]) + 27,
1641 res_size - 27);
1642 res_size += 9;
1643 }
1644 if (ses_tocs[dev]->pointb2 != 0xb2)
1645 {
1646 mcovlp(((char *) ses_tocs[dev]) + 45,
1647 ((char *) ses_tocs[dev]) + 36,
1648 res_size - 36);
1649 res_size += 9;
1650 }
1651 if (ses_tocs[dev]->pointb3 != 0xb3)
1652 {
1653 mcovlp(((char *) ses_tocs[dev]) + 54,
1654 ((char *) ses_tocs[dev]) + 45,
1655 res_size - 45);
1656 res_size += 9;
1657 }
1658 if (ses_tocs[dev]->pointb4 != 0xb4)
1659 {
1660 mcovlp(((char *) ses_tocs[dev]) + 63,
1661 ((char *) ses_tocs[dev]) + 54,
1662 res_size - 54);
1663 res_size += 9;
1664 }
1665 if (ses_tocs[dev]->pointc0 != 0xc0)
1666 {
1667 mcovlp(((char *) ses_tocs[dev]) + 72,
1668 ((char *) ses_tocs[dev]) + 63,
1669 res_size - 63);
1670 res_size += 9;
1671 }
1672
1673 ses_tocs[dev]->start_track_lba = msf_to_log(ses_tocs[dev]->tracks[0].track_start_msf);
1674 ses_tocs[dev]->lead_out_start_lba = msf_to_log(ses_tocs[dev]->lead_out_start_msf);
1675 #if DEBUG
1676 printk("Disk session %d, start track: %d, stop track: %d\n",
1677 dev,
1678 ses_tocs[dev]->start_track_lba,
1679 ses_tocs[dev]->lead_out_start_lba);
1680 #endif
1681 }
1682 }
1683 }
1684
1685
1686
1687
1688
1689 static int
1690 find_track(int track,
1691 int dev)
1692 {
1693 int i;
1694 int num_tracks;
1695
1696
1697 num_tracks = ses_tocs[dev]->last_track_num - ses_tocs[dev]->first_track_num + 1;
1698 for (i = 0; i < num_tracks; i++)
1699 {
1700 if (ses_tocs[dev]->tracks[i].track == track)
1701 {
1702 return i;
1703 }
1704 }
1705
1706 return -1;
1707 }
1708
1709
1710
1711
1712
1713 static int
1714 read_subcode(void)
1715 {
1716 unsigned int res_size;
1717
1718
1719 do_sony_cd_cmd(SONY_REQ_SUBCODE_ADDRESS_CMD,
1720 NULL,
1721 0,
1722 (unsigned char *) last_sony_subcode,
1723 &res_size);
1724 if ((res_size < 2) || ((last_sony_subcode->exec_status[0] & 0xf0) == 0x20))
1725 {
1726 printk("Sony CDROM error 0x%2.2x (read_subcode)\n",
1727 last_sony_subcode->exec_status[1]);
1728 return -EIO;
1729 }
1730
1731 return 0;
1732 }
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742 static int
1743 sony_get_subchnl_info(long arg,
1744 int dev)
1745 {
1746 struct cdrom_subchnl schi;
1747
1748
1749
1750 while (handle_sony_cd_attention())
1751 ;
1752
1753 sony_get_toc(dev);
1754 if (ses_tocs[dev] == NULL)
1755 {
1756 return -EIO;
1757 }
1758
1759 verify_area(VERIFY_READ, (char *) arg, sizeof(schi));
1760 verify_area(VERIFY_WRITE, (char *) arg, sizeof(schi));
1761
1762 memcpy_fromfs(&schi, (char *) arg, sizeof(schi));
1763
1764 switch (sony_audio_status)
1765 {
1766 case CDROM_AUDIO_PLAY:
1767 if (read_subcode() < 0)
1768 {
1769 return -EIO;
1770 }
1771 break;
1772
1773 case CDROM_AUDIO_PAUSED:
1774 case CDROM_AUDIO_COMPLETED:
1775 break;
1776
1777 case CDROM_AUDIO_NO_STATUS:
1778 schi.cdsc_audiostatus = sony_audio_status;
1779 memcpy_tofs((char *) arg, &schi, sizeof(schi));
1780 return 0;
1781 break;
1782
1783 case CDROM_AUDIO_INVALID:
1784 case CDROM_AUDIO_ERROR:
1785 default:
1786 return -EIO;
1787 }
1788
1789 schi.cdsc_audiostatus = sony_audio_status;
1790 schi.cdsc_adr = last_sony_subcode->address;
1791 schi.cdsc_ctrl = last_sony_subcode->control;
1792 schi.cdsc_trk = bcd_to_int(last_sony_subcode->track_num);
1793 schi.cdsc_ind = bcd_to_int(last_sony_subcode->index_num);
1794 if (schi.cdsc_format == CDROM_MSF)
1795 {
1796 schi.cdsc_absaddr.msf.minute = bcd_to_int(last_sony_subcode->abs_msf[0]);
1797 schi.cdsc_absaddr.msf.second = bcd_to_int(last_sony_subcode->abs_msf[1]);
1798 schi.cdsc_absaddr.msf.frame = bcd_to_int(last_sony_subcode->abs_msf[2]);
1799
1800 schi.cdsc_reladdr.msf.minute = bcd_to_int(last_sony_subcode->rel_msf[0]);
1801 schi.cdsc_reladdr.msf.second = bcd_to_int(last_sony_subcode->rel_msf[1]);
1802 schi.cdsc_reladdr.msf.frame = bcd_to_int(last_sony_subcode->rel_msf[2]);
1803 }
1804 else if (schi.cdsc_format == CDROM_LBA)
1805 {
1806 schi.cdsc_absaddr.lba = msf_to_log(last_sony_subcode->abs_msf);
1807 schi.cdsc_reladdr.lba = msf_to_log(last_sony_subcode->rel_msf);
1808 }
1809
1810 memcpy_tofs((char *) arg, &schi, sizeof(schi));
1811 return 0;
1812 }
1813
1814
1815
1816
1817
1818 static void
1819 read_audio_data(char *buffer,
1820 unsigned char res_reg[],
1821 int *res_size)
1822 {
1823 unsigned int retry_count;
1824 int result_read;
1825
1826
1827 res_reg[0] = 0;
1828 res_reg[1] = 0;
1829 *res_size = 0;
1830 result_read = 0;
1831
1832
1833 retry_count = jiffies + SONY_JIFFIES_TIMEOUT;
1834 continue_read_audio_wait:
1835 while ( (retry_count > jiffies)
1836 && !(is_data_ready())
1837 && !(is_result_ready() || result_read))
1838 {
1839 while (handle_sony_cd_attention())
1840 ;
1841
1842 sony_sleep();
1843 }
1844 if (!(is_data_ready()))
1845 {
1846 if (is_result_ready() && !result_read)
1847 {
1848 get_result(res_reg, res_size);
1849
1850
1851 if ((res_reg[0] & 0xf0) == 0x50)
1852 {
1853 result_read = 1;
1854 goto continue_read_audio_wait;
1855 }
1856
1857 else if ((res_reg[0] & 0xf0) != 0x20)
1858 {
1859 printk("CDU31A: Got result that should have been error: %d\n",
1860 res_reg[0]);
1861 res_reg[0] = 0x20;
1862 res_reg[1] = SONY_BAD_DATA_ERR;
1863 *res_size = 2;
1864 }
1865 abort_read();
1866 }
1867 else
1868 {
1869 #if DEBUG
1870 printk("CDU31A timeout out %d\n", __LINE__);
1871 #endif
1872 res_reg[0] = 0x20;
1873 res_reg[1] = SONY_TIMEOUT_OP_ERR;
1874 *res_size = 2;
1875 abort_read();
1876 }
1877 }
1878 else
1879 {
1880 clear_data_ready();
1881
1882
1883 if (sony_raw_data_mode)
1884 {
1885 insb(sony_cd_read_reg, buffer + CD_XA_HEAD, CD_FRAMESIZE_XA);
1886 }
1887 else
1888 {
1889
1890 insb(sony_cd_read_reg, buffer, CD_FRAMESIZE_RAW);
1891 }
1892
1893
1894 if (!result_read)
1895 {
1896
1897 retry_count = jiffies + SONY_JIFFIES_TIMEOUT;
1898 while ((retry_count > jiffies) && !(is_result_ready()))
1899 {
1900 while (handle_sony_cd_attention())
1901 ;
1902
1903 sony_sleep();
1904 }
1905
1906 if (!is_result_ready())
1907 {
1908 #if DEBUG
1909 printk("CDU31A timeout out %d\n", __LINE__);
1910 #endif
1911 res_reg[0] = 0x20;
1912 res_reg[1] = SONY_TIMEOUT_OP_ERR;
1913 *res_size = 2;
1914 abort_read();
1915 return;
1916 }
1917 else
1918 {
1919 get_result(res_reg, res_size);
1920 }
1921 }
1922
1923 if ((res_reg[0] & 0xf0) == 0x50)
1924 {
1925 if ( (res_reg[0] == SONY_NO_CIRC_ERR_BLK_STAT)
1926 || (res_reg[0] == SONY_NO_LECC_ERR_BLK_STAT)
1927 || (res_reg[0] == SONY_RECOV_LECC_ERR_BLK_STAT)
1928 || (res_reg[0] == SONY_NO_ERR_DETECTION_STAT))
1929 {
1930
1931 }
1932 else
1933 {
1934 printk("CDU31A: Data block error: 0x%x\n", res_reg[0]);
1935 res_reg[0] = 0x20;
1936 res_reg[1] = SONY_BAD_DATA_ERR;
1937 *res_size = 2;
1938 }
1939 }
1940 else if ((res_reg[0] & 0xf0) != 0x20)
1941 {
1942
1943
1944 printk("CDU31A: Invalid block status: 0x%x\n", res_reg[0]);
1945 restart_on_error();
1946 res_reg[0] = 0x20;
1947 res_reg[1] = SONY_BAD_DATA_ERR;
1948 *res_size = 2;
1949 }
1950 }
1951 }
1952
1953
1954
1955 static int
1956 read_audio(struct cdrom_read_audio *ra,
1957 struct inode *inode)
1958 {
1959 int retval;
1960 unsigned char params[2];
1961 unsigned char res_reg[12];
1962 unsigned int res_size;
1963 unsigned int cframe;
1964
1965
1966
1967
1968
1969 cli();
1970 while (sony_inuse)
1971 {
1972 interruptible_sleep_on(&sony_wait);
1973 if (current->signal & ~current->blocked)
1974 {
1975 return -EAGAIN;
1976 }
1977 }
1978 sony_inuse = 1;
1979 has_cd_task = current;
1980 sti();
1981
1982 if (!sony_spun_up)
1983 {
1984 scd_open (inode, NULL);
1985 }
1986
1987
1988 params[0] = SONY_SD_DECODE_PARAM;
1989 params[1] = 0x06 | sony_raw_data_mode;
1990 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD,
1991 params,
1992 2,
1993 res_reg,
1994 &res_size);
1995 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
1996 {
1997 printk("CDU31A: Unable to set decode params: 0x%2.2x\n", res_reg[1]);
1998 return -EIO;
1999 }
2000
2001
2002
2003
2004
2005 retval = 0;
2006
2007 if (start_request(ra->addr.lba, ra->nframes, 1, 0))
2008 {
2009 retval = -EIO;
2010 goto exit_read_audio;
2011 }
2012
2013
2014 cframe = 0;
2015 while (cframe < ra->nframes)
2016 {
2017 read_audio_data(readahead_buffer, res_reg, &res_size);
2018 if ((res_reg[0] & 0xf0) == 0x20)
2019 {
2020 if (res_reg[1] == SONY_BAD_DATA_ERR)
2021 {
2022 printk("CDU31A: Data error on audio sector %d\n",
2023 ra->addr.lba + cframe);
2024 }
2025 else if (res_reg[1] == SONY_ILL_TRACK_R_ERR)
2026 {
2027
2028 sony_raw_data_mode = (sony_raw_data_mode) ? 0 : 1;
2029
2030
2031 params[0] = SONY_SD_DECODE_PARAM;
2032 params[1] = 0x06 | sony_raw_data_mode;
2033 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD,
2034 params,
2035 2,
2036 res_reg,
2037 &res_size);
2038 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
2039 {
2040 printk("CDU31A: Unable to set decode params: 0x%2.2x\n", res_reg[1]);
2041 retval = -EIO;
2042 goto exit_read_audio;
2043 }
2044
2045
2046 if (start_request(ra->addr.lba + cframe, ra->nframes - cframe, 1, 0))
2047 {
2048 retval = -EIO;
2049 goto exit_read_audio;
2050 }
2051
2052
2053
2054
2055 read_audio_data(readahead_buffer, res_reg, &res_size);
2056 if ((res_reg[0] & 0xf0) == 0x20)
2057 {
2058 if (res_reg[1] == SONY_BAD_DATA_ERR)
2059 {
2060 printk("CDU31A: Data error on audio sector %d\n",
2061 ra->addr.lba + cframe);
2062 }
2063 else
2064 {
2065 printk("CDU31A: Error reading audio data on sector %d: 0x%x\n",
2066 ra->addr.lba + cframe,
2067 res_reg[1]);
2068 retval = -EIO;
2069 goto exit_read_audio;
2070 }
2071 }
2072 else
2073 {
2074 memcpy_tofs((char *) (ra->buf + (CD_FRAMESIZE_RAW * cframe)),
2075 (char *) readahead_buffer,
2076 CD_FRAMESIZE_RAW);
2077 }
2078 }
2079 else
2080 {
2081 printk("CDU31A: Error reading audio data on sector %d: 0x%x\n",
2082 ra->addr.lba + cframe,
2083 res_reg[1]);
2084 retval = -EIO;
2085 goto exit_read_audio;
2086 }
2087 }
2088 else
2089 {
2090 memcpy_tofs((char *) (ra->buf + (CD_FRAMESIZE_RAW * cframe)),
2091 (char *) readahead_buffer,
2092 CD_FRAMESIZE_RAW);
2093 }
2094
2095 cframe++;
2096 }
2097
2098 get_result(res_reg, &res_size);
2099 if ((res_reg[0] & 0xf0) == 0x20)
2100 {
2101 printk("CDU31A: Error return from audio read: 0x%x\n",
2102 res_reg[1]);
2103 retval = -EIO;
2104 goto exit_read_audio;
2105 }
2106
2107 exit_read_audio:
2108
2109
2110 params[0] = SONY_SD_DECODE_PARAM;
2111 if (!sony_xa_mode)
2112 {
2113 params[1] = 0x0f;
2114 }
2115 else
2116 {
2117 params[1] = 0x07;
2118 }
2119 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD,
2120 params,
2121 2,
2122 res_reg,
2123 &res_size);
2124 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
2125 {
2126 printk("CDU31A: Unable to reset decode params: 0x%2.2x\n", res_reg[1]);
2127 return -EIO;
2128 }
2129
2130 has_cd_task = NULL;
2131 sony_inuse = 0;
2132 wake_up_interruptible(&sony_wait);
2133
2134 return(retval);
2135 }
2136
2137
2138
2139
2140 static int
2141 scd_ioctl(struct inode *inode,
2142 struct file *file,
2143 unsigned int cmd,
2144 unsigned long arg)
2145 {
2146 unsigned int dev;
2147 unsigned char res_reg[12];
2148 unsigned int res_size;
2149 unsigned char params[7];
2150 int i;
2151
2152
2153 if (!inode)
2154 {
2155 return -EINVAL;
2156 }
2157 dev = MINOR(inode->i_rdev);
2158 if (dev > MAX_TRACKS)
2159 {
2160 return -EINVAL;
2161 }
2162
2163 switch (cmd)
2164 {
2165 case CDROMSTART:
2166 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, &res_size);
2167 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
2168 {
2169 printk("Sony CDROM error 0x%2.2x (CDROMSTART)\n", res_reg[1]);
2170 return -EIO;
2171 }
2172 return 0;
2173 break;
2174
2175 case CDROMSTOP:
2176 do_sony_cd_cmd(SONY_AUDIO_STOP_CMD, NULL, 0, res_reg, &res_size);
2177
2178
2179
2180
2181
2182 sony_audio_status = CDROM_AUDIO_NO_STATUS;
2183 do_sony_cd_cmd(SONY_SPIN_DOWN_CMD, NULL, 0, res_reg, &res_size);
2184 if ( ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
2185 && (res_reg[1] != SONY_NOT_SPIN_ERR))
2186 {
2187 printk("Sony CDROM error 0x%2.2x (CDROMSTOP)\n", res_reg[1]);
2188 return -EIO;
2189 }
2190
2191 return 0;
2192 break;
2193
2194 case CDROMPAUSE:
2195 do_sony_cd_cmd(SONY_AUDIO_STOP_CMD, NULL, 0, res_reg, &res_size);
2196 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
2197 {
2198 printk("Sony CDROM error 0x%2.2x (CDROMPAUSE)\n", res_reg[1]);
2199 return -EIO;
2200 }
2201
2202
2203 if (read_subcode() < 0)
2204 {
2205 return -EIO;
2206 }
2207 cur_pos_msf[0] = last_sony_subcode->abs_msf[0];
2208 cur_pos_msf[1] = last_sony_subcode->abs_msf[1];
2209 cur_pos_msf[2] = last_sony_subcode->abs_msf[2];
2210 sony_audio_status = CDROM_AUDIO_PAUSED;
2211 return 0;
2212 break;
2213
2214 case CDROMRESUME:
2215 if (sony_audio_status != CDROM_AUDIO_PAUSED)
2216 {
2217 return -EINVAL;
2218 }
2219
2220 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, &res_size);
2221
2222
2223 params[1] = cur_pos_msf[0];
2224 params[2] = cur_pos_msf[1];
2225 params[3] = cur_pos_msf[2];
2226 params[4] = final_pos_msf[0];
2227 params[5] = final_pos_msf[1];
2228 params[6] = final_pos_msf[2];
2229 params[0] = 0x03;
2230 do_sony_cd_cmd(SONY_AUDIO_PLAYBACK_CMD, params, 7, res_reg, &res_size);
2231 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
2232 {
2233 printk("Sony CDROM error 0x%2.2x (CDROMRESUME)\n", res_reg[1]);
2234 return -EIO;
2235 }
2236 sony_audio_status = CDROM_AUDIO_PLAY;
2237 return 0;
2238 break;
2239
2240 case CDROMPLAYMSF:
2241 verify_area(VERIFY_READ, (char *) arg, 6);
2242 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, &res_size);
2243 memcpy_fromfs(&(params[1]), (void *) arg, 6);
2244
2245
2246 for (i=1; i<7; i++)
2247 {
2248 params[i] = int_to_bcd(params[i]);
2249 }
2250 params[0] = 0x03;
2251 do_sony_cd_cmd(SONY_AUDIO_PLAYBACK_CMD, params, 7, res_reg, &res_size);
2252 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
2253 {
2254 printk("Sony CDROM error 0x%2.2x (CDROMPLAYMSF)\n", res_reg[1]);
2255 return -EIO;
2256 }
2257
2258
2259 final_pos_msf[0] = params[4];
2260 final_pos_msf[1] = params[5];
2261 final_pos_msf[2] = params[6];
2262 sony_audio_status = CDROM_AUDIO_PLAY;
2263 return 0;
2264 break;
2265
2266 case CDROMREADTOCHDR:
2267 {
2268 struct cdrom_tochdr *hdr;
2269 struct cdrom_tochdr loc_hdr;
2270
2271 sony_get_toc(dev);
2272 if (ses_tocs[dev] == NULL)
2273 {
2274 return -EIO;
2275 }
2276
2277 hdr = (struct cdrom_tochdr *) arg;
2278 verify_area(VERIFY_WRITE, hdr, sizeof(*hdr));
2279 loc_hdr.cdth_trk0 = bcd_to_int(ses_tocs[dev]->first_track_num);
2280 loc_hdr.cdth_trk1 = bcd_to_int(ses_tocs[dev]->last_track_num);
2281 memcpy_tofs(hdr, &loc_hdr, sizeof(*hdr));
2282 }
2283 return 0;
2284 break;
2285
2286 case CDROMREADTOCENTRY:
2287 {
2288 struct cdrom_tocentry *entry;
2289 struct cdrom_tocentry loc_entry;
2290 int track_idx;
2291 unsigned char *msf_val = NULL;
2292
2293 sony_get_toc(dev);
2294 if (ses_tocs[dev] == NULL)
2295 {
2296 return -EIO;
2297 }
2298
2299 entry = (struct cdrom_tocentry *) arg;
2300 verify_area(VERIFY_READ, entry, sizeof(*entry));
2301 verify_area(VERIFY_WRITE, entry, sizeof(*entry));
2302
2303 memcpy_fromfs(&loc_entry, entry, sizeof(loc_entry));
2304
2305
2306 if (loc_entry.cdte_track == CDROM_LEADOUT)
2307 {
2308 loc_entry.cdte_adr = ses_tocs[dev]->address2;
2309 loc_entry.cdte_ctrl = ses_tocs[dev]->control2;
2310 msf_val = ses_tocs[dev]->lead_out_start_msf;
2311 }
2312 else
2313 {
2314 track_idx = find_track(int_to_bcd(loc_entry.cdte_track), dev);
2315 if (track_idx < 0)
2316 {
2317 return -EINVAL;
2318 }
2319
2320 loc_entry.cdte_adr = ses_tocs[dev]->tracks[track_idx].address;
2321 loc_entry.cdte_ctrl = ses_tocs[dev]->tracks[track_idx].control;
2322 msf_val = ses_tocs[dev]->tracks[track_idx].track_start_msf;
2323 }
2324
2325
2326 if (loc_entry.cdte_format == CDROM_LBA)
2327 {
2328 loc_entry.cdte_addr.lba = msf_to_log(msf_val);
2329 }
2330 else if (loc_entry.cdte_format == CDROM_MSF)
2331 {
2332 loc_entry.cdte_addr.msf.minute = bcd_to_int(*msf_val);
2333 loc_entry.cdte_addr.msf.second = bcd_to_int(*(msf_val+1));
2334 loc_entry.cdte_addr.msf.frame = bcd_to_int(*(msf_val+2));
2335 }
2336 memcpy_tofs(entry, &loc_entry, sizeof(*entry));
2337 }
2338 return 0;
2339 break;
2340
2341 case CDROMPLAYTRKIND:
2342 {
2343 struct cdrom_ti ti;
2344 int track_idx;
2345
2346 sony_get_toc(dev);
2347 if (ses_tocs[dev] == NULL)
2348 {
2349 return -EIO;
2350 }
2351
2352 verify_area(VERIFY_READ, (char *) arg, sizeof(ti));
2353
2354 memcpy_fromfs(&ti, (char *) arg, sizeof(ti));
2355 if ( (ti.cdti_trk0 < ses_tocs[dev]->first_track_num)
2356 || (ti.cdti_trk0 > ses_tocs[dev]->last_track_num)
2357 || (ti.cdti_trk1 < ti.cdti_trk0))
2358 {
2359 return -EINVAL;
2360 }
2361
2362 track_idx = find_track(int_to_bcd(ti.cdti_trk0), dev);
2363 if (track_idx < 0)
2364 {
2365 return -EINVAL;
2366 }
2367 params[1] = ses_tocs[dev]->tracks[track_idx].track_start_msf[0];
2368 params[2] = ses_tocs[dev]->tracks[track_idx].track_start_msf[1];
2369 params[3] = ses_tocs[dev]->tracks[track_idx].track_start_msf[2];
2370
2371
2372
2373
2374
2375 if (ti.cdti_trk1 >= bcd_to_int(ses_tocs[dev]->last_track_num))
2376 {
2377 log_to_msf(msf_to_log(ses_tocs[dev]->lead_out_start_msf)-1,
2378 &(params[4]));
2379 }
2380 else
2381 {
2382 track_idx = find_track(int_to_bcd(ti.cdti_trk1+1), dev);
2383 if (track_idx < 0)
2384 {
2385 return -EINVAL;
2386 }
2387 log_to_msf(msf_to_log(ses_tocs[dev]->tracks[track_idx].track_start_msf)-1,
2388 &(params[4]));
2389 }
2390 params[0] = 0x03;
2391
2392 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, &res_size);
2393
2394 do_sony_cd_cmd(SONY_AUDIO_PLAYBACK_CMD, params, 7, res_reg, &res_size);
2395 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
2396 {
2397 printk("Params: %x %x %x %x %x %x %x\n", params[0], params[1],
2398 params[2], params[3], params[4], params[5], params[6]);
2399 printk("Sony CDROM error 0x%2.2x (CDROMPLAYTRKIND\n", res_reg[1]);
2400 return -EIO;
2401 }
2402
2403
2404 final_pos_msf[0] = params[4];
2405 final_pos_msf[1] = params[5];
2406 final_pos_msf[2] = params[6];
2407 sony_audio_status = CDROM_AUDIO_PLAY;
2408 return 0;
2409 }
2410
2411 case CDROMSUBCHNL:
2412 return sony_get_subchnl_info(arg, dev);
2413
2414 case CDROMVOLCTRL:
2415 {
2416 struct cdrom_volctrl volctrl;
2417
2418 verify_area(VERIFY_READ, (char *) arg, sizeof(volctrl));
2419
2420 memcpy_fromfs(&volctrl, (char *) arg, sizeof(volctrl));
2421 params[0] = SONY_SD_AUDIO_VOLUME;
2422 params[1] = volctrl.channel0;
2423 params[2] = volctrl.channel1;
2424 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD, params, 3, res_reg, &res_size);
2425 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
2426 {
2427 printk("Sony CDROM error 0x%2.2x (CDROMVOLCTRL)\n", res_reg[1]);
2428 return -EIO;
2429 }
2430 }
2431 return 0;
2432
2433 case CDROMEJECT:
2434 do_sony_cd_cmd(SONY_AUDIO_STOP_CMD, NULL, 0, res_reg, &res_size);
2435 do_sony_cd_cmd(SONY_SPIN_DOWN_CMD, NULL, 0, res_reg, &res_size);
2436
2437 sony_audio_status = CDROM_AUDIO_INVALID;
2438 do_sony_cd_cmd(SONY_EJECT_CMD, NULL, 0, res_reg, &res_size);
2439 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
2440 {
2441 printk("Sony CDROM error 0x%2.2x (CDROMEJECT)\n", res_reg[1]);
2442 return -EIO;
2443 }
2444 return 0;
2445 break;
2446
2447 case CDROMREADAUDIO:
2448
2449 {
2450 struct cdrom_read_audio ra;
2451
2452
2453 sony_get_toc(dev);
2454 if (ses_tocs[dev] == NULL)
2455 {
2456 return -EIO;
2457 }
2458
2459 verify_area(VERIFY_READ, (char *) arg, sizeof(ra));
2460 memcpy_fromfs(&ra, (char *) arg, sizeof(ra));
2461
2462 verify_area(VERIFY_WRITE, ra.buf, CD_FRAMESIZE_RAW * ra.nframes);
2463
2464 if (ra.addr_format == CDROM_LBA)
2465 {
2466 if ( (ra.addr.lba >= ses_tocs[dev]->lead_out_start_lba)
2467 || (ra.addr.lba + ra.nframes >= ses_tocs[dev]->lead_out_start_lba))
2468 {
2469 return -EINVAL;
2470 }
2471 }
2472 else if (ra.addr_format == CDROM_MSF)
2473 {
2474 if ( (ra.addr.msf.minute >= 75)
2475 || (ra.addr.msf.second >= 60)
2476 || (ra.addr.msf.frame >= 75))
2477 {
2478 return -EINVAL;
2479 }
2480
2481 ra.addr.lba = ( (ra.addr.msf.minute * 4500)
2482 + (ra.addr.msf.second * 75)
2483 + ra.addr.msf.frame);
2484 if ( (ra.addr.lba >= ses_tocs[dev]->lead_out_start_lba)
2485 || (ra.addr.lba + ra.nframes >= ses_tocs[dev]->lead_out_start_lba))
2486 {
2487 return -EINVAL;
2488 }
2489
2490
2491
2492
2493 ra.addr.lba -= LOG_START_OFFSET;
2494 }
2495 else
2496 {
2497 return -EINVAL;
2498 }
2499
2500 return(read_audio(&ra, inode));
2501 }
2502 return 0;
2503 break;
2504
2505 default:
2506 return -EINVAL;
2507 }
2508 }
2509
2510
2511
2512
2513
2514
2515 static int
2516 scd_open(struct inode *inode,
2517 struct file *filp)
2518 {
2519 unsigned char res_reg[12];
2520 unsigned int res_size;
2521 int num_spin_ups;
2522 unsigned char params[2];
2523 int dev;
2524
2525
2526 if ((filp) && filp->f_mode & 2)
2527 return -EROFS;
2528
2529 if (!sony_spun_up)
2530 {
2531 num_spin_ups = 0;
2532
2533 respinup_on_open:
2534 do_sony_cd_cmd(SONY_SPIN_UP_CMD, NULL, 0, res_reg, &res_size);
2535
2536
2537
2538 if ((res_size < 2) || ((res_reg[0] != 0) && (res_reg[1] != 0)))
2539 {
2540 printk("Sony CDROM error 0x%2.2x (scd_open, spin up)\n", res_reg[1]);
2541 return -EIO;
2542 }
2543
2544 do_sony_cd_cmd(SONY_READ_TOC_CMD, NULL, 0, res_reg, &res_size);
2545
2546
2547
2548 if ((res_size < 2) || ((res_reg[0] != 0) && (res_reg[1] != 0)))
2549 {
2550
2551 if ((res_reg[1] == SONY_AUDIO_PLAYING_ERR) || (res_reg[1] == 0))
2552 {
2553 goto drive_spinning;
2554 }
2555
2556
2557
2558 if ( (res_reg[1] == SONY_NOT_SPIN_ERR)
2559 && (num_spin_ups < MAX_CDU31A_RETRIES))
2560 {
2561 num_spin_ups++;
2562 goto respinup_on_open;
2563 }
2564
2565 printk("Sony CDROM error 0x%2.2x (scd_open, read toc)\n", res_reg[1]);
2566 do_sony_cd_cmd(SONY_SPIN_DOWN_CMD, NULL, 0, res_reg, &res_size);
2567
2568 return -EIO;
2569 }
2570
2571 dev = MINOR(inode->i_rdev);
2572 sony_get_toc(dev);
2573 if (ses_tocs[dev] == NULL)
2574 {
2575 do_sony_cd_cmd(SONY_SPIN_DOWN_CMD, NULL, 0, res_reg, &res_size);
2576 return -EIO;
2577 }
2578
2579
2580
2581 if ( (ses_tocs[dev]->disk_type == SONY_XA_DISK_TYPE)
2582 && (!is_double_speed))
2583 {
2584 params[0] = SONY_SD_DECODE_PARAM;
2585 params[1] = 0x07;
2586 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD,
2587 params,
2588 2,
2589 res_reg,
2590 &res_size);
2591 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
2592 {
2593 printk("CDU31A: Unable to set XA params: 0x%2.2x\n", res_reg[1]);
2594 }
2595 sony_xa_mode = 1;
2596 }
2597
2598 else if (sony_xa_mode)
2599 {
2600 params[0] = SONY_SD_DECODE_PARAM;
2601 params[1] = 0x0f;
2602 do_sony_cd_cmd(SONY_SET_DRIVE_PARAM_CMD,
2603 params,
2604 2,
2605 res_reg,
2606 &res_size);
2607 if ((res_size < 2) || ((res_reg[0] & 0xf0) == 0x20))
2608 {
2609 printk("CDU31A: Unable to reset XA params: 0x%2.2x\n", res_reg[1]);
2610 }
2611 sony_xa_mode = 0;
2612 }
2613
2614 sony_spun_up = 1;
2615 }
2616
2617 drive_spinning:
2618
2619
2620 if (filp)
2621 {
2622 check_disk_change(inode->i_rdev);
2623 }
2624
2625 sony_usage++;
2626
2627 return 0;
2628 }
2629
2630
2631
2632
2633
2634
2635 static void
2636 scd_release(struct inode *inode,
2637 struct file *filp)
2638 {
2639 unsigned char res_reg[12];
2640 unsigned int res_size;
2641
2642
2643 if (sony_usage > 0)
2644 {
2645 sony_usage--;
2646 }
2647 if (sony_usage == 0)
2648 {
2649 sync_dev(inode->i_rdev);
2650 do_sony_cd_cmd(SONY_SPIN_DOWN_CMD, NULL, 0, res_reg, &res_size);
2651
2652 sony_spun_up = 0;
2653 }
2654 }
2655
2656
2657 static struct file_operations scd_fops = {
2658 NULL,
2659 block_read,
2660 block_write,
2661 NULL,
2662 NULL,
2663 scd_ioctl,
2664 NULL,
2665 scd_open,
2666 scd_release,
2667 NULL,
2668 NULL,
2669 scd_disk_change,
2670 NULL
2671 };
2672
2673
2674
2675 static char *load_mech[] = { "caddy", "tray", "pop-up", "unknown" };
2676
2677 static void
2678 get_drive_configuration(unsigned short base_io,
2679 unsigned char res_reg[],
2680 unsigned int *res_size)
2681 {
2682 int retry_count;
2683
2684
2685
2686 sony_cd_base_io = base_io;
2687
2688
2689 sony_cd_cmd_reg = sony_cd_base_io + SONY_CMD_REG_OFFSET;
2690 sony_cd_param_reg = sony_cd_base_io + SONY_PARAM_REG_OFFSET;
2691 sony_cd_write_reg = sony_cd_base_io + SONY_WRITE_REG_OFFSET;
2692 sony_cd_control_reg = sony_cd_base_io + SONY_CONTROL_REG_OFFSET;
2693 sony_cd_status_reg = sony_cd_base_io + SONY_STATUS_REG_OFFSET;
2694 sony_cd_result_reg = sony_cd_base_io + SONY_RESULT_REG_OFFSET;
2695 sony_cd_read_reg = sony_cd_base_io + SONY_READ_REG_OFFSET;
2696 sony_cd_fifost_reg = sony_cd_base_io + SONY_FIFOST_REG_OFFSET;
2697
2698
2699
2700
2701
2702
2703 if (read_status_register() != 0xff)
2704 {
2705
2706
2707
2708
2709 reset_drive();
2710 retry_count = jiffies + SONY_RESET_TIMEOUT;
2711 while ((retry_count > jiffies) && (!is_attention()))
2712 {
2713 sony_sleep();
2714 }
2715
2716 #if 0
2717
2718 if (!is_attention())
2719 {
2720 res_reg[0] = 0x20;
2721 return;
2722 }
2723 #endif
2724
2725
2726
2727
2728 do_sony_cd_cmd(SONY_REQ_DRIVE_CONFIG_CMD,
2729 NULL,
2730 0,
2731 (unsigned char *) res_reg,
2732 res_size);
2733 return;
2734 }
2735
2736
2737 res_reg[0] = 0x20;
2738 }
2739
2740
2741
2742
2743 void
2744 cdu31a_setup(char *strings,
2745 int *ints)
2746 {
2747 if (ints[0] > 0)
2748 {
2749 sony_cd_base_io = ints[1];
2750 }
2751 if (ints[0] > 1)
2752 {
2753 irq_used = ints[2];
2754 }
2755 }
2756
2757 static int cdu31a_block_size;
2758
2759
2760
2761
2762 unsigned long
2763 cdu31a_init(unsigned long mem_start, unsigned long mem_end)
2764 {
2765 struct s_sony_drive_config drive_config;
2766 unsigned int res_size;
2767 int i;
2768 int drive_found;
2769 int tmp_irq;
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779 outb(0xbc, 0x9a01);
2780 outb(0xe2, 0x9a01);
2781
2782 drive_found = 0;
2783
2784
2785 if (sony_cd_base_io == 0xffff)
2786 {
2787 }
2788 else if (sony_cd_base_io != 0)
2789 {
2790 tmp_irq = irq_used;
2791 irq_used = 0;
2792
2793 get_drive_configuration(sony_cd_base_io,
2794 drive_config.exec_status,
2795 &res_size);
2796 if ((res_size > 2) && ((drive_config.exec_status[0] & 0xf0) == 0x00))
2797 {
2798 drive_found = 1;
2799 }
2800
2801 irq_used = tmp_irq;
2802 }
2803 else
2804 {
2805 irq_used = 0;
2806 i = 0;
2807 while ( (cdu31a_addresses[i].base != 0)
2808 && (!drive_found))
2809 {
2810 if (check_region(cdu31a_addresses[i].base, 4)) {
2811 i++;
2812 continue;
2813 }
2814 get_drive_configuration(cdu31a_addresses[i].base,
2815 drive_config.exec_status,
2816 &res_size);
2817 if ((res_size > 2) && ((drive_config.exec_status[0] & 0xf0) == 0x00))
2818 {
2819 drive_found = 1;
2820 irq_used = cdu31a_addresses[i].int_num;
2821 }
2822 else
2823 {
2824 i++;
2825 }
2826 }
2827 }
2828
2829 if (drive_found)
2830 {
2831 snarf_region(sony_cd_base_io, 4);
2832
2833 if (register_blkdev(MAJOR_NR,"cdu31a",&scd_fops))
2834 {
2835 printk("Unable to get major %d for CDU-31a\n", MAJOR_NR);
2836 return mem_start;
2837 }
2838
2839 if (SONY_HWC_DOUBLE_SPEED(drive_config))
2840 {
2841 is_double_speed = 1;
2842 }
2843
2844
2845 if (irq_used < 0)
2846 {
2847 autoirq_setup(0);
2848 enable_interrupts();
2849 reset_drive();
2850 tmp_irq = autoirq_report(10);
2851 disable_interrupts();
2852
2853 irq_used = 0;
2854 set_drive_params();
2855 irq_used = tmp_irq;
2856 }
2857 else
2858 {
2859 tmp_irq = irq_used;
2860 irq_used = 0;
2861
2862 set_drive_params();
2863
2864 irq_used = tmp_irq;
2865 }
2866
2867 if (irq_used > 0)
2868 {
2869 if (request_irq(irq_used, cdu31a_interrupt, SA_INTERRUPT, "cdu31a"))
2870 {
2871 printk("Unable to grab IRQ%d for the CDU31A driver\n", irq_used);
2872 irq_used = 0;
2873 }
2874 }
2875
2876 printk("Sony I/F CDROM : %8.8s %16.16s %8.8s\n",
2877 drive_config.vendor_id,
2878 drive_config.product_id,
2879 drive_config.product_rev_level);
2880 printk(" Capabilities: %s",
2881 load_mech[SONY_HWC_GET_LOAD_MECH(drive_config)]);
2882 if (SONY_HWC_AUDIO_PLAYBACK(drive_config))
2883 {
2884 printk(", audio");
2885 }
2886 if (SONY_HWC_EJECT(drive_config))
2887 {
2888 printk(", eject");
2889 }
2890 if (SONY_HWC_LED_SUPPORT(drive_config))
2891 {
2892 printk(", LED");
2893 }
2894 if (SONY_HWC_ELECTRIC_VOLUME(drive_config))
2895 {
2896 printk(", elec. Vol");
2897 }
2898 if (SONY_HWC_ELECTRIC_VOLUME_CTL(drive_config))
2899 {
2900 printk(", sep. Vol");
2901 }
2902 if (is_double_speed)
2903 {
2904 printk(", double speed");
2905 }
2906 if (irq_used > 0)
2907 {
2908 printk(", irq %d", irq_used);
2909 }
2910 printk("\n");
2911
2912 blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST;
2913 read_ahead[MAJOR_NR] = CDU31A_READAHEAD;
2914 cdu31a_block_size = 1024;
2915
2916 blksize_size[MAJOR_NR] = &cdu31a_block_size;
2917
2918 last_sony_subcode = (struct s_sony_subcode *) mem_start;
2919 mem_start += sizeof(*last_sony_subcode);
2920 readahead_buffer = (unsigned char *) mem_start;
2921 mem_start += CD_FRAMESIZE_RAW;
2922 }
2923
2924
2925 for (i=0; i<MAX_TRACKS; i++)
2926 {
2927 disk_changed[i] = 1;
2928 }
2929
2930 return mem_start;
2931 }