1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#define VERSION "v4.63 Andrew J. Kroll <ag784@freenet.buffalo.edu> Wed Jul 26 04:24:10 EDT 2000"
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364#include <linux/module.h>
365
366#include <linux/errno.h>
367#include <linux/sched.h>
368#include <linux/mm.h>
369#include <linux/timer.h>
370#include <linux/fs.h>
371#include <linux/kernel.h>
372#include <linux/cdrom.h>
373#include <linux/ioport.h>
374#include <linux/devfs_fs_kernel.h>
375#include <linux/major.h>
376#include <linux/string.h>
377#include <linux/vmalloc.h>
378#include <linux/init.h>
379#include <linux/interrupt.h>
380
381#include <asm/system.h>
382#include <asm/io.h>
383#include <asm/uaccess.h>
384#include <stdarg.h>
385#include <linux/config.h>
386#include "sbpcd.h"
387
388#define MAJOR_NR MATSUSHITA_CDROM_MAJOR
389#include <linux/blkdev.h>
390
391
392#if SBPCD_DIS_IRQ
393# define SBPCD_CLI cli()
394# define SBPCD_STI sti()
395#else
396# define SBPCD_CLI
397# define SBPCD_STI
398#endif
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417static int sbpcd[] =
418{
419 CDROM_PORT, SBPRO,
420#if DISTRIBUTION
421 0x230, 1,
422#if 0
423 0x300, 0,
424
425 0x250, 1,
426 0x2C0, 3,
427 0x260, 1,
428 0x320, 0,
429
430 0x338, 0,
431 0x340, 0,
432 0x360, 0,
433 0x270, 1,
434 0x670, 0,
435 0x690, 0,
436 0x338, 2,
437 0x328, 2,
438 0x348, 2,
439 0x634, 0,
440 0x638, 0,
441 0x230, 1,
442
443 0x630, 0,
444 0x650, 0,
445#ifdef MODULE
446
447
448
449
450 0x330, 0,
451 0x350, 0,
452 0x358, 2,
453 0x370, 0,
454 0x290, 1,
455 0x310, 0,
456#endif
457#endif
458#endif
459};
460
461
462
463
464static __cacheline_aligned DEFINE_SPINLOCK(sbpcd_lock);
465static struct request_queue *sbpcd_queue;
466
467MODULE_PARM(sbpcd, "2i");
468MODULE_PARM(max_drives, "i");
469
470#define NUM_PROBE (sizeof(sbpcd) / sizeof(int))
471
472
473
474#define INLINE inline
475
476
477
478
479
480static void sbp_sleep(u_int);
481static void mark_timeout_delay(u_long);
482static void mark_timeout_data(u_long);
483#if 0
484static void mark_timeout_audio(u_long);
485#endif
486static void sbp_read_cmd(struct request *req);
487static int sbp_data(struct request *req);
488static int cmd_out(void);
489static int DiskInfo(void);
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528#if DISTRIBUTION
529static int sbpcd_debug = (1<<DBG_INF);
530#else
531static int sbpcd_debug = 0 & ((1<<DBG_INF) |
532 (1<<DBG_TOC) |
533 (1<<DBG_MUL) |
534 (1<<DBG_UPC));
535#endif
536
537static int sbpcd_ioaddr = CDROM_PORT;
538static int sbpro_type = SBPRO;
539static unsigned char f_16bit;
540static unsigned char do_16bit;
541static int CDo_command, CDo_reset;
542static int CDo_sel_i_d, CDo_enable;
543static int CDi_info, CDi_status, CDi_data;
544static struct cdrom_msf msf;
545static struct cdrom_ti ti;
546static struct cdrom_tochdr tochdr;
547static struct cdrom_tocentry tocentry;
548static struct cdrom_subchnl SC;
549static struct cdrom_volctrl volctrl;
550static struct cdrom_read_audio read_audio;
551
552static unsigned char msgnum;
553static char msgbuf[80];
554
555static int max_drives = MAX_DRIVES;
556#ifndef MODULE
557static unsigned char setup_done;
558static const char *str_sb_l = "soundblaster";
559static const char *str_sp_l = "spea";
560static const char *str_ss_l = "soundscape";
561static const char *str_t16_l = "teac16bit";
562static const char *str_ss = "SoundScape";
563#endif
564static const char *str_sb = "SoundBlaster";
565static const char *str_lm = "LaserMate";
566static const char *str_sp = "SPEA";
567static const char *str_t16 = "Teac16bit";
568static const char *type;
569static const char *major_name="sbpcd";
570
571
572
573#ifdef FUTURE
574static DECLARE_WAIT_QUEUE_HEAD(sbp_waitq);
575#endif
576
577static int teac=SBP_TEAC_SPEED;
578static int buffers=SBP_BUFFER_FRAMES;
579
580static u_char family0[]="MATSHITA";
581static u_char family1[]="CR-56";
582static u_char family2[]="CD200";
583static u_char familyL[]="LCS-7260";
584static u_char familyT[]="CD-55";
585static u_char familyV[]="ECS-AT";
586
587static u_int recursion;
588static u_int fatal_err;
589static u_int response_count;
590static u_int flags_cmd_out;
591static u_char cmd_type;
592static u_char drvcmd[10];
593static u_char infobuf[20];
594static u_char xa_head_buf[CD_XA_HEAD];
595static u_char xa_tail_buf[CD_XA_TAIL];
596
597#if OLD_BUSY
598static volatile u_char busy_data;
599static volatile u_char busy_audio;
600#endif
601static DECLARE_MUTEX(ioctl_read_sem);
602static u_long timeout;
603static volatile u_char timed_out_delay;
604static volatile u_char timed_out_data;
605#if 0
606static volatile u_char timed_out_audio;
607#endif
608static u_int datarate= 1000000;
609static u_int maxtim16=16000000;
610static u_int maxtim04= 4000000;
611static u_int maxtim02= 2000000;
612static u_int maxtim_8= 30000;
613#if LONG_TIMING
614static u_int maxtim_data= 9000;
615#else
616static u_int maxtim_data= 3000;
617#endif
618#if DISTRIBUTION
619static int n_retries=6;
620#else
621static int n_retries=6;
622#endif
623
624
625static int ndrives;
626static u_char drv_pattern[NR_SBPCD]={speed_auto,speed_auto,speed_auto,speed_auto};
627
628
629
630
631
632static struct sbpcd_drive {
633 char drv_id;
634 char drv_sel;
635
636 char drive_model[9];
637 u_char firmware_version[4];
638 char f_eject;
639 u_char *sbp_buf;
640
641 u_int sbp_bufsiz;
642 int sbp_first_frame;
643 int sbp_last_frame;
644 int sbp_read_frames;
645 int sbp_current;
646
647 u_char mode;
648 u_char *aud_buf;
649
650 u_int sbp_audsiz;
651 u_int drv_type;
652 u_char drv_options;
653 int status_bits;
654 u_char diskstate_flags;
655 u_char sense_byte;
656
657 u_char CD_changed;
658 char open_count;
659 u_char error_byte;
660
661 u_char f_multisession;
662 u_int lba_multi;
663 int first_session;
664 int last_session;
665 int track_of_last_session;
666
667 u_char audio_state;
668 u_int pos_audio_start;
669 u_int pos_audio_end;
670 char vol_chan0;
671 u_char vol_ctrl0;
672 char vol_chan1;
673 u_char vol_ctrl1;
674#if 000
675 char vol_chan2;
676 u_char vol_ctrl2;
677 char vol_chan3;
678 u_char vol_ctrl3;
679#endif
680 u_char volume_control;
681
682 u_char SubQ_ctl_adr;
683 u_char SubQ_trk;
684 u_char SubQ_pnt_idx;
685 u_int SubQ_run_tot;
686 u_int SubQ_run_trk;
687 u_char SubQ_whatisthis;
688
689 u_char UPC_ctl_adr;
690 u_char UPC_buf[7];
691
692 int frame_size;
693 int CDsize_frm;
694
695 u_char xa_byte;
696 u_char n_first_track;
697 u_char n_last_track;
698 u_int size_msf;
699 u_int size_blk;
700
701 u_char TocEnt_nixbyte;
702 u_char TocEnt_ctl_adr;
703 u_char TocEnt_number;
704 u_char TocEnt_format;
705 u_int TocEnt_address;
706#ifdef SAFE_MIXED
707 char has_data;
708#endif
709 u_char ored_ctl_adr;
710
711 struct {
712 u_char nixbyte;
713 u_char ctl_adr;
714 u_char number;
715 u_char format;
716 u_int address;
717 } TocBuffer[MAX_TRACKS+1];
718
719 int in_SpinUp;
720 int n_bytes;
721 u_char error_state, b3, b4;
722 u_char f_drv_error;
723 u_char speed_byte;
724 int frmsiz;
725 u_char f_XA;
726 u_char type_byte;
727 u_char mode_xb_6;
728 u_char mode_yb_7;
729 u_char mode_xb_8;
730 u_char delay;
731 struct cdrom_device_info *sbpcd_infop;
732 struct gendisk *disk;
733} D_S[NR_SBPCD];
734
735static struct sbpcd_drive *current_drive = D_S;
736
737
738
739
740
741#if 0
742unsigned long cli_sti;
743#endif
744
745static struct timer_list delay_timer =
746 TIMER_INITIALIZER(mark_timeout_delay, 0, 0);
747static struct timer_list data_timer =
748 TIMER_INITIALIZER(mark_timeout_data, 0, 0);
749#if 0
750static struct timer_list audio_timer =
751 TIMER_INITIALIZER(mark_timeout_audio, 0, 0);
752#endif
753
754
755
756
757static void msg(int level, const char *fmt, ...)
758{
759#if DISTRIBUTION
760#define MSG_LEVEL KERN_NOTICE
761#else
762#define MSG_LEVEL KERN_INFO
763#endif
764
765 char buf[256];
766 va_list args;
767
768 if (!(sbpcd_debug&(1<<level))) return;
769
770 msgnum++;
771 if (msgnum>99) msgnum=0;
772 sprintf(buf, MSG_LEVEL "%s-%d [%02d]: ", major_name, current_drive - D_S, msgnum);
773 va_start(args, fmt);
774 vsprintf(&buf[18], fmt, args);
775 va_end(args);
776 printk(buf);
777#if KLOGD_PAUSE
778 sbp_sleep(KLOGD_PAUSE);
779#endif
780 return;
781}
782
783
784
785
786static int sbpcd_dbg_ioctl(unsigned long arg, int level)
787{
788 switch(arg)
789 {
790 case 0:
791 sbpcd_debug = DBG_INF;
792 break;
793
794 default:
795 if (arg>=128) sbpcd_debug &= ~(1<<(arg-128));
796 else sbpcd_debug |= (1<<arg);
797 }
798 return (arg);
799}
800
801static void mark_timeout_delay(u_long i)
802{
803 timed_out_delay=1;
804#if 0
805 msg(DBG_TIM,"delay timer expired.\n");
806#endif
807}
808
809static void mark_timeout_data(u_long i)
810{
811 timed_out_data=1;
812#if 0
813 msg(DBG_TIM,"data timer expired.\n");
814#endif
815}
816
817#if 0
818static void mark_timeout_audio(u_long i)
819{
820 timed_out_audio=1;
821#if 0
822 msg(DBG_TIM,"audio timer expired.\n");
823#endif
824}
825#endif
826
827
828
829
830static void sbp_sleep(u_int time)
831{
832 sti();
833 current->state = TASK_INTERRUPTIBLE;
834 schedule_timeout(time);
835 sti();
836}
837
838#define RETURN_UP(rc) {up(&ioctl_read_sem); return(rc);}
839
840
841
842
843static INLINE void lba2msf(int lba, u_char *msf)
844{
845 lba += CD_MSF_OFFSET;
846 msf[0] = lba / (CD_SECS*CD_FRAMES);
847 lba %= CD_SECS*CD_FRAMES;
848 msf[1] = lba / CD_FRAMES;
849 msf[2] = lba % CD_FRAMES;
850}
851
852
853
854
855
856static INLINE void bin2bcdx(u_char *p)
857{
858 *p=((*p/10)<<4)|(*p%10);
859}
860
861static INLINE u_int blk2msf(u_int blk)
862{
863 MSF msf;
864 u_int mm;
865
866 msf.c[3] = 0;
867 msf.c[2] = (blk + CD_MSF_OFFSET) / (CD_SECS * CD_FRAMES);
868 mm = (blk + CD_MSF_OFFSET) % (CD_SECS * CD_FRAMES);
869 msf.c[1] = mm / CD_FRAMES;
870 msf.c[0] = mm % CD_FRAMES;
871 return (msf.n);
872}
873
874static INLINE u_int make16(u_char rh, u_char rl)
875{
876 return ((rh<<8)|rl);
877}
878
879static INLINE u_int make32(u_int rh, u_int rl)
880{
881 return ((rh<<16)|rl);
882}
883
884static INLINE u_char swap_nibbles(u_char i)
885{
886 return ((i<<4)|(i>>4));
887}
888
889static INLINE u_char byt2bcd(u_char i)
890{
891 return (((i/10)<<4)+i%10);
892}
893
894static INLINE u_char bcd2bin(u_char bcd)
895{
896 return ((bcd>>4)*10+(bcd&0x0F));
897}
898
899static INLINE int msf2blk(int msfx)
900{
901 MSF msf;
902 int i;
903
904 msf.n=msfx;
905 i=(msf.c[2] * CD_SECS + msf.c[1]) * CD_FRAMES + msf.c[0] - CD_MSF_OFFSET;
906 if (i<0) return (0);
907 return (i);
908}
909
910
911
912
913static INLINE int msf2lba(u_char *msf)
914{
915 int i;
916
917 i=(msf[0] * CD_SECS + msf[1]) * CD_FRAMES + msf[2] - CD_MSF_OFFSET;
918 if (i<0) return (0);
919 return (i);
920}
921
922
923static int sta2err(int sta)
924{
925 if (famT_drive)
926 {
927 if (sta==0x00) return (0);
928 if (sta==0x01) return (-604);
929 if (sta==0x02) return (-602);
930 if (sta==0x03) return (-607);
931 if (sta==0x04) return (-612);
932 if (sta==0x05) return (0);
933 if (sta==0x06) return (-ERR_DISKCHANGE);
934 if (sta==0x0b) return (-612);
935 if (sta==0xff) return (-612);
936 return (0);
937 }
938 else
939 {
940 if (sta<=2) return (sta);
941 if (sta==0x05) return (-604);
942 if (sta==0x06) return (-606);
943 if (sta==0x0d) return (-606);
944 if (sta==0x0e) return (-603);
945 if (sta==0x14) return (-603);
946 if (sta==0x0c) return (-611);
947 if (sta==0x0f) return (-611);
948 if (sta==0x10) return (-611);
949 if (sta>=0x16) return (-612);
950 if (sta==0x11) return (-ERR_DISKCHANGE);
951 if (famL_drive)
952 if (sta==0x12) return (-ERR_DISKCHANGE);
953 return (-602);
954 }
955}
956
957static INLINE void clr_cmdbuf(void)
958{
959 int i;
960
961 for (i=0;i<10;i++) drvcmd[i]=0;
962 cmd_type=0;
963}
964
965static void flush_status(void)
966{
967 int i;
968
969 sbp_sleep(15*HZ/10);
970 for (i=maxtim_data;i!=0;i--) inb(CDi_status);
971}
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987static int CDi_stat_loop_T(void)
988{
989 int i, gear=1;
990 u_long timeout_1, timeout_2, timeout_3, timeout_4;
991
992 timeout_1 = jiffies + HZ / 50;
993 timeout_2 = jiffies + HZ / 5;
994 timeout_3 = jiffies + 5 * HZ;
995 timeout_4 = jiffies + 45 * HZ;
996 do
997 {
998 i = inb(CDi_status);
999 if (!(i&s_not_data_ready)) return (i);
1000 if (!(i&s_not_result_ready)) return (i);
1001 switch(gear)
1002 {
1003 case 4:
1004 sbp_sleep(HZ);
1005 if (time_after(jiffies, timeout_4)) gear++;
1006 msg(DBG_TEA, "CDi_stat_loop_T: long sleep active.\n");
1007 break;
1008 case 3:
1009 sbp_sleep(HZ/10);
1010 if (time_after(jiffies, timeout_3)) gear++;
1011 break;
1012 case 2:
1013 sbp_sleep(HZ/100);
1014 if (time_after(jiffies, timeout_2)) gear++;
1015 break;
1016 case 1:
1017 sbp_sleep(0);
1018 if (time_after(jiffies, timeout_1)) gear++;
1019 }
1020 } while (gear < 5);
1021 return -1;
1022}
1023
1024static int CDi_stat_loop(void)
1025{
1026 int i,j;
1027
1028 for(timeout = jiffies + 10*HZ, i=maxtim_data; time_before(jiffies, timeout); )
1029 {
1030 for ( ;i!=0;i--)
1031 {
1032 j=inb(CDi_status);
1033 if (!(j&s_not_data_ready)) return (j);
1034 if (!(j&s_not_result_ready)) return (j);
1035 if (fam0L_drive) if (j&s_attention) return (j);
1036 }
1037 sbp_sleep(1);
1038 i = 1;
1039 }
1040 msg(DBG_LCS,"CDi_stat_loop failed in line %d\n", __LINE__);
1041 return (-1);
1042}
1043
1044#if 00000
1045
1046static int tst_DataReady(void)
1047{
1048 int i;
1049
1050 i=inb(CDi_status);
1051 if (i&s_not_data_ready) return (0);
1052 return (1);
1053}
1054
1055static int tst_ResultReady(void)
1056{
1057 int i;
1058
1059 i=inb(CDi_status);
1060 if (i&s_not_result_ready) return (0);
1061 return (1);
1062}
1063
1064static int tst_Attention(void)
1065{
1066 int i;
1067
1068 i=inb(CDi_status);
1069 if (i&s_attention) return (1);
1070 return (0);
1071}
1072
1073#endif
1074
1075static int ResponseInfo(void)
1076{
1077 int i,j,st=0;
1078 u_long timeout;
1079
1080 for (i=0,timeout=jiffies+HZ;i<response_count;i++)
1081 {
1082 for (j=maxtim_data; ; )
1083 {
1084 for ( ;j!=0;j-- )
1085 {
1086 st=inb(CDi_status);
1087 if (!(st&s_not_result_ready)) break;
1088 }
1089 if ((j!=0)||time_after_eq(jiffies, timeout)) break;
1090 sbp_sleep(1);
1091 j = 1;
1092 }
1093 if (time_after_eq(jiffies, timeout)) break;
1094 infobuf[i]=inb(CDi_info);
1095 }
1096#if 000
1097 while (!(inb(CDi_status)&s_not_result_ready))
1098 {
1099 infobuf[i++]=inb(CDi_info);
1100 }
1101 j=i-response_count;
1102 if (j>0) msg(DBG_INF,"ResponseInfo: got %d trailing bytes.\n",j);
1103#endif
1104 for (j=0;j<i;j++)
1105 sprintf(&msgbuf[j*3]," %02X",infobuf[j]);
1106 msgbuf[j*3]=0;
1107 msg(DBG_CMD,"ResponseInfo:%s (%d,%d)\n",msgbuf,response_count,i);
1108 j=response_count-i;
1109 if (j>0) return (-j);
1110 else return (i);
1111}
1112
1113static void EvaluateStatus(int st)
1114{
1115 current_drive->status_bits=0;
1116 if (fam1_drive) current_drive->status_bits=st|p_success;
1117 else if (fam0_drive)
1118 {
1119 if (st&p_caddin_old) current_drive->status_bits |= p_door_closed|p_caddy_in;
1120 if (st&p_spinning) current_drive->status_bits |= p_spinning;
1121 if (st&p_check) current_drive->status_bits |= p_check;
1122 if (st&p_success_old) current_drive->status_bits |= p_success;
1123 if (st&p_busy_old) current_drive->status_bits |= p_busy_new;
1124 if (st&p_disk_ok) current_drive->status_bits |= p_disk_ok;
1125 }
1126 else if (famLV_drive)
1127 {
1128 current_drive->status_bits |= p_success;
1129 if (st&p_caddin_old) current_drive->status_bits |= p_disk_ok|p_caddy_in;
1130 if (st&p_spinning) current_drive->status_bits |= p_spinning;
1131 if (st&p_check) current_drive->status_bits |= p_check;
1132 if (st&p_busy_old) current_drive->status_bits |= p_busy_new;
1133 if (st&p_lcs_door_closed) current_drive->status_bits |= p_door_closed;
1134 if (st&p_lcs_door_locked) current_drive->status_bits |= p_door_locked;
1135 }
1136 else if (fam2_drive)
1137 {
1138 current_drive->status_bits |= p_success;
1139 if (st&p2_check) current_drive->status_bits |= p1_check;
1140 if (st&p2_door_closed) current_drive->status_bits |= p1_door_closed;
1141 if (st&p2_disk_in) current_drive->status_bits |= p1_disk_in;
1142 if (st&p2_busy1) current_drive->status_bits |= p1_busy;
1143 if (st&p2_busy2) current_drive->status_bits |= p1_busy;
1144 if (st&p2_spinning) current_drive->status_bits |= p1_spinning;
1145 if (st&p2_door_locked) current_drive->status_bits |= p1_door_locked;
1146 if (st&p2_disk_ok) current_drive->status_bits |= p1_disk_ok;
1147 }
1148 else if (famT_drive)
1149 {
1150 return;
1151 current_drive->status_bits |= p_success;
1152 if (st&p2_check) current_drive->status_bits |= p1_check;
1153 if (st&p2_door_closed) current_drive->status_bits |= p1_door_closed;
1154 if (st&p2_disk_in) current_drive->status_bits |= p1_disk_in;
1155 if (st&p2_busy1) current_drive->status_bits |= p1_busy;
1156 if (st&p2_busy2) current_drive->status_bits |= p1_busy;
1157 if (st&p2_spinning) current_drive->status_bits |= p1_spinning;
1158 if (st&p2_door_locked) current_drive->status_bits |= p1_door_locked;
1159 if (st&p2_disk_ok) current_drive->status_bits |= p1_disk_ok;
1160 }
1161 return;
1162}
1163
1164static int cmd_out_T(void);
1165
1166static int get_state_T(void)
1167{
1168 int i;
1169
1170 clr_cmdbuf();
1171 current_drive->n_bytes=1;
1172 drvcmd[0]=CMDT_STATUS;
1173 i=cmd_out_T();
1174 if (i>=0) i=infobuf[0];
1175 else
1176 {
1177 msg(DBG_TEA,"get_state_T error %d\n", i);
1178 return (i);
1179 }
1180 if (i>=0)
1181
1182 current_drive->status_bits=p1_door_closed|p1_disk_in|p1_spinning|p1_disk_ok;
1183 else if (current_drive->error_state==6)
1184 {
1185
1186 current_drive->status_bits=p1_door_closed|p1_disk_in;
1187 current_drive->CD_changed=0xFF;
1188 current_drive->diskstate_flags &= ~toc_bit;
1189 }
1190 else if ((current_drive->error_state!=2)||(current_drive->b3!=0x3A)||(current_drive->b4==0x00))
1191 {
1192
1193 current_drive->status_bits=p1_door_closed;
1194 current_drive->open_count=0;
1195 }
1196 else if (current_drive->b4==0x01)
1197 {
1198
1199 current_drive->status_bits=0;
1200 current_drive->open_count=0;
1201 }
1202 else
1203 {
1204
1205 current_drive->status_bits=p1_door_closed;
1206 current_drive->open_count=0;
1207 }
1208 return (current_drive->status_bits);
1209}
1210
1211static int ResponseStatus(void)
1212{
1213 int i,j;
1214 u_long timeout;
1215
1216 msg(DBG_STA,"doing ResponseStatus...\n");
1217 if (famT_drive) return (get_state_T());
1218 if (flags_cmd_out & f_respo3) timeout = jiffies;
1219 else if (flags_cmd_out & f_respo2) timeout = jiffies + 16*HZ;
1220 else timeout = jiffies + 4*HZ;
1221 j=maxtim_8;
1222 do
1223 {
1224 for ( ;j!=0;j--)
1225 {
1226 i=inb(CDi_status);
1227 if (!(i&s_not_result_ready)) break;
1228 }
1229 if ((j!=0)||time_after(jiffies, timeout)) break;
1230 sbp_sleep(1);
1231 j = 1;
1232 }
1233 while (1);
1234 if (j==0)
1235 {
1236 if ((flags_cmd_out & f_respo3) == 0)
1237 msg(DBG_STA,"ResponseStatus: timeout.\n");
1238 current_drive->status_bits=0;
1239 return (-401);
1240 }
1241 i=inb(CDi_info);
1242 msg(DBG_STA,"ResponseStatus: response %02X.\n", i);
1243 EvaluateStatus(i);
1244 msg(DBG_STA,"status_bits=%02X, i=%02X\n",current_drive->status_bits,i);
1245 return (current_drive->status_bits);
1246}
1247
1248static void cc_ReadStatus(void)
1249{
1250 int i;
1251
1252 msg(DBG_STA,"giving cc_ReadStatus command\n");
1253 if (famT_drive) return;
1254 SBPCD_CLI;
1255 if (fam0LV_drive) OUT(CDo_command,CMD0_STATUS);
1256 else if (fam1_drive) OUT(CDo_command,CMD1_STATUS);
1257 else if (fam2_drive) OUT(CDo_command,CMD2_STATUS);
1258 if (!fam0LV_drive) for (i=0;i<6;i++) OUT(CDo_command,0);
1259 SBPCD_STI;
1260}
1261
1262static int cc_ReadError(void)
1263{
1264 int i;
1265
1266 clr_cmdbuf();
1267 msg(DBG_ERR,"giving cc_ReadError command.\n");
1268 if (fam1_drive)
1269 {
1270 drvcmd[0]=CMD1_READ_ERR;
1271 response_count=8;
1272 flags_cmd_out=f_putcmd|f_ResponseStatus;
1273 }
1274 else if (fam0LV_drive)
1275 {
1276 drvcmd[0]=CMD0_READ_ERR;
1277 response_count=6;
1278 if (famLV_drive)
1279 flags_cmd_out=f_putcmd;
1280 else
1281 flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus;
1282 }
1283 else if (fam2_drive)
1284 {
1285 drvcmd[0]=CMD2_READ_ERR;
1286 response_count=6;
1287 flags_cmd_out=f_putcmd;
1288 }
1289 else if (famT_drive)
1290 {
1291 response_count=5;
1292 drvcmd[0]=CMDT_READ_ERR;
1293 }
1294 i=cmd_out();
1295 current_drive->error_byte=0;
1296 msg(DBG_ERR,"cc_ReadError: cmd_out(CMDx_READ_ERR) returns %d (%02X)\n",i,i);
1297 if (i<0) return (i);
1298 if (fam0V_drive) i=1;
1299 else i=2;
1300 current_drive->error_byte=infobuf[i];
1301 msg(DBG_ERR,"cc_ReadError: infobuf[%d] is %d (%02X)\n",i,current_drive->error_byte,current_drive->error_byte);
1302 i=sta2err(infobuf[i]);
1303 if (i==-ERR_DISKCHANGE)
1304 {
1305 current_drive->CD_changed=0xFF;
1306 current_drive->diskstate_flags &= ~toc_bit;
1307 }
1308 return (i);
1309}
1310
1311static int cc_DriveReset(void);
1312
1313static int cmd_out_T(void)
1314{
1315#undef CMDT_TRIES
1316#define CMDT_TRIES 1000
1317#define TEST_FALSE_FF 1
1318
1319 int i, j, l=0, m, ntries;
1320 unsigned long flags;
1321
1322 current_drive->error_state=0;
1323 current_drive->b3=0;
1324 current_drive->b4=0;
1325 current_drive->f_drv_error=0;
1326 for (i=0;i<10;i++) sprintf(&msgbuf[i*3]," %02X",drvcmd[i]);
1327 msgbuf[i*3]=0;
1328 msg(DBG_CMD,"cmd_out_T:%s\n",msgbuf);
1329
1330 OUT(CDo_sel_i_d,0);
1331 OUT(CDo_enable,current_drive->drv_sel);
1332 i=inb(CDi_status);
1333 do_16bit=0;
1334 if ((f_16bit)&&(!(i&0x80)))
1335 {
1336 do_16bit=1;
1337 msg(DBG_TEA,"cmd_out_T: do_16bit set.\n");
1338 }
1339 if (!(i&s_not_result_ready))
1340 do
1341 {
1342 j=inb(CDi_info);
1343 i=inb(CDi_status);
1344 sbp_sleep(0);
1345 msg(DBG_TEA,"cmd_out_T: spurious !s_not_result_ready. (%02X)\n", j);
1346 }
1347 while (!(i&s_not_result_ready));
1348 save_flags(flags); cli();
1349 for (i=0;i<10;i++) OUT(CDo_command,drvcmd[i]);
1350 restore_flags(flags);
1351 for (ntries=CMDT_TRIES;ntries>0;ntries--)
1352 {
1353 if (drvcmd[0]==CMDT_READ_VER) sbp_sleep(HZ);
1354#if 01
1355 OUT(CDo_sel_i_d,1);
1356#endif
1357 if (teac==2)
1358 {
1359 if ((i=CDi_stat_loop_T()) == -1) break;
1360 }
1361 else
1362 {
1363#if 0
1364 OUT(CDo_sel_i_d,1);
1365#endif
1366 i=inb(CDi_status);
1367 }
1368 if (!(i&s_not_data_ready))
1369 {
1370 OUT(CDo_sel_i_d,1);
1371 if (drvcmd[0]==CMDT_READ) return (0);
1372 if (drvcmd[0]==CMDT_DISKINFO)
1373 {
1374 l=0;
1375 do
1376 {
1377 if (do_16bit)
1378 {
1379 i=inw(CDi_data);
1380 infobuf[l++]=i&0x0ff;
1381 infobuf[l++]=i>>8;
1382#if TEST_FALSE_FF
1383 if ((l==2)&&(infobuf[0]==0x0ff))
1384 {
1385 infobuf[0]=infobuf[1];
1386 l=1;
1387 msg(DBG_TEA,"cmd_out_T: do_16bit: false first byte!\n");
1388 }
1389#endif
1390 }
1391 else infobuf[l++]=inb(CDi_data);
1392 i=inb(CDi_status);
1393 }
1394 while (!(i&s_not_data_ready));
1395 for (j=0;j<l;j++) sprintf(&msgbuf[j*3]," %02X",infobuf[j]);
1396 msgbuf[j*3]=0;
1397 msg(DBG_CMD,"cmd_out_T data response:%s\n", msgbuf);
1398 }
1399 else
1400 {
1401 msg(DBG_TEA,"cmd_out_T: data response with cmd_%02X!\n",
1402 drvcmd[0]);
1403 j=0;
1404 do
1405 {
1406 if (do_16bit) i=inw(CDi_data);
1407 else i=inb(CDi_data);
1408 j++;
1409 i=inb(CDi_status);
1410 }
1411 while (!(i&s_not_data_ready));
1412 msg(DBG_TEA,"cmd_out_T: data response: discarded %d bytes/words.\n", j);
1413 fatal_err++;
1414 }
1415 }
1416 i=inb(CDi_status);
1417 if (!(i&s_not_result_ready))
1418 {
1419 OUT(CDo_sel_i_d,0);
1420 if (drvcmd[0]==CMDT_DISKINFO) m=l;
1421 else m=0;
1422 do
1423 {
1424 infobuf[m++]=inb(CDi_info);
1425 i=inb(CDi_status);
1426 }
1427 while (!(i&s_not_result_ready));
1428 for (j=0;j<m;j++) sprintf(&msgbuf[j*3]," %02X",infobuf[j]);
1429 msgbuf[j*3]=0;
1430 msg(DBG_CMD,"cmd_out_T info response:%s\n", msgbuf);
1431 if (drvcmd[0]==CMDT_DISKINFO)
1432 {
1433 infobuf[0]=infobuf[l];
1434 if (infobuf[0]!=0x02) return (l);
1435 }
1436 else if (infobuf[0]!=0x02) return (m);
1437 do
1438 {
1439 ++recursion;
1440 if (recursion>1) msg(DBG_TEA,"cmd_out_T READ_ERR recursion (%02X): %d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", drvcmd[0], recursion);
1441 clr_cmdbuf();
1442 drvcmd[0]=CMDT_READ_ERR;
1443 j=cmd_out_T();
1444 --recursion;
1445 sbp_sleep(1);
1446 }
1447 while (j<0);
1448 current_drive->error_state=infobuf[2];
1449 current_drive->b3=infobuf[3];
1450 current_drive->b4=infobuf[4];
1451 if (current_drive->f_drv_error)
1452 {
1453 current_drive->f_drv_error=0;
1454 cc_DriveReset();
1455 current_drive->error_state=2;
1456 }
1457 return (-current_drive->error_state-400);
1458 }
1459 if (drvcmd[0]==CMDT_READ) return (0);
1460 if ((teac==0)||(ntries<(CMDT_TRIES-5))) sbp_sleep(HZ/10);
1461 else sbp_sleep(HZ/100);
1462 if (ntries>(CMDT_TRIES-50)) continue;
1463 msg(DBG_TEA,"cmd_out_T: next CMDT_TRIES (%02X): %d.\n", drvcmd[0], ntries-1);
1464 }
1465 current_drive->f_drv_error=1;
1466 cc_DriveReset();
1467 current_drive->error_state=2;
1468 return (-99);
1469}
1470
1471static int cmd_out(void)
1472{
1473 int i=0;
1474
1475 if (famT_drive) return(cmd_out_T());
1476
1477 if (flags_cmd_out&f_putcmd)
1478 {
1479 unsigned long flags;
1480 for (i=0;i<7;i++)
1481 sprintf(&msgbuf[i*3], " %02X", drvcmd[i]);
1482 msgbuf[i*3]=0;
1483 msg(DBG_CMD,"cmd_out:%s\n", msgbuf);
1484 save_flags(flags); cli();
1485 for (i=0;i<7;i++) OUT(CDo_command,drvcmd[i]);
1486 restore_flags(flags);
1487 }
1488 if (response_count!=0)
1489 {
1490 if (cmd_type!=0)
1491 {
1492 if (sbpro_type==1) OUT(CDo_sel_i_d,1);
1493 msg(DBG_INF,"misleaded to try ResponseData.\n");
1494 if (sbpro_type==1) OUT(CDo_sel_i_d,0);
1495 return (-22);
1496 }
1497 else i=ResponseInfo();
1498 if (i<0) return (i);
1499 }
1500 if (current_drive->in_SpinUp) msg(DBG_SPI,"in_SpinUp: to CDi_stat_loop.\n");
1501 if (flags_cmd_out&f_lopsta)
1502 {
1503 i=CDi_stat_loop();
1504 if ((i<0)||!(i&s_attention)) return (-8);
1505 }
1506 if (!(flags_cmd_out&f_getsta)) goto LOC_229;
1507
1508 LOC_228:
1509 if (current_drive->in_SpinUp) msg(DBG_SPI,"in_SpinUp: to cc_ReadStatus.\n");
1510 cc_ReadStatus();
1511
1512 LOC_229:
1513 if (flags_cmd_out&f_ResponseStatus)
1514 {
1515 if (current_drive->in_SpinUp) msg(DBG_SPI,"in_SpinUp: to ResponseStatus.\n");
1516 i=ResponseStatus();
1517
1518 if (i<0) return (i);
1519 if (flags_cmd_out&(f_bit1|f_wait_if_busy))
1520 {
1521 if (!st_check)
1522 {
1523 if ((flags_cmd_out&f_bit1)&&(i&p_success)) goto LOC_232;
1524 if ((!(flags_cmd_out&f_wait_if_busy))||(!st_busy)) goto LOC_228;
1525 }
1526 }
1527 }
1528 LOC_232:
1529 if (!(flags_cmd_out&f_obey_p_check)) return (0);
1530 if (!st_check) return (0);
1531 if (current_drive->in_SpinUp) msg(DBG_SPI,"in_SpinUp: to cc_ReadError.\n");
1532 i=cc_ReadError();
1533 if (current_drive->in_SpinUp) msg(DBG_SPI,"in_SpinUp: to cmd_out OK.\n");
1534 msg(DBG_000,"cmd_out: cc_ReadError=%d\n", i);
1535 return (i);
1536}
1537
1538static int cc_Seek(u_int pos, char f_blk_msf)
1539{
1540 int i;
1541
1542 clr_cmdbuf();
1543 if (f_blk_msf>1) return (-3);
1544 if (fam0V_drive)
1545 {
1546 drvcmd[0]=CMD0_SEEK;
1547 if (f_blk_msf==1) pos=msf2blk(pos);
1548 drvcmd[2]=(pos>>16)&0x00FF;
1549 drvcmd[3]=(pos>>8)&0x00FF;
1550 drvcmd[4]=pos&0x00FF;
1551 if (fam0_drive)
1552 flags_cmd_out = f_putcmd | f_respo2 | f_lopsta | f_getsta |
1553 f_ResponseStatus | f_obey_p_check | f_bit1;
1554 else
1555 flags_cmd_out = f_putcmd;
1556 }
1557 else if (fam1L_drive)
1558 {
1559 drvcmd[0]=CMD1_SEEK;
1560 if (f_blk_msf==0) pos=blk2msf(pos);
1561 drvcmd[1]=(pos>>16)&0x00FF;
1562 drvcmd[2]=(pos>>8)&0x00FF;
1563 drvcmd[3]=pos&0x00FF;
1564 if (famL_drive)
1565 flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
1566 else
1567 flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
1568 }
1569 else if (fam2_drive)
1570 {
1571 drvcmd[0]=CMD2_SEEK;
1572 if (f_blk_msf==0) pos=blk2msf(pos);
1573 drvcmd[2]=(pos>>24)&0x00FF;
1574 drvcmd[3]=(pos>>16)&0x00FF;
1575 drvcmd[4]=(pos>>8)&0x00FF;
1576 drvcmd[5]=pos&0x00FF;
1577 flags_cmd_out=f_putcmd|f_ResponseStatus;
1578 }
1579 else if (famT_drive)
1580 {
1581 drvcmd[0]=CMDT_SEEK;
1582 if (f_blk_msf==1) pos=msf2blk(pos);
1583 drvcmd[2]=(pos>>24)&0x00FF;
1584 drvcmd[3]=(pos>>16)&0x00FF;
1585 drvcmd[4]=(pos>>8)&0x00FF;
1586 drvcmd[5]=pos&0x00FF;
1587 current_drive->n_bytes=1;
1588 }
1589 response_count=0;
1590 i=cmd_out();
1591 return (i);
1592}
1593
1594static int cc_SpinUp(void)
1595{
1596 int i;
1597
1598 msg(DBG_SPI,"SpinUp.\n");
1599 current_drive->in_SpinUp = 1;
1600 clr_cmdbuf();
1601 if (fam0LV_drive)
1602 {
1603 drvcmd[0]=CMD0_SPINUP;
1604 if (fam0L_drive)
1605 flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|
1606 f_ResponseStatus|f_obey_p_check|f_bit1;
1607 else
1608 flags_cmd_out=f_putcmd;
1609 }
1610 else if (fam1_drive)
1611 {
1612 drvcmd[0]=CMD1_SPINUP;
1613 flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
1614 }
1615 else if (fam2_drive)
1616 {
1617 drvcmd[0]=CMD2_TRAY_CTL;
1618 drvcmd[4]=0x01;
1619 flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
1620 }
1621 else if (famT_drive)
1622 {
1623 drvcmd[0]=CMDT_TRAY_CTL;
1624 drvcmd[4]=0x03;
1625 }
1626 response_count=0;
1627 i=cmd_out();
1628 current_drive->in_SpinUp = 0;
1629 return (i);
1630}
1631
1632static int cc_SpinDown(void)
1633{
1634 int i;
1635
1636 if (fam0_drive) return (0);
1637 clr_cmdbuf();
1638 response_count=0;
1639 if (fam1_drive)
1640 {
1641 drvcmd[0]=CMD1_SPINDOWN;
1642 flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
1643 }
1644 else if (fam2_drive)
1645 {
1646 drvcmd[0]=CMD2_TRAY_CTL;
1647 drvcmd[4]=0x02;
1648 flags_cmd_out=f_putcmd|f_ResponseStatus;
1649 }
1650 else if (famL_drive)
1651 {
1652 drvcmd[0]=CMDL_SPINDOWN;
1653 drvcmd[1]=1;
1654 flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
1655 }
1656 else if (famV_drive)
1657 {
1658 drvcmd[0]=CMDV_SPINDOWN;
1659 flags_cmd_out=f_putcmd;
1660 }
1661 else if (famT_drive)
1662 {
1663 drvcmd[0]=CMDT_TRAY_CTL;
1664 drvcmd[4]=0x02;
1665 }
1666 i=cmd_out();
1667 return (i);
1668}
1669
1670static int cc_get_mode_T(void)
1671{
1672 int i;
1673
1674 clr_cmdbuf();
1675 response_count=10;
1676 drvcmd[0]=CMDT_GETMODE;
1677 drvcmd[4]=response_count;
1678 i=cmd_out_T();
1679 return (i);
1680}
1681
1682static int cc_set_mode_T(void)
1683{
1684 int i;
1685
1686 clr_cmdbuf();
1687 response_count=1;
1688 drvcmd[0]=CMDT_SETMODE;
1689 drvcmd[1]=current_drive->speed_byte;
1690 drvcmd[2]=current_drive->frmsiz>>8;
1691 drvcmd[3]=current_drive->frmsiz&0x0FF;
1692 drvcmd[4]=current_drive->f_XA;
1693 drvcmd[5]=current_drive->type_byte;
1694 drvcmd[6]=current_drive->mode_xb_6;
1695 drvcmd[7]=current_drive->mode_yb_7|current_drive->volume_control;
1696 drvcmd[8]=current_drive->mode_xb_8;
1697 drvcmd[9]=current_drive->delay;
1698 i=cmd_out_T();
1699 return (i);
1700}
1701
1702static int cc_prep_mode_T(void)
1703{
1704 int i, j;
1705
1706 i=cc_get_mode_T();
1707 if (i<0) return (i);
1708 for (i=0;i<10;i++)
1709 sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
1710 msgbuf[i*3]=0;
1711 msg(DBG_TEA,"CMDT_GETMODE:%s\n", msgbuf);
1712 current_drive->speed_byte=0x02;
1713 current_drive->frmsiz=make16(infobuf[2],infobuf[3]);
1714 current_drive->f_XA=infobuf[4];
1715 if (current_drive->f_XA==0) current_drive->type_byte=0;
1716 else current_drive->type_byte=1;
1717 current_drive->mode_xb_6=infobuf[6];
1718 current_drive->mode_yb_7=1;
1719 current_drive->mode_xb_8=infobuf[8];
1720 current_drive->delay=0;
1721 j=cc_set_mode_T();
1722 i=cc_get_mode_T();
1723 for (i=0;i<10;i++)
1724 sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
1725 msgbuf[i*3]=0;
1726 msg(DBG_TEA,"CMDT_GETMODE:%s\n", msgbuf);
1727 return (j);
1728}
1729
1730static int cc_SetSpeed(u_char speed, u_char x1, u_char x2)
1731{
1732 int i;
1733
1734 if (fam0LV_drive) return (0);
1735 clr_cmdbuf();
1736 response_count=0;
1737 if (fam1_drive)
1738 {
1739 drvcmd[0]=CMD1_SETMODE;
1740 drvcmd[1]=0x03;
1741 drvcmd[2]=speed;
1742 drvcmd[3]=x1;
1743 drvcmd[4]=x2;
1744 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
1745 }
1746 else if (fam2_drive)
1747 {
1748 drvcmd[0]=CMD2_SETSPEED;
1749 if (speed&speed_auto)
1750 {
1751 drvcmd[2]=0xFF;
1752 drvcmd[3]=0xFF;
1753 }
1754 else
1755 {
1756 drvcmd[2]=0;
1757 drvcmd[3]=150;
1758 }
1759 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
1760 }
1761 else if (famT_drive)
1762 {
1763 return (0);
1764 }
1765 i=cmd_out();
1766 return (i);
1767}
1768
1769static int cc_SetVolume(void)
1770{
1771 int i;
1772 u_char channel0,channel1,volume0,volume1;
1773 u_char control0,value0,control1,value1;
1774
1775 current_drive->diskstate_flags &= ~volume_bit;
1776 clr_cmdbuf();
1777 channel0=current_drive->vol_chan0;
1778 volume0=current_drive->vol_ctrl0;
1779 channel1=control1=current_drive->vol_chan1;
1780 volume1=value1=current_drive->vol_ctrl1;
1781 control0=value0=0;
1782
1783 if (famV_drive) return (0);
1784
1785 if (((current_drive->drv_options&audio_mono)!=0)&&(current_drive->drv_type>=drv_211))
1786 {
1787 if ((volume0!=0)&&(volume1==0))
1788 {
1789 volume1=volume0;
1790 channel1=channel0;
1791 }
1792 else if ((volume0==0)&&(volume1!=0))
1793 {
1794 volume0=volume1;
1795 channel0=channel1;
1796 }
1797 }
1798 if (channel0>1)
1799 {
1800 channel0=0;
1801 volume0=0;
1802 }
1803 if (channel1>1)
1804 {
1805 channel1=1;
1806 volume1=0;
1807 }
1808
1809 if (fam1_drive)
1810 {
1811 control0=channel0+1;
1812 control1=channel1+1;
1813 value0=(volume0>volume1)?volume0:volume1;
1814 value1=value0;
1815 if (volume0==0) control0=0;
1816 if (volume1==0) control1=0;
1817 drvcmd[0]=CMD1_SETMODE;
1818 drvcmd[1]=0x05;
1819 drvcmd[3]=control0;
1820 drvcmd[4]=value0;
1821 drvcmd[5]=control1;
1822 drvcmd[6]=value1;
1823 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
1824 }
1825 else if (fam2_drive)
1826 {
1827 control0=channel0+1;
1828 control1=channel1+1;
1829 value0=(volume0>volume1)?volume0:volume1;
1830 value1=value0;
1831 if (volume0==0) control0=0;
1832 if (volume1==0) control1=0;
1833 drvcmd[0]=CMD2_SETMODE;
1834 drvcmd[1]=0x0E;
1835 drvcmd[3]=control0;
1836 drvcmd[4]=value0;
1837 drvcmd[5]=control1;
1838 drvcmd[6]=value1;
1839 flags_cmd_out=f_putcmd|f_ResponseStatus;
1840 }
1841 else if (famL_drive)
1842 {
1843 if ((volume0==0)||(channel0!=0)) control0 |= 0x80;
1844 if ((volume1==0)||(channel1!=1)) control0 |= 0x40;
1845 if (volume0|volume1) value0=0x80;
1846 drvcmd[0]=CMDL_SETMODE;
1847 drvcmd[1]=0x03;
1848 drvcmd[4]=control0;
1849 drvcmd[5]=value0;
1850 flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
1851 }
1852 else if (fam0_drive)
1853 {
1854 if (current_drive->drv_type>=drv_300)
1855 {
1856 control0=volume0&0xFC;
1857 value0=volume1&0xFC;
1858 if ((volume0!=0)&&(volume0<4)) control0 |= 0x04;
1859 if ((volume1!=0)&&(volume1<4)) value0 |= 0x04;
1860 if (channel0!=0) control0 |= 0x01;
1861 if (channel1==1) value0 |= 0x01;
1862 }
1863 else
1864 {
1865 value0=(volume0>volume1)?volume0:volume1;
1866 if (current_drive->drv_type<drv_211)
1867 {
1868 if (channel0!=0)
1869 {
1870 i=channel1;
1871 channel1=channel0;
1872 channel0=i;
1873 i=volume1;
1874 volume1=volume0;
1875 volume0=i;
1876 }
1877 if (channel0==channel1)
1878 {
1879 if (channel0==0)
1880 {
1881 channel1=1;
1882 volume1=0;
1883 volume0=value0;
1884 }
1885 else
1886 {
1887 channel0=0;
1888 volume0=0;
1889 volume1=value0;
1890 }
1891 }
1892 }
1893
1894 if ((volume0!=0)&&(volume1!=0))
1895 {
1896 if (volume0==0xFF) volume1=0xFF;
1897 else if (volume1==0xFF) volume0=0xFF;
1898 }
1899 else if (current_drive->drv_type<drv_201) volume0=volume1=value0;
1900
1901 if (current_drive->drv_type>=drv_201)
1902 {
1903 if (volume0==0) control0 |= 0x80;
1904 if (volume1==0) control0 |= 0x40;
1905 }
1906 if (current_drive->drv_type>=drv_211)
1907 {
1908 if (channel0!=0) control0 |= 0x20;
1909 if (channel1!=1) control0 |= 0x10;
1910 }
1911 }
1912 drvcmd[0]=CMD0_SETMODE;
1913 drvcmd[1]=0x83;
1914 drvcmd[4]=control0;
1915 drvcmd[5]=value0;
1916 flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
1917 }
1918 else if (famT_drive)
1919 {
1920 current_drive->volume_control=0;
1921 if (!volume0) current_drive->volume_control|=0x10;
1922 if (!volume1) current_drive->volume_control|=0x20;
1923 i=cc_prep_mode_T();
1924 if (i<0) return (i);
1925 }
1926 if (!famT_drive)
1927 {
1928 response_count=0;
1929 i=cmd_out();
1930 if (i<0) return (i);
1931 }
1932 current_drive->diskstate_flags |= volume_bit;
1933 return (0);
1934}
1935
1936static int GetStatus(void)
1937{
1938 int i;
1939
1940 if (famT_drive) return (0);
1941 flags_cmd_out=f_getsta|f_ResponseStatus|f_obey_p_check;
1942 response_count=0;
1943 cmd_type=0;
1944 i=cmd_out();
1945 return (i);
1946}
1947
1948static int cc_DriveReset(void)
1949{
1950 int i;
1951
1952 msg(DBG_RES,"cc_DriveReset called.\n");
1953 clr_cmdbuf();
1954 response_count=0;
1955 if (fam0LV_drive) OUT(CDo_reset,0x00);
1956 else if (fam1_drive)
1957 {
1958 drvcmd[0]=CMD1_RESET;
1959 flags_cmd_out=f_putcmd;
1960 i=cmd_out();
1961 }
1962 else if (fam2_drive)
1963 {
1964 drvcmd[0]=CMD2_RESET;
1965 flags_cmd_out=f_putcmd;
1966 i=cmd_out();
1967 OUT(CDo_reset,0x00);
1968 }
1969 else if (famT_drive)
1970 {
1971 OUT(CDo_sel_i_d,0);
1972 OUT(CDo_enable,current_drive->drv_sel);
1973 OUT(CDo_command,CMDT_RESET);
1974 for (i=1;i<10;i++) OUT(CDo_command,0);
1975 }
1976 if (fam0LV_drive) sbp_sleep(5*HZ);
1977 else sbp_sleep(1*HZ);
1978#if 1
1979 if (famT_drive)
1980 {
1981 msg(DBG_TEA, "================CMDT_RESET given=================.\n");
1982 sbp_sleep(3*HZ);
1983 }
1984#endif
1985 flush_status();
1986 i=GetStatus();
1987 if (i<0) return i;
1988 if (!famT_drive)
1989 if (current_drive->error_byte!=aud_12) return -501;
1990 return (0);
1991}
1992
1993
1994static int SetSpeed(void)
1995{
1996 int i, speed;
1997
1998 if (!(current_drive->drv_options&(speed_auto|speed_300|speed_150))) return (0);
1999 speed=speed_auto;
2000 if (!(current_drive->drv_options&speed_auto))
2001 {
2002 speed |= speed_300;
2003 if (!(current_drive->drv_options&speed_300)) speed=0;
2004 }
2005 i=cc_SetSpeed(speed,0,0);
2006 return (i);
2007}
2008
2009static void switch_drive(struct sbpcd_drive *);
2010
2011static int sbpcd_select_speed(struct cdrom_device_info *cdi, int speed)
2012{
2013 struct sbpcd_drive *p = cdi->handle;
2014 if (p != current_drive)
2015 switch_drive(p);
2016
2017 return cc_SetSpeed(speed == 2 ? speed_300 : speed_150, 0, 0);
2018}
2019
2020
2021static int DriveReset(void)
2022{
2023 int i;
2024
2025 i=cc_DriveReset();
2026 if (i<0) return (-22);
2027 do
2028 {
2029 i=GetStatus();
2030 if ((i<0)&&(i!=-ERR_DISKCHANGE)) {
2031 return (-2);
2032 }
2033 if (!st_caddy_in) break;
2034 sbp_sleep(1);
2035 }
2036 while (!st_diskok);
2037#if 000
2038 current_drive->CD_changed=1;
2039#endif
2040 if ((st_door_closed) && (st_caddy_in))
2041 {
2042 i=DiskInfo();
2043 if (i<0) return (-23);
2044 }
2045 return (0);
2046}
2047
2048static int sbpcd_reset(struct cdrom_device_info *cdi)
2049{
2050 struct sbpcd_drive *p = cdi->handle;
2051 if (p != current_drive)
2052 switch_drive(p);
2053 return DriveReset();
2054}
2055
2056
2057static int cc_PlayAudio(int pos_audio_start,int pos_audio_end)
2058{
2059 int i, j, n;
2060
2061 if (current_drive->audio_state==audio_playing) return (-EINVAL);
2062 clr_cmdbuf();
2063 response_count=0;
2064 if (famLV_drive)
2065 {
2066 drvcmd[0]=CMDL_PLAY;
2067 i=msf2blk(pos_audio_start);
2068 n=msf2blk(pos_audio_end)+1-i;
2069 drvcmd[1]=(i>>16)&0x00FF;
2070 drvcmd[2]=(i>>8)&0x00FF;
2071 drvcmd[3]=i&0x00FF;
2072 drvcmd[4]=(n>>16)&0x00FF;
2073 drvcmd[5]=(n>>8)&0x00FF;
2074 drvcmd[6]=n&0x00FF;
2075 if (famL_drive)
2076 flags_cmd_out = f_putcmd | f_respo2 | f_lopsta | f_getsta |
2077 f_ResponseStatus | f_obey_p_check | f_wait_if_busy;
2078 else
2079 flags_cmd_out = f_putcmd;
2080 }
2081 else
2082 {
2083 j=1;
2084 if (fam1_drive)
2085 {
2086 drvcmd[0]=CMD1_PLAY_MSF;
2087 flags_cmd_out = f_putcmd | f_respo2 | f_ResponseStatus |
2088 f_obey_p_check | f_wait_if_busy;
2089 }
2090 else if (fam2_drive)
2091 {
2092 drvcmd[0]=CMD2_PLAY_MSF;
2093 flags_cmd_out = f_putcmd | f_ResponseStatus | f_obey_p_check;
2094 }
2095 else if (famT_drive)
2096 {
2097 drvcmd[0]=CMDT_PLAY_MSF;
2098 j=3;
2099 response_count=1;
2100 }
2101 else if (fam0_drive)
2102 {
2103 drvcmd[0]=CMD0_PLAY_MSF;
2104 flags_cmd_out = f_putcmd | f_respo2 | f_lopsta | f_getsta |
2105 f_ResponseStatus | f_obey_p_check | f_wait_if_busy;
2106 }
2107 drvcmd[j]=(pos_audio_start>>16)&0x00FF;
2108 drvcmd[j+1]=(pos_audio_start>>8)&0x00FF;
2109 drvcmd[j+2]=pos_audio_start&0x00FF;
2110 drvcmd[j+3]=(pos_audio_end>>16)&0x00FF;
2111 drvcmd[j+4]=(pos_audio_end>>8)&0x00FF;
2112 drvcmd[j+5]=pos_audio_end&0x00FF;
2113 }
2114 i=cmd_out();
2115 return (i);
2116}
2117
2118static int cc_Pause_Resume(int pau_res)
2119{
2120 int i;
2121
2122 clr_cmdbuf();
2123 response_count=0;
2124 if (fam1_drive)
2125 {
2126 drvcmd[0]=CMD1_PAU_RES;
2127 if (pau_res!=1) drvcmd[1]=0x80;
2128 flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
2129 }
2130 else if (fam2_drive)
2131 {
2132 drvcmd[0]=CMD2_PAU_RES;
2133 if (pau_res!=1) drvcmd[2]=0x01;
2134 flags_cmd_out=f_putcmd|f_ResponseStatus;
2135 }
2136 else if (fam0LV_drive)
2137 {
2138 drvcmd[0]=CMD0_PAU_RES;
2139 if (pau_res!=1) drvcmd[1]=0x80;
2140 if (famL_drive)
2141 flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|f_ResponseStatus|
2142 f_obey_p_check|f_bit1;
2143 else if (famV_drive)
2144 flags_cmd_out=f_putcmd;
2145 else
2146 flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|f_ResponseStatus|
2147 f_obey_p_check;
2148 }
2149 else if (famT_drive)
2150 {
2151 if (pau_res==3) return (cc_PlayAudio(current_drive->pos_audio_start,current_drive->pos_audio_end));
2152 else if (pau_res==1) drvcmd[0]=CMDT_PAUSE;
2153 else return (-56);
2154 }
2155 i=cmd_out();
2156 return (i);
2157}
2158
2159static int cc_LockDoor(char lock)
2160{
2161 int i;
2162
2163 if (fam0_drive) return (0);
2164 msg(DBG_LCK,"cc_LockDoor: %d (drive %d)\n", lock, current_drive - D_S);
2165 msg(DBG_LCS,"p_door_locked bit %d before\n", st_door_locked);
2166 clr_cmdbuf();
2167 response_count=0;
2168 if (fam1_drive)
2169 {
2170 drvcmd[0]=CMD1_LOCK_CTL;
2171 if (lock==1) drvcmd[1]=0x01;
2172 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
2173 }
2174 else if (fam2_drive)
2175 {
2176 drvcmd[0]=CMD2_LOCK_CTL;
2177 if (lock==1) drvcmd[4]=0x01;
2178 flags_cmd_out=f_putcmd|f_ResponseStatus;
2179 }
2180 else if (famLV_drive)
2181 {
2182 drvcmd[0]=CMDL_LOCK_CTL;
2183 if (lock==1) drvcmd[1]=0x01;
2184 if (famL_drive)
2185 flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
2186 else
2187 flags_cmd_out=f_putcmd;
2188 }
2189 else if (famT_drive)
2190 {
2191 drvcmd[0]=CMDT_LOCK_CTL;
2192 if (lock==1) drvcmd[4]=0x01;
2193 }
2194 i=cmd_out();
2195 msg(DBG_LCS,"p_door_locked bit %d after\n", st_door_locked);
2196 return (i);
2197}
2198
2199
2200static int UnLockDoor(void)
2201{
2202 int i,j;
2203
2204 j=20;
2205 do
2206 {
2207 i=cc_LockDoor(0);
2208 --j;
2209 sbp_sleep(1);
2210 }
2211 while ((i<0)&&(j));
2212 if (i<0)
2213 {
2214 cc_DriveReset();
2215 return -84;
2216 }
2217 return (0);
2218}
2219
2220static int LockDoor(void)
2221{
2222 int i,j;
2223
2224 j=20;
2225 do
2226 {
2227 i=cc_LockDoor(1);
2228 --j;
2229 sbp_sleep(1);
2230 }
2231 while ((i<0)&&(j));
2232 if (j==0)
2233 {
2234 cc_DriveReset();
2235 j=20;
2236 do
2237 {
2238 i=cc_LockDoor(1);
2239 --j;
2240 sbp_sleep(1);
2241 }
2242 while ((i<0)&&(j));
2243 }
2244 return (i);
2245}
2246
2247static int sbpcd_lock_door(struct cdrom_device_info *cdi, int lock)
2248{
2249 return lock ? LockDoor() : UnLockDoor();
2250}
2251
2252
2253static int cc_CloseTray(void)
2254{
2255 int i;
2256
2257 if (fam0_drive) return (0);
2258 msg(DBG_LCK,"cc_CloseTray (drive %d)\n", current_drive - D_S);
2259 msg(DBG_LCS,"p_door_closed bit %d before\n", st_door_closed);
2260
2261 clr_cmdbuf();
2262 response_count=0;
2263 if (fam1_drive)
2264 {
2265 drvcmd[0]=CMD1_TRAY_CTL;
2266 flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
2267 }
2268 else if (fam2_drive)
2269 {
2270 drvcmd[0]=CMD2_TRAY_CTL;
2271 drvcmd[1]=0x01;
2272 drvcmd[4]=0x03;
2273 flags_cmd_out=f_putcmd|f_ResponseStatus;
2274 }
2275 else if (famLV_drive)
2276 {
2277 drvcmd[0]=CMDL_TRAY_CTL;
2278 if (famLV_drive)
2279 flags_cmd_out=f_putcmd|f_respo2|f_lopsta|f_getsta|
2280 f_ResponseStatus|f_obey_p_check|f_bit1;
2281 else
2282 flags_cmd_out=f_putcmd;
2283 }
2284 else if (famT_drive)
2285 {
2286 drvcmd[0]=CMDT_TRAY_CTL;
2287 drvcmd[4]=0x03;
2288 }
2289 i=cmd_out();
2290 msg(DBG_LCS,"p_door_closed bit %d after\n", st_door_closed);
2291
2292 i=cc_ReadError();
2293 flags_cmd_out |= f_respo2;
2294 cc_ReadStatus();
2295 i=ResponseStatus();
2296 if (famT_drive&&(i<0))
2297 {
2298 cc_DriveReset();
2299 i=ResponseStatus();
2300#if 0
2301 sbp_sleep(HZ);
2302#endif
2303 i=ResponseStatus();
2304 }
2305 if (i<0)
2306 {
2307 msg(DBG_INF,"sbpcd cc_CloseTray: ResponseStatus timed out (%d).\n",i);
2308 }
2309 if (!(famT_drive))
2310 {
2311 if (!st_spinning)
2312 {
2313 cc_SpinUp();
2314 if (st_check) i=cc_ReadError();
2315 flags_cmd_out |= f_respo2;
2316 cc_ReadStatus();
2317 i=ResponseStatus();
2318 } else {
2319 }
2320 }
2321 i=DiskInfo();
2322 return (i);
2323}
2324
2325static int sbpcd_tray_move(struct cdrom_device_info *cdi, int position)
2326{
2327 int retval=0;
2328 switch_drive(cdi->handle);
2329
2330 if(current_drive->CD_changed != 0xFF) {
2331 current_drive->CD_changed=0xFF;
2332 current_drive->diskstate_flags &= ~cd_size_bit;
2333 }
2334 if (position == 1) {
2335 cc_SpinDown();
2336 } else {
2337 retval=cc_CloseTray();
2338 }
2339 return retval;
2340}
2341
2342
2343static int cc_ReadSubQ(void)
2344{
2345 int i,j;
2346
2347 current_drive->diskstate_flags &= ~subq_bit;
2348 for (j=255;j>0;j--)
2349 {
2350 clr_cmdbuf();
2351 if (fam1_drive)
2352 {
2353 drvcmd[0]=CMD1_READSUBQ;
2354 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
2355 response_count=11;
2356 }
2357 else if (fam2_drive)
2358 {
2359 drvcmd[0]=CMD2_READSUBQ;
2360 drvcmd[1]=0x02;
2361 drvcmd[3]=0x01;
2362 flags_cmd_out=f_putcmd;
2363 response_count=10;
2364 }
2365 else if (fam0LV_drive)
2366 {
2367 drvcmd[0]=CMD0_READSUBQ;
2368 drvcmd[1]=0x02;
2369 if (famLV_drive)
2370 flags_cmd_out=f_putcmd;
2371 else
2372 flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
2373 response_count=13;
2374 }
2375 else if (famT_drive)
2376 {
2377 response_count=12;
2378 drvcmd[0]=CMDT_READSUBQ;
2379 drvcmd[1]=0x02;
2380 drvcmd[2]=0x40;
2381 drvcmd[3]=0x01;
2382 drvcmd[8]=response_count;
2383 }
2384 i=cmd_out();
2385 if (i<0) return (i);
2386 for (i=0;i<response_count;i++)
2387 {
2388 sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
2389 msgbuf[i*3]=0;
2390 msg(DBG_SQ1,"cc_ReadSubQ:%s\n", msgbuf);
2391 }
2392 if (famT_drive) break;
2393 if (infobuf[0]!=0) break;
2394 if ((!st_spinning) || (j==1))
2395 {
2396 current_drive->SubQ_ctl_adr=current_drive->SubQ_trk=current_drive->SubQ_pnt_idx=current_drive->SubQ_whatisthis=0;
2397 current_drive->SubQ_run_tot=current_drive->SubQ_run_trk=0;
2398 return (0);
2399 }
2400 }
2401 if (famT_drive) current_drive->SubQ_ctl_adr=infobuf[1];
2402 else current_drive->SubQ_ctl_adr=swap_nibbles(infobuf[1]);
2403 current_drive->SubQ_trk=byt2bcd(infobuf[2]);
2404 current_drive->SubQ_pnt_idx=byt2bcd(infobuf[3]);
2405 if (fam0LV_drive) i=5;
2406 else if (fam12_drive) i=4;
2407 else if (famT_drive) i=8;
2408 current_drive->SubQ_run_tot=make32(make16(0,infobuf[i]),make16(infobuf[i+1],infobuf[i+2]));
2409 i=7;
2410 if (fam0LV_drive) i=9;
2411 else if (fam12_drive) i=7;
2412 else if (famT_drive) i=4;
2413 current_drive->SubQ_run_trk=make32(make16(0,infobuf[i]),make16(infobuf[i+1],infobuf[i+2]));
2414 current_drive->SubQ_whatisthis=infobuf[i+3];
2415 current_drive->diskstate_flags |= subq_bit;
2416 return (0);
2417}
2418
2419static int cc_ModeSense(void)
2420{
2421 int i;
2422
2423 if (fam2_drive) return (0);
2424 if (famV_drive) return (0);
2425 current_drive->diskstate_flags &= ~frame_size_bit;
2426 clr_cmdbuf();
2427 if (fam1_drive)
2428 {
2429 response_count=5;
2430 drvcmd[0]=CMD1_GETMODE;
2431 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
2432 }
2433 else if (fam0L_drive)
2434 {
2435 response_count=2;
2436 drvcmd[0]=CMD0_GETMODE;
2437 if (famL_drive) flags_cmd_out=f_putcmd;
2438 else flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
2439 }
2440 else if (famT_drive)
2441 {
2442 response_count=10;
2443 drvcmd[0]=CMDT_GETMODE;
2444 drvcmd[4]=response_count;
2445 }
2446 i=cmd_out();
2447 if (i<0) return (i);
2448 i=0;
2449 current_drive->sense_byte=0;
2450 if (fam1_drive) current_drive->sense_byte=infobuf[i++];
2451 else if (famT_drive)
2452 {
2453 if (infobuf[4]==0x01) current_drive->xa_byte=0x20;
2454 else current_drive->xa_byte=0;
2455 i=2;
2456 }
2457 current_drive->frame_size=make16(infobuf[i],infobuf[i+1]);
2458 for (i=0;i<response_count;i++)
2459 sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
2460 msgbuf[i*3]=0;
2461 msg(DBG_XA1,"cc_ModeSense:%s\n", msgbuf);
2462
2463 current_drive->diskstate_flags |= frame_size_bit;
2464 return (0);
2465}
2466
2467
2468static int cc_ModeSelect(int framesize)
2469{
2470 int i;
2471
2472 if (fam2_drive) return (0);
2473 if (famV_drive) return (0);
2474 current_drive->diskstate_flags &= ~frame_size_bit;
2475 clr_cmdbuf();
2476 current_drive->frame_size=framesize;
2477 if (framesize==CD_FRAMESIZE_RAW) current_drive->sense_byte=0x82;
2478 else current_drive->sense_byte=0x00;
2479
2480 msg(DBG_XA1,"cc_ModeSelect: %02X %04X\n",
2481 current_drive->sense_byte, current_drive->frame_size);
2482
2483 if (fam1_drive)
2484 {
2485 drvcmd[0]=CMD1_SETMODE;
2486 drvcmd[1]=0x00;
2487 drvcmd[2]=current_drive->sense_byte;
2488 drvcmd[3]=(current_drive->frame_size>>8)&0xFF;
2489 drvcmd[4]=current_drive->frame_size&0xFF;
2490 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
2491 }
2492 else if (fam0L_drive)
2493 {
2494 drvcmd[0]=CMD0_SETMODE;
2495 drvcmd[1]=0x00;
2496 drvcmd[2]=(current_drive->frame_size>>8)&0xFF;
2497 drvcmd[3]=current_drive->frame_size&0xFF;
2498 drvcmd[4]=0x00;
2499 if(famL_drive)
2500 flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check;
2501 else
2502 flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
2503 }
2504 else if (famT_drive)
2505 {
2506 return (-1);
2507 }
2508 response_count=0;
2509 i=cmd_out();
2510 if (i<0) return (i);
2511 current_drive->diskstate_flags |= frame_size_bit;
2512 return (0);
2513}
2514
2515static int cc_GetVolume(void)
2516{
2517 int i;
2518 u_char switches;
2519 u_char chan0=0;
2520 u_char vol0=0;
2521 u_char chan1=1;
2522 u_char vol1=0;
2523
2524 if (famV_drive) return (0);
2525 current_drive->diskstate_flags &= ~volume_bit;
2526 clr_cmdbuf();
2527 if (fam1_drive)
2528 {
2529 drvcmd[0]=CMD1_GETMODE;
2530 drvcmd[1]=0x05;
2531 response_count=5;
2532 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
2533 }
2534 else if (fam2_drive)
2535 {
2536 drvcmd[0]=CMD2_GETMODE;
2537 drvcmd[1]=0x0E;
2538 response_count=5;
2539 flags_cmd_out=f_putcmd;
2540 }
2541 else if (fam0L_drive)
2542 {
2543 drvcmd[0]=CMD0_GETMODE;
2544 drvcmd[1]=0x03;
2545 response_count=2;
2546 if(famL_drive)
2547 flags_cmd_out=f_putcmd;
2548 else
2549 flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
2550 }
2551 else if (famT_drive)
2552 {
2553 i=cc_get_mode_T();
2554 if (i<0) return (i);
2555 }
2556 if (!famT_drive)
2557 {
2558 i=cmd_out();
2559 if (i<0) return (i);
2560 }
2561 if (fam1_drive)
2562 {
2563 chan0=infobuf[1]&0x0F;
2564 vol0=infobuf[2];
2565 chan1=infobuf[3]&0x0F;
2566 vol1=infobuf[4];
2567 if (chan0==0)
2568 {
2569 chan0=1;
2570 vol0=0;
2571 }
2572 if (chan1==0)
2573 {
2574 chan1=2;
2575 vol1=0;
2576 }
2577 chan0 >>= 1;
2578 chan1 >>= 1;
2579 }
2580 else if (fam2_drive)
2581 {
2582 chan0=infobuf[1];
2583 vol0=infobuf[2];
2584 chan1=infobuf[3];
2585 vol1=infobuf[4];
2586 }
2587 else if (famL_drive)
2588 {
2589 chan0=0;
2590 chan1=1;
2591 vol0=vol1=infobuf[1];
2592 switches=infobuf[0];
2593 if ((switches&0x80)!=0) chan0=1;
2594 if ((switches&0x40)!=0) chan1=0;
2595 }
2596 else if (fam0_drive)
2597 {
2598 chan0=0;
2599 chan1=1;
2600 vol0=vol1=infobuf[1];
2601 if (current_drive->drv_type>=drv_201)
2602 {
2603 if (current_drive->drv_type<drv_300)
2604 {
2605 switches=infobuf[0];
2606 if ((switches&0x80)!=0) vol0=0;
2607 if ((switches&0x40)!=0) vol1=0;
2608 if (current_drive->drv_type>=drv_211)
2609 {
2610 if ((switches&0x20)!=0) chan0=1;
2611 if ((switches&0x10)!=0) chan1=0;
2612 }
2613 }
2614 else
2615 {
2616 vol0=infobuf[0];
2617 if ((vol0&0x01)!=0) chan0=1;
2618 if ((vol1&0x01)==0) chan1=0;
2619 vol0 &= 0xFC;
2620 vol1 &= 0xFC;
2621 if (vol0!=0) vol0 += 3;
2622 if (vol1!=0) vol1 += 3;
2623 }
2624 }
2625 }
2626 else if (famT_drive)
2627 {
2628 current_drive->volume_control=infobuf[7];
2629 chan0=0;
2630 chan1=1;
2631 if (current_drive->volume_control&0x10) vol0=0;
2632 else vol0=0xff;
2633 if (current_drive->volume_control&0x20) vol1=0;
2634 else vol1=0xff;
2635 }
2636 current_drive->vol_chan0=chan0;
2637 current_drive->vol_ctrl0=vol0;
2638 current_drive->vol_chan1=chan1;
2639 current_drive->vol_ctrl1=vol1;
2640#if 000
2641 current_drive->vol_chan2=2;
2642 current_drive->vol_ctrl2=0xFF;
2643 current_drive->vol_chan3=3;
2644 current_drive->vol_ctrl3=0xFF;
2645#endif
2646 current_drive->diskstate_flags |= volume_bit;
2647 return (0);
2648}
2649
2650static int cc_ReadCapacity(void)
2651{
2652 int i, j;
2653
2654 if (fam2_drive) return (0);
2655 if (famLV_drive) return (0);
2656 if (famT_drive) return (0);
2657 current_drive->diskstate_flags &= ~cd_size_bit;
2658 for (j=3;j>0;j--)
2659 {
2660 clr_cmdbuf();
2661 if (fam1_drive)
2662 {
2663 drvcmd[0]=CMD1_CAPACITY;
2664 response_count=5;
2665 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
2666 }
2667#if 00
2668 else if (fam2_drive)
2669 {
2670 drvcmd[0]=CMD2_CAPACITY;
2671 response_count=8;
2672 flags_cmd_out=f_putcmd;
2673 }
2674#endif
2675 else if (fam0_drive)
2676 {
2677 drvcmd[0]=CMD0_CAPACITY;
2678 response_count=5;
2679 flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
2680 }
2681 i=cmd_out();
2682 if (i>=0) break;
2683 msg(DBG_000,"cc_ReadCapacity: cmd_out: err %d\n", i);
2684 cc_ReadError();
2685 }
2686 if (j==0) return (i);
2687 if (fam1_drive) current_drive->CDsize_frm=msf2blk(make32(make16(0,infobuf[0]),make16(infobuf[1],infobuf[2])))+CD_MSF_OFFSET;
2688 else if (fam0_drive) current_drive->CDsize_frm=make32(make16(0,infobuf[0]),make16(infobuf[1],infobuf[2]));
2689#if 00
2690 else if (fam2_drive) current_drive->CDsize_frm=make32(make16(infobuf[0],infobuf[1]),make16(infobuf[2],infobuf[3]));
2691#endif
2692 current_drive->diskstate_flags |= cd_size_bit;
2693 msg(DBG_000,"cc_ReadCapacity: %d frames.\n", current_drive->CDsize_frm);
2694 return (0);
2695}
2696
2697static int cc_ReadTocDescr(void)
2698{
2699 int i;
2700
2701 current_drive->diskstate_flags &= ~toc_bit;
2702 clr_cmdbuf();
2703 if (fam1_drive)
2704 {
2705 drvcmd[0]=CMD1_DISKINFO;
2706 response_count=6;
2707 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
2708 }
2709 else if (fam0LV_drive)
2710 {
2711 drvcmd[0]=CMD0_DISKINFO;
2712 response_count=6;
2713 if(famLV_drive)
2714 flags_cmd_out=f_putcmd;
2715 else
2716 flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
2717 }
2718 else if (fam2_drive)
2719 {
2720
2721 current_drive->f_multisession=0;
2722 drvcmd[0]=CMD2_DISKINFO;
2723 drvcmd[1]=0x02;
2724 drvcmd[2]=0xAB;
2725 drvcmd[3]=0xFF;
2726 response_count=8;
2727 flags_cmd_out=f_putcmd;
2728 }
2729 else if (famT_drive)
2730 {
2731 current_drive->f_multisession=0;
2732 response_count=12;
2733 drvcmd[0]=CMDT_DISKINFO;
2734 drvcmd[1]=0x02;
2735 drvcmd[6]=CDROM_LEADOUT;
2736 drvcmd[8]=response_count;
2737 drvcmd[9]=0x00;
2738 }
2739 i=cmd_out();
2740 if (i<0) return (i);
2741 if ((famT_drive)&&(i<response_count)) return (-100-i);
2742 if ((fam1_drive)||(fam2_drive)||(fam0LV_drive))
2743 current_drive->xa_byte=infobuf[0];
2744 if (fam2_drive)
2745 {
2746 current_drive->first_session=infobuf[1];
2747 current_drive->last_session=infobuf[2];
2748 current_drive->n_first_track=infobuf[3];
2749 current_drive->n_last_track=infobuf[4];
2750 if (current_drive->first_session!=current_drive->last_session)
2751 {
2752 current_drive->f_multisession=1;
2753 current_drive->lba_multi=msf2blk(make32(make16(0,infobuf[5]),make16(infobuf[6],infobuf[7])));
2754 }
2755#if 0
2756 if (current_drive->first_session!=current_drive->last_session)
2757 {
2758 if (current_drive->last_session<=20)
2759 zwanzig=current_drive->last_session+1;
2760 else zwanzig=20;
2761 for (count=current_drive->first_session;count<zwanzig;count++)
2762 {
2763 drvcmd[0]=CMD2_DISKINFO;
2764 drvcmd[1]=0x02;
2765 drvcmd[2]=0xAB;
2766 drvcmd[3]=count;
2767 response_count=8;
2768 flags_cmd_out=f_putcmd;
2769 i=cmd_out();
2770 if (i<0) return (i);
2771 current_drive->msf_multi_n[count]=make32(make16(0,infobuf[5]),make16(infobuf[6],infobuf[7]));
2772 }
2773 current_drive->diskstate_flags |= multisession_bit;
2774 }
2775#endif
2776 drvcmd[0]=CMD2_DISKINFO;
2777 drvcmd[1]=0x02;
2778 drvcmd[2]=0xAA;
2779 drvcmd[3]=0xFF;
2780 response_count=5;
2781 flags_cmd_out=f_putcmd;
2782 i=cmd_out();
2783 if (i<0) return (i);
2784 current_drive->size_msf=make32(make16(0,infobuf[2]),make16(infobuf[3],infobuf[4]));
2785 current_drive->size_blk=msf2blk(current_drive->size_msf);
2786 current_drive->CDsize_frm=current_drive->size_blk+1;
2787 }
2788 else if (famT_drive)
2789 {
2790 current_drive->size_msf=make32(make16(infobuf[8],infobuf[9]),make16(infobuf[10],infobuf[11]));
2791 current_drive->size_blk=msf2blk(current_drive->size_msf);
2792 current_drive->CDsize_frm=current_drive->size_blk+1;
2793 current_drive->n_first_track=infobuf[2];
2794 current_drive->n_last_track=infobuf[3];
2795 }
2796 else
2797 {
2798 current_drive->n_first_track=infobuf[1];
2799 current_drive->n_last_track=infobuf[2];
2800 current_drive->size_msf=make32(make16(0,infobuf[3]),make16(infobuf[4],infobuf[5]));
2801 current_drive->size_blk=msf2blk(current_drive->size_msf);
2802 if (famLV_drive) current_drive->CDsize_frm=current_drive->size_blk+1;
2803 }
2804 current_drive->diskstate_flags |= toc_bit;
2805 msg(DBG_TOC,"TocDesc: xa %02X firstt %02X lastt %02X size %08X firstses %02X lastsess %02X\n",
2806 current_drive->xa_byte,
2807 current_drive->n_first_track,
2808 current_drive->n_last_track,
2809 current_drive->size_msf,
2810 current_drive->first_session,
2811 current_drive->last_session);
2812 return (0);
2813}
2814
2815static int cc_ReadTocEntry(int num)
2816{
2817 int i;
2818
2819 clr_cmdbuf();
2820 if (fam1_drive)
2821 {
2822 drvcmd[0]=CMD1_READTOC;
2823 drvcmd[2]=num;
2824 response_count=8;
2825 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
2826 }
2827 else if (fam2_drive)
2828 {
2829
2830 drvcmd[0]=CMD2_DISKINFO;
2831 drvcmd[1]=0x02;
2832 drvcmd[2]=num;
2833 response_count=5;
2834 flags_cmd_out=f_putcmd;
2835 }
2836 else if (fam0LV_drive)
2837 {
2838 drvcmd[0]=CMD0_READTOC;
2839 drvcmd[1]=0x02;
2840 drvcmd[2]=num;
2841 response_count=8;
2842 if (famLV_drive)
2843 flags_cmd_out=f_putcmd;
2844 else
2845 flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
2846 }
2847 else if (famT_drive)
2848 {
2849 response_count=12;
2850 drvcmd[0]=CMDT_DISKINFO;
2851 drvcmd[1]=0x02;
2852 drvcmd[6]=num;
2853 drvcmd[8]=response_count;
2854 drvcmd[9]=0x00;
2855 }
2856 i=cmd_out();
2857 if (i<0) return (i);
2858 if ((famT_drive)&&(i<response_count)) return (-100-i);
2859 if ((fam1_drive)||(fam0LV_drive))
2860 {
2861 current_drive->TocEnt_nixbyte=infobuf[0];
2862 i=1;
2863 }
2864 else if (fam2_drive) i=0;
2865 else if (famT_drive) i=5;
2866 current_drive->TocEnt_ctl_adr=swap_nibbles(infobuf[i++]);
2867 if ((fam1_drive)||(fam0L_drive))
2868 {
2869 current_drive->TocEnt_number=infobuf[i++];
2870 current_drive->TocEnt_format=infobuf[i];
2871 }
2872 else
2873 {
2874 current_drive->TocEnt_number=num;
2875 current_drive->TocEnt_format=0;
2876 }
2877 if (fam1_drive) i=4;
2878 else if (fam0LV_drive) i=5;
2879 else if (fam2_drive) i=2;
2880 else if (famT_drive) i=9;
2881 current_drive->TocEnt_address=make32(make16(0,infobuf[i]),
2882 make16(infobuf[i+1],infobuf[i+2]));
2883 for (i=0;i<response_count;i++)
2884 sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
2885 msgbuf[i*3]=0;
2886 msg(DBG_ECS,"TocEntry:%s\n", msgbuf);
2887 msg(DBG_TOC,"TocEntry: %02X %02X %02X %02X %08X\n",
2888 current_drive->TocEnt_nixbyte, current_drive->TocEnt_ctl_adr,
2889 current_drive->TocEnt_number, current_drive->TocEnt_format,
2890 current_drive->TocEnt_address);
2891 return (0);
2892}
2893
2894static int cc_ReadPacket(void)
2895{
2896 int i;
2897
2898 clr_cmdbuf();
2899 drvcmd[0]=CMD0_PACKET;
2900 drvcmd[1]=response_count;
2901 if(famL_drive) flags_cmd_out=f_putcmd;
2902 else if (fam01_drive)
2903 flags_cmd_out=f_putcmd|f_getsta|f_ResponseStatus|f_obey_p_check;
2904 else if (fam2_drive) return (-1);
2905 else if (famT_drive)
2906 {
2907 return (-1);
2908 }
2909 i=cmd_out();
2910 return (i);
2911}
2912
2913static int convert_UPC(u_char *p)
2914{
2915 int i;
2916
2917 p++;
2918 if (fam0L_drive) p[13]=0;
2919 for (i=0;i<7;i++)
2920 {
2921 if (fam1_drive) current_drive->UPC_buf[i]=swap_nibbles(*p++);
2922 else if (fam0L_drive)
2923 {
2924 current_drive->UPC_buf[i]=((*p++)<<4)&0xFF;
2925 current_drive->UPC_buf[i] |= *p++;
2926 }
2927 else if (famT_drive)
2928 {
2929 return (-1);
2930 }
2931 else
2932 {
2933 return (-1);
2934 }
2935 }
2936 current_drive->UPC_buf[6] &= 0xF0;
2937 return (0);
2938}
2939
2940static int cc_ReadUPC(void)
2941{
2942 int i;
2943#if TEST_UPC
2944 int block, checksum;
2945#endif
2946
2947 if (fam2_drive) return (0);
2948 if (famT_drive) return (0);
2949 if (famV_drive) return (0);
2950#if 1
2951 if (fam0_drive) return (0);
2952#endif
2953
2954 current_drive->diskstate_flags &= ~upc_bit;
2955#if TEST_UPC
2956 for (block=CD_MSF_OFFSET+1;block<CD_MSF_OFFSET+200;block++)
2957 {
2958#endif
2959 clr_cmdbuf();
2960 if (fam1_drive)
2961 {
2962 drvcmd[0]=CMD1_READ_UPC;
2963#if TEST_UPC
2964 drvcmd[1]=(block>>16)&0xFF;
2965 drvcmd[2]=(block>>8)&0xFF;
2966 drvcmd[3]=block&0xFF;
2967#endif
2968 response_count=8;
2969 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
2970 }
2971 else if (fam0L_drive)
2972 {
2973 drvcmd[0]=CMD0_READ_UPC;
2974#if TEST_UPC
2975 drvcmd[2]=(block>>16)&0xFF;
2976 drvcmd[3]=(block>>8)&0xFF;
2977 drvcmd[4]=block&0xFF;
2978#endif
2979 response_count=0;
2980 flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
2981 }
2982 else if (fam2_drive)
2983 {
2984 return (-1);
2985 }
2986 else if (famT_drive)
2987 {
2988 return (-1);
2989 }
2990 i=cmd_out();
2991 if (i<0)
2992 {
2993 msg(DBG_000,"cc_ReadUPC cmd_out: err %d\n", i);
2994 return (i);
2995 }
2996 if (fam0L_drive)
2997 {
2998 response_count=16;
2999 if (famL_drive) flags_cmd_out=f_putcmd;
3000 i=cc_ReadPacket();
3001 if (i<0)
3002 {
3003 msg(DBG_000,"cc_ReadUPC ReadPacket: err %d\n", i);
3004 return (i);
3005 }
3006 }
3007#if TEST_UPC
3008 checksum=0;
3009#endif
3010 for (i=0;i<(fam1_drive?8:16);i++)
3011 {
3012#if TEST_UPC
3013 checksum |= infobuf[i];
3014#endif
3015 sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
3016 }
3017 msgbuf[i*3]=0;
3018 msg(DBG_UPC,"UPC info:%s\n", msgbuf);
3019#if TEST_UPC
3020 if ((checksum&0x7F)!=0) break;
3021 }
3022#endif
3023 current_drive->UPC_ctl_adr=0;
3024 if (fam1_drive) i=0;
3025 else i=2;
3026 if ((infobuf[i]&0x80)!=0)
3027 {
3028 convert_UPC(&infobuf[i]);
3029 current_drive->UPC_ctl_adr = (current_drive->TocEnt_ctl_adr & 0xF0) | 0x02;
3030 }
3031 for (i=0;i<7;i++)
3032 sprintf(&msgbuf[i*3], " %02X", current_drive->UPC_buf[i]);
3033 sprintf(&msgbuf[i*3], " (%02X)", current_drive->UPC_ctl_adr);
3034 msgbuf[i*3+5]=0;
3035 msg(DBG_UPC,"UPC code:%s\n", msgbuf);
3036 current_drive->diskstate_flags |= upc_bit;
3037 return (0);
3038}
3039
3040static int sbpcd_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn)
3041{
3042 int i;
3043 unsigned char *mcnp = mcn->medium_catalog_number;
3044 unsigned char *resp;
3045
3046 current_drive->diskstate_flags &= ~upc_bit;
3047 clr_cmdbuf();
3048 if (fam1_drive)
3049 {
3050 drvcmd[0]=CMD1_READ_UPC;
3051 response_count=8;
3052 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
3053 }
3054 else if (fam0L_drive)
3055 {
3056 drvcmd[0]=CMD0_READ_UPC;
3057 response_count=0;
3058 flags_cmd_out=f_putcmd|f_lopsta|f_getsta|f_ResponseStatus|f_obey_p_check|f_bit1;
3059 }
3060 else if (fam2_drive)
3061 {
3062 return (-1);
3063 }
3064 else if (famT_drive)
3065 {
3066 return (-1);
3067 }
3068 i=cmd_out();
3069 if (i<0)
3070 {
3071 msg(DBG_000,"cc_ReadUPC cmd_out: err %d\n", i);
3072 return (i);
3073 }
3074 if (fam0L_drive)
3075 {
3076 response_count=16;
3077 if (famL_drive) flags_cmd_out=f_putcmd;
3078 i=cc_ReadPacket();
3079 if (i<0)
3080 {
3081 msg(DBG_000,"cc_ReadUPC ReadPacket: err %d\n", i);
3082 return (i);
3083 }
3084 }
3085 current_drive->UPC_ctl_adr=0;
3086 if (fam1_drive) i=0;
3087 else i=2;
3088
3089 resp = infobuf + i;
3090 if (*resp++ == 0x80) {
3091
3092 *mcnp++ = (*resp >> 4) + '0';
3093 *mcnp++ = (*resp++ & 0x0f) + '0';
3094 *mcnp++ = (*resp >> 4) + '0';
3095 *mcnp++ = (*resp++ & 0x0f) + '0';
3096 *mcnp++ = (*resp >> 4) + '0';
3097 *mcnp++ = (*resp++ & 0x0f) + '0';
3098 *mcnp++ = (*resp >> 4) + '0';
3099 *mcnp++ = (*resp++ & 0x0f) + '0';
3100 *mcnp++ = (*resp >> 4) + '0';
3101 *mcnp++ = (*resp++ & 0x0f) + '0';
3102 *mcnp++ = (*resp >> 4) + '0';
3103 *mcnp++ = (*resp++ & 0x0f) + '0';
3104 *mcnp++ = (*resp >> 4) + '0';
3105 }
3106 *mcnp = '\0';
3107
3108 current_drive->diskstate_flags |= upc_bit;
3109 return (0);
3110}
3111
3112
3113static int cc_CheckMultiSession(void)
3114{
3115 int i;
3116
3117 if (fam2_drive) return (0);
3118 current_drive->f_multisession=0;
3119 current_drive->lba_multi=0;
3120 if (fam0_drive) return (0);
3121 clr_cmdbuf();
3122 if (fam1_drive)
3123 {
3124 drvcmd[0]=CMD1_MULTISESS;
3125 response_count=6;
3126 flags_cmd_out=f_putcmd|f_ResponseStatus|f_obey_p_check;
3127 i=cmd_out();
3128 if (i<0) return (i);
3129 if ((infobuf[0]&0x80)!=0)
3130 {
3131 current_drive->f_multisession=1;
3132 current_drive->lba_multi=msf2blk(make32(make16(0,infobuf[1]),
3133 make16(infobuf[2],infobuf[3])));
3134 }
3135 }
3136 else if (famLV_drive)
3137 {
3138 drvcmd[0]=CMDL_MULTISESS;
3139 drvcmd[1]=3;
3140 drvcmd[2]=1;
3141 response_count=8;
3142 flags_cmd_out=f_putcmd;
3143 i=cmd_out();
3144 if (i<0) return (i);
3145 current_drive->lba_multi=msf2blk(make32(make16(0,infobuf[5]),
3146 make16(infobuf[6],infobuf[7])));
3147 }
3148 else if (famT_drive)
3149 {
3150 response_count=12;
3151 drvcmd[0]=CMDT_DISKINFO;
3152 drvcmd[1]=0x02;
3153 drvcmd[6]=0;
3154 drvcmd[8]=response_count;
3155 drvcmd[9]=0x40;
3156 i=cmd_out();
3157 if (i<0) return (i);
3158 if (i<response_count) return (-100-i);
3159 current_drive->first_session=infobuf[2];
3160 current_drive->last_session=infobuf[3];
3161 current_drive->track_of_last_session=infobuf[6];
3162 if (current_drive->first_session!=current_drive->last_session)
3163 {
3164 current_drive->f_multisession=1;
3165 current_drive->lba_multi=msf2blk(make32(make16(0,infobuf[9]),make16(infobuf[10],infobuf[11])));
3166 }
3167 }
3168 for (i=0;i<response_count;i++)
3169 sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
3170 msgbuf[i*3]=0;
3171 msg(DBG_MUL,"MultiSession Info:%s (%d)\n", msgbuf, current_drive->lba_multi);
3172 if (current_drive->lba_multi>200)
3173 {
3174 current_drive->f_multisession=1;
3175 msg(DBG_MUL,"MultiSession base: %06X\n", current_drive->lba_multi);
3176 }
3177 return (0);
3178}
3179
3180#ifdef FUTURE
3181static int cc_SubChanInfo(int frame, int count, u_char *buffer)
3182
3183{
3184 int i;
3185
3186 if (fam0LV_drive) return (-ENOSYS);
3187 if (famT_drive)
3188 {
3189 return (-1);
3190 }
3191#if 0
3192 if (current_drive->audio_state!=audio_playing) return (-ENODATA);
3193#endif
3194 clr_cmdbuf();
3195 drvcmd[0]=CMD1_SUBCHANINF;
3196 drvcmd[1]=(frame>>16)&0xFF;
3197 drvcmd[2]=(frame>>8)&0xFF;
3198 drvcmd[3]=frame&0xFF;
3199 drvcmd[5]=(count>>8)&0xFF;
3200 drvcmd[6]=count&0xFF;
3201 flags_cmd_out=f_putcmd|f_respo2|f_ResponseStatus|f_obey_p_check;
3202 cmd_type=READ_SC;
3203 current_drive->frame_size=CD_FRAMESIZE_SUB;
3204 i=cmd_out();
3205 return (i);
3206}
3207#endif
3208
3209static void __init check_datarate(void)
3210{
3211 int i=0;
3212
3213 msg(DBG_IOX,"check_datarate entered.\n");
3214 datarate=0;
3215#if TEST_STI
3216 for (i=0;i<=1000;i++) printk(".");
3217#endif
3218
3219#if 1
3220 del_timer(&delay_timer);
3221#endif
3222 delay_timer.expires=jiffies+11*HZ/10;
3223 timed_out_delay=0;
3224 add_timer(&delay_timer);
3225#if 0
3226 msg(DBG_TIM,"delay timer started (11*HZ/10).\n");
3227#endif
3228 do
3229 {
3230 i=inb(CDi_status);
3231 datarate++;
3232#if 1
3233 if (datarate>0x6FFFFFFF) break;
3234#endif
3235 }
3236 while (!timed_out_delay);
3237 del_timer(&delay_timer);
3238#if 0
3239 msg(DBG_TIM,"datarate: %04X\n", datarate);
3240#endif
3241 if (datarate<65536) datarate=65536;
3242 maxtim16=datarate*16;
3243 maxtim04=datarate*4;
3244 maxtim02=datarate*2;
3245 maxtim_8=datarate/32;
3246#if LONG_TIMING
3247 maxtim_data=datarate/100;
3248#else
3249 maxtim_data=datarate/300;
3250#endif
3251#if 0
3252 msg(DBG_TIM,"maxtim_8 %d, maxtim_data %d.\n", maxtim_8, maxtim_data);
3253#endif
3254}
3255
3256#if 0
3257static int c2_ReadError(int fam)
3258{
3259 int i;
3260
3261 clr_cmdbuf();
3262 response_count=9;
3263 clr_respo_buf(9);
3264 if (fam==1)
3265 {
3266 drvcmd[0]=CMD0_READ_ERR;
3267 i=do_cmd(f_putcmd|f_lopsta|f_getsta|f_ResponseStatus);
3268 }
3269 else if (fam==2)
3270 {
3271 drvcmd[0]=CMD2_READ_ERR;
3272 i=do_cmd(f_putcmd);
3273 }
3274 else return (-1);
3275 return (i);
3276}
3277#endif
3278
3279static void __init ask_mail(void)
3280{
3281 int i;
3282
3283 msg(DBG_INF, "please mail the following lines to emoenke@gwdg.de\n");
3284 msg(DBG_INF, "(don't mail if you are not using the actual kernel):\n");
3285 msg(DBG_INF, "%s\n", VERSION);
3286 msg(DBG_INF, "address %03X, type %s, drive %s (ID %d)\n",
3287 CDo_command, type, current_drive->drive_model, current_drive->drv_id);
3288 for (i=0;i<12;i++)
3289 sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
3290 msgbuf[i*3]=0;
3291 msg(DBG_INF,"infobuf =%s\n", msgbuf);
3292 for (i=0;i<12;i++)
3293 sprintf(&msgbuf[i*3], " %c ", infobuf[i]);
3294 msgbuf[i*3]=0;
3295 msg(DBG_INF,"infobuf =%s\n", msgbuf);
3296}
3297
3298static int __init check_version(void)
3299{
3300 int i, j, l;
3301 int teac_possible=0;
3302
3303 msg(DBG_INI,"check_version: id=%d, d=%d.\n", current_drive->drv_id, current_drive - D_S);
3304 current_drive->drv_type=0;
3305
3306
3307
3308 clr_cmdbuf();
3309 drvcmd[0]=CMD0_READ_ERR;
3310 response_count=9;
3311 flags_cmd_out=f_putcmd;
3312 i=cmd_out();
3313 if (i<0) msg(DBG_INI,"CMD0_READ_ERR returns %d (ok anyway).\n",i);
3314
3315 clr_cmdbuf();
3316 for (i=0;i<12;i++) infobuf[i]=0;
3317 drvcmd[0]=CMD0_READ_VER;
3318 response_count=12;
3319 flags_cmd_out=f_putcmd;
3320 i=cmd_out();
3321 if (i<-1) msg(DBG_INI,"CMD0_READ_VER returns %d\n",i);
3322 if (i==-11) teac_possible++;
3323 j=0;
3324 for (i=0;i<12;i++) j+=infobuf[i];
3325 if (j)
3326 {
3327 for (i=0;i<12;i++)
3328 sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
3329 msgbuf[i*3]=0;
3330 msg(DBG_ECS,"infobuf =%s\n", msgbuf);
3331 for (i=0;i<12;i++)
3332 sprintf(&msgbuf[i*3], " %c ", infobuf[i]);
3333 msgbuf[i*3]=0;
3334 msg(DBG_ECS,"infobuf =%s\n", msgbuf);
3335 }
3336 for (i=0;i<4;i++) if (infobuf[i]!=family1[i]) break;
3337 if (i==4)
3338 {
3339 current_drive->drive_model[0]='C';
3340 current_drive->drive_model[1]='R';
3341 current_drive->drive_model[2]='-';
3342 current_drive->drive_model[3]='5';
3343 current_drive->drive_model[4]=infobuf[i++];
3344 current_drive->drive_model[5]=infobuf[i++];
3345 current_drive->drive_model[6]=0;
3346 current_drive->drv_type=drv_fam1;
3347 }
3348 if (!current_drive->drv_type)
3349 {
3350 for (i=0;i<8;i++) if (infobuf[i]!=family0[i]) break;
3351 if (i==8)
3352 {
3353 current_drive->drive_model[0]='C';
3354 current_drive->drive_model[1]='R';
3355 current_drive->drive_model[2]='-';
3356 current_drive->drive_model[3]='5';
3357 current_drive->drive_model[4]='2';
3358 current_drive->drive_model[5]='x';
3359 current_drive->drive_model[6]=0;
3360 current_drive->drv_type=drv_fam0;
3361 }
3362 }
3363 if (!current_drive->drv_type)
3364 {
3365 for (i=0;i<8;i++) if (infobuf[i]!=familyL[i]) break;
3366 if (i==8)
3367 {
3368 for (j=0;j<8;j++)
3369 current_drive->drive_model[j]=infobuf[j];
3370 current_drive->drive_model[8]=0;
3371 current_drive->drv_type=drv_famL;
3372 }
3373 }
3374 if (!current_drive->drv_type)
3375 {
3376 for (i=0;i<6;i++) if (infobuf[i]!=familyV[i]) break;
3377 if (i==6)
3378 {
3379 for (j=0;j<6;j++)
3380 current_drive->drive_model[j]=infobuf[j];
3381 current_drive->drive_model[6]=0;
3382 current_drive->drv_type=drv_famV;
3383 i+=2;
3384 }
3385 }
3386 if (!current_drive->drv_type)
3387 {
3388
3389 clr_cmdbuf();
3390 drvcmd[0]=CMD2_READ_ERR;
3391 response_count=9;
3392 flags_cmd_out=f_putcmd;
3393 i=cmd_out();
3394 if (i<0) msg(DBG_INI,"CMD2_READERR returns %d (ok anyway).\n",i);
3395 if (i<0) msg(DBG_000,"CMD2_READERR returns %d (ok anyway).\n",i);
3396
3397 clr_cmdbuf();
3398 for (i=0;i<12;i++) infobuf[i]=0;
3399 if (sbpro_type==1) OUT(CDo_sel_i_d,0);
3400#if 0
3401 OUT(CDo_reset,0);
3402 sbp_sleep(6*HZ);
3403 OUT(CDo_enable,current_drive->drv_sel);
3404#endif
3405 drvcmd[0]=CMD2_READ_VER;
3406 response_count=12;
3407 flags_cmd_out=f_putcmd;
3408 i=cmd_out();
3409 if (i<0) msg(DBG_INI,"CMD2_READ_VER returns %d\n",i);
3410 if (i==-7) teac_possible++;
3411 j=0;
3412 for (i=0;i<12;i++) j+=infobuf[i];
3413 if (j)
3414 {
3415 for (i=0;i<12;i++)
3416 sprintf(&msgbuf[i*3], " %02X", infobuf[i]);
3417 msgbuf[i*3]=0;
3418 msg(DBG_IDX,"infobuf =%s\n", msgbuf);
3419 for (i=0;i<12;i++)
3420 sprintf(&msgbuf[i*3], " %c ", infobuf[i]);
3421 msgbuf[i*3]=0;
3422 msg(DBG_IDX,"infobuf =%s\n", msgbuf);
3423 }
3424 if (i>=0)
3425 {
3426 for (i=0;i<5;i++) if (infobuf[i]!=family2[i]) break;
3427 if (i==5)
3428 {
3429 current_drive->drive_model[0]='C';
3430 current_drive->drive_model[1]='D';
3431 current_drive->drive_model[2]='2';
3432 current_drive->drive_model[3]='0';
3433 current_drive->drive_model[4]='0';
3434 current_drive->drive_model[5]=infobuf[i++];
3435 current_drive->drive_model[6]=infobuf[i++];
3436 current_drive->drive_model[7]=0;
3437 current_drive->drv_type=drv_fam2;
3438 }
3439 }
3440 }
3441 if (!current_drive->drv_type)
3442 {
3443
3444 msg(DBG_TEA,"teac_possible: %d\n",teac_possible);
3445 for (j=1;j<=((current_drive->drv_id==0)?3:1);j++)
3446 {
3447 for (l=1;l<=((current_drive->drv_id==0)?10:1);l++)
3448 {
3449 msg(DBG_TEA,"TEAC reset #%d-%d.\n", j, l);
3450 if (sbpro_type==1) OUT(CDo_reset,0);
3451 else
3452 {
3453 OUT(CDo_enable,current_drive->drv_sel);
3454 OUT(CDo_sel_i_d,0);
3455 OUT(CDo_command,CMDT_RESET);
3456 for (i=0;i<9;i++) OUT(CDo_command,0);
3457 }
3458 sbp_sleep(5*HZ/10);
3459 OUT(CDo_enable,current_drive->drv_sel);
3460 OUT(CDo_sel_i_d,0);
3461 i=inb(CDi_status);
3462 msg(DBG_TEA,"TEAC CDi_status: %02X.\n",i);
3463#if 0
3464 if (i&s_not_result_ready) continue;
3465#endif
3466 i=inb(CDi_info);
3467 msg(DBG_TEA,"TEAC CDi_info: %02X.\n",i);
3468 if (i==0x55) break;
3469 }
3470 if (i==0x55) break;
3471 }
3472 if (i==0x55)
3473 {
3474 msg(DBG_TEA,"TEAC drive found.\n");
3475 clr_cmdbuf();
3476 flags_cmd_out=f_putcmd;
3477 response_count=12;
3478 drvcmd[0]=CMDT_READ_VER;
3479 drvcmd[4]=response_count;
3480 for (i=0;i<12;i++) infobuf[i]=0;
3481 i=cmd_out_T();
3482 if (i!=0) msg(DBG_TEA,"cmd_out_T(CMDT_READ_VER) returns %d.\n",i);
3483 for (i=1;i<6;i++) if (infobuf[i]!=familyT[i-1]) break;
3484 if (i==6)
3485 {
3486 current_drive->drive_model[0]='C';
3487 current_drive->drive_model[1]='D';
3488 current_drive->drive_model[2]='-';
3489 current_drive->drive_model[3]='5';
3490 current_drive->drive_model[4]='5';
3491 current_drive->drive_model[5]=0;
3492 current_drive->drv_type=drv_famT;
3493 }
3494 }
3495 }
3496 if (!current_drive->drv_type)
3497 {
3498 msg(DBG_TEA,"no drive found at address %03X under ID %d.\n",CDo_command,current_drive->drv_id);
3499 return (-522);
3500 }
3501 for (j=0;j<4;j++) current_drive->firmware_version[j]=infobuf[i+j];
3502 if (famL_drive)
3503 {
3504 u_char lcs_firm_e1[]="A E1";
3505 u_char lcs_firm_f4[]="A4F4";
3506
3507 for (j=0;j<4;j++)
3508 if (current_drive->firmware_version[j]!=lcs_firm_e1[j]) break;
3509 if (j==4) current_drive->drv_type=drv_e1;
3510
3511 for (j=0;j<4;j++)
3512 if (current_drive->firmware_version[j]!=lcs_firm_f4[j]) break;
3513 if (j==4) current_drive->drv_type=drv_f4;
3514
3515 if (current_drive->drv_type==drv_famL) ask_mail();
3516 }
3517 else if (famT_drive)
3518 {
3519 j=infobuf[4];
3520 if (j=='5')
3521 {
3522 current_drive->firmware_version[0]=infobuf[7];
3523 current_drive->firmware_version[1]=infobuf[8];
3524 current_drive->firmware_version[2]=infobuf[10];
3525 current_drive->firmware_version[3]=infobuf[11];
3526 }
3527 else
3528 {
3529 if (j!=0x15) ask_mail();
3530 current_drive->firmware_version[0]='0';
3531 current_drive->firmware_version[1]='.';
3532 current_drive->firmware_version[2]='0'+(j>>4);
3533 current_drive->firmware_version[3]='0'+(j&0x0f);
3534 }
3535 }
3536 else
3537 {
3538 j = (current_drive->firmware_version[0] & 0x0F) * 100 +
3539 (current_drive->firmware_version[2] & 0x0F) *10 +
3540 (current_drive->firmware_version[3] & 0x0F);
3541 if (fam0_drive)
3542 {
3543 if (j<200) current_drive->drv_type=drv_199;
3544 else if (j<201) current_drive->drv_type=drv_200;
3545 else if (j<210) current_drive->drv_type=drv_201;
3546 else if (j<211) current_drive->drv_type=drv_210;
3547 else if (j<300) current_drive->drv_type=drv_211;
3548 else if (j>=300) current_drive->drv_type=drv_300;
3549 }
3550 else if (fam1_drive)
3551 {
3552 if (j<100) current_drive->drv_type=drv_099;
3553 else
3554 {
3555 current_drive->drv_type=drv_100;
3556 if ((j!=500)&&(j!=102)) ask_mail();
3557 }
3558 }
3559 else if (fam2_drive)
3560 {
3561 if (current_drive->drive_model[5]=='F')
3562 {
3563 if ((j!=1)&&(j!=35)&&(j!=200)&&(j!=210))
3564 ask_mail();
3565 }
3566 else
3567 {
3568 msg(DBG_INF,"this CD200 drive is not fully supported yet - only audio will work.\n");
3569 if ((j!=101)&&(j!=35))
3570 ask_mail();
3571 }
3572 }
3573 else if (famV_drive)
3574 {
3575 if ((j==100)||(j==150)) current_drive->drv_type=drv_at;
3576 ask_mail();
3577 }
3578 }
3579 msg(DBG_LCS,"drive type %02X\n",current_drive->drv_type);
3580 msg(DBG_INI,"check_version done.\n");
3581 return (0);
3582}
3583
3584static void switch_drive(struct sbpcd_drive *p)
3585{
3586 current_drive = p;
3587 OUT(CDo_enable,current_drive->drv_sel);
3588 msg(DBG_DID,"drive %d (ID=%d) activated.\n",
3589 current_drive - D_S, current_drive->drv_id);
3590 return;
3591}
3592
3593#ifdef PATH_CHECK
3594
3595
3596
3597static int __init check_card(int port)
3598{
3599#undef N_RESPO
3600#define N_RESPO 20
3601 int i, j, k;
3602 u_char response[N_RESPO];
3603 u_char save_port0;
3604 u_char save_port3;
3605
3606 msg(DBG_INI,"check_card entered.\n");
3607 save_port0=inb(port+0);
3608 save_port3=inb(port+3);
3609
3610 for (j=0;j<NR_SBPCD;j++)
3611 {
3612 OUT(port+3,j) ;
3613 OUT(port+0,CMD0_PATH_CHECK);
3614 for (i=10;i>0;i--) OUT(port+0,0);
3615 for (k=0;k<N_RESPO;k++) response[k]=0;
3616 for (k=0;k<N_RESPO;k++)
3617 {
3618 for (i=10000;i>0;i--)
3619 {
3620 if (inb(port+1)&s_not_result_ready) continue;
3621 response[k]=inb(port+0);
3622 break;
3623 }
3624 }
3625 for (i=0;i<N_RESPO;i++)
3626 sprintf(&msgbuf[i*3], " %02X", response[i]);
3627 msgbuf[i*3]=0;
3628 msg(DBG_TEA,"path check 00 (%d): %s\n", j, msgbuf);
3629 OUT(port+0,CMD0_PATH_CHECK);
3630 for (i=10;i>0;i--) OUT(port+0,0);
3631 for (k=0;k<N_RESPO;k++) response[k]=0xFF;
3632 for (k=0;k<N_RESPO;k++)
3633 {
3634 for (i=10000;i>0;i--)
3635 {
3636 if (inb(port+1)&s_not_result_ready) continue;
3637 response[k]=inb(port+0);
3638 break;
3639 }
3640 }
3641 for (i=0;i<N_RESPO;i++)
3642 sprintf(&msgbuf[i*3], " %02X", response[i]);
3643 msgbuf[i*3]=0;
3644 msg(DBG_TEA,"path check 00 (%d): %s\n", j, msgbuf);
3645
3646 if (response[0]==0xAA)
3647 if (response[1]==0x55)
3648 return (0);
3649 }
3650 for (j=0;j<NR_SBPCD;j++)
3651 {
3652 OUT(port+3,j) ;
3653 OUT(port+0,CMD2_READ_VER);
3654 for (i=10;i>0;i--) OUT(port+0,0);
3655 for (k=0;k<N_RESPO;k++) response[k]=0;
3656 for (k=0;k<N_RESPO;k++)
3657 {
3658 for (i=1000000;i>0;i--)
3659 {
3660 if (inb(port+1)&s_not_result_ready) continue;
3661 response[k]=inb(port+0);
3662 break;
3663 }
3664 }
3665 for (i=0;i<N_RESPO;i++)
3666 sprintf(&msgbuf[i*3], " %02X", response[i]);
3667 msgbuf[i*3]=0;
3668 msg(DBG_TEA,"path check 12 (%d): %s\n", j, msgbuf);
3669
3670 OUT(port+0,CMD2_READ_VER);
3671 for (i=10;i>0;i--) OUT(port+0,0);
3672 for (k=0;k<N_RESPO;k++) response[k]=0xFF;
3673 for (k=0;k<N_RESPO;k++)
3674 {
3675 for (i=1000000;i>0;i--)
3676 {
3677 if (inb(port+1)&s_not_result_ready) continue;
3678 response[k]=inb(port+0);
3679 break;
3680 }
3681 }
3682 for (i=0;i<N_RESPO;i++)
3683 sprintf(&msgbuf[i*3], " %02X", response[i]);
3684 msgbuf[i*3]=0;
3685 msg(DBG_TEA,"path check 12 (%d): %s\n", j, msgbuf);
3686
3687 if (response[0]==0xAA)
3688 if (response[1]==0x55)
3689 return (0);
3690 }
3691 OUT(port+0,save_port0);
3692 OUT(port+3,save_port3);
3693 return (0);
3694}
3695#endif
3696
3697
3698
3699
3700
3701static int __init check_drives(void)
3702{
3703 int i, j;
3704
3705 msg(DBG_INI,"check_drives entered.\n");
3706 ndrives=0;
3707 for (j=0;j<max_drives;j++)
3708 {
3709 struct sbpcd_drive *p = D_S + ndrives;
3710 p->drv_id=j;
3711 if (sbpro_type==1) p->drv_sel=(j&0x01)<<1|(j&0x02)>>1;
3712 else p->drv_sel=j;
3713 switch_drive(p);
3714 msg(DBG_INI,"check_drives: drive %d (ID=%d) activated.\n",ndrives,j);
3715 msg(DBG_000,"check_drives: drive %d (ID=%d) activated.\n",ndrives,j);
3716 i=check_version();
3717 if (i<0) msg(DBG_INI,"check_version returns %d.\n",i);
3718 else
3719 {
3720 current_drive->drv_options=drv_pattern[j];
3721 if (fam0L_drive) current_drive->drv_options&=~(speed_auto|speed_300|speed_150);
3722 msg(DBG_INF, "Drive %d (ID=%d): %.9s (%.4s) at 0x%03X (type %d)\n",
3723 current_drive - D_S,
3724 current_drive->drv_id,
3725 current_drive->drive_model,
3726 current_drive->firmware_version,
3727 CDo_command,
3728 sbpro_type);
3729 ndrives++;
3730 }
3731 }
3732 for (j=ndrives;j<NR_SBPCD;j++) D_S[j].drv_id=-1;
3733 if (ndrives==0) return (-1);
3734 return (0);
3735}
3736
3737#ifdef FUTURE
3738
3739
3740
3741static int obey_audio_state(u_char audio_state, u_char func,u_char subfunc)
3742{
3743 switch (audio_state)
3744 {
3745 case aud_11:
3746 case audx11:
3747 switch (func)
3748 {
3749 case cmd_07:
3750 case cmd_0d:
3751 case cmd_0e:
3752 case cmd_0c:
3753 return (1);
3754 case cmd_03:
3755 switch (subfunc)
3756
3757 {
3758 case cxi_00:
3759 case cxi_06:
3760 case cxi_09:
3761 return (1);
3762 default:
3763 return (ERROR15);
3764 }
3765 return (1);
3766 default:
3767 return (ERROR15);
3768 }
3769 return (1);
3770 case aud_12:
3771 case audx12:
3772 return (1);
3773 default:
3774 return (2);
3775 }
3776}
3777
3778
3779
3780
3781
3782
3783static int check_allowed1(u_char func1, u_char func2)
3784{
3785#if 000
3786 if (func1==ioctl_o) return (0);
3787 if (func1==read_long) return (-1);
3788 if (func1==read_long_prefetch) return (-1);
3789 if (func1==seek) return (-1);
3790 if (func1==audio_play) return (-1);
3791 if (func1==audio_pause) return (-1);
3792 if (func1==audio_resume) return (-1);
3793 if (func1!=ioctl_i) return (0);
3794 if (func2==tell_SubQ_run_tot) return (-1);
3795 if (func2==tell_cdsize) return (-1);
3796 if (func2==tell_TocDescrip) return (-1);
3797 if (func2==tell_TocEntry) return (-1);
3798 if (func2==tell_subQ_info) return (-1);
3799 if (fam1_drive) if (func2==tell_SubChanInfo) return (-1);
3800 if (func2==tell_UPC) return (-1);
3801#else
3802 return (0);
3803#endif
3804}
3805
3806static int check_allowed2(u_char func1, u_char func2)
3807{
3808#if 000
3809 if (func1==read_long) return (-1);
3810 if (func1==read_long_prefetch) return (-1);
3811 if (func1==seek) return (-1);
3812 if (func1==audio_play) return (-1);
3813 if (func1!=ioctl_o) return (0);
3814 if (fam1_drive)
3815 {
3816 if (func2==EjectDisk) return (-1);
3817 if (func2==CloseTray) return (-1);
3818 }
3819#else
3820 return (0);
3821#endif
3822}
3823
3824static int check_allowed3(u_char func1, u_char func2)
3825{
3826#if 000
3827 if (func1==ioctl_i)
3828 {
3829 if (func2==tell_address) return (0);
3830 if (func2==tell_capabiliti) return (0);
3831 if (func2==tell_CD_changed) return (0);
3832 if (fam0L_drive) if (func2==tell_SubChanInfo) return (0);
3833 return (-1);
3834 }
3835 if (func1==ioctl_o)
3836 {
3837 if (func2==DriveReset) return (0);
3838 if (fam0L_drive)
3839 {
3840 if (func2==EjectDisk) return (0);
3841 if (func2==LockDoor) return (0);
3842 if (func2==CloseTray) return (0);
3843 }
3844 return (-1);
3845 }
3846 if (func1==flush_input) return (-1);
3847 if (func1==read_long) return (-1);
3848 if (func1==read_long_prefetch) return (-1);
3849 if (func1==seek) return (-1);
3850 if (func1==audio_play) return (-1);
3851 if (func1==audio_pause) return (-1);
3852 if (func1==audio_resume) return (-1);
3853#else
3854 return (0);
3855#endif
3856}
3857
3858static int seek_pos_audio_end(void)
3859{
3860 int i;
3861
3862 i=msf2blk(current_drive->pos_audio_end)-1;
3863 if (i<0) return (-1);
3864 i=cc_Seek(i,0);
3865 return (i);
3866}
3867#endif
3868
3869static int ReadToC(void)
3870{
3871 int i, j;
3872 current_drive->diskstate_flags &= ~toc_bit;
3873 current_drive->ored_ctl_adr=0;
3874
3875 if ((current_drive->n_first_track == 2 && current_drive->n_last_track == 2) ||
3876 current_drive->xa_byte == 0x10)
3877 {
3878 current_drive->TocBuffer[1].nixbyte=0;
3879 current_drive->TocBuffer[1].ctl_adr=0x40;
3880 current_drive->TocBuffer[1].number=1;
3881 current_drive->TocBuffer[1].format=0;
3882 current_drive->TocBuffer[1].address=blk2msf(0);
3883 current_drive->ored_ctl_adr |= 0x40;
3884 current_drive->n_first_track = 1;
3885 current_drive->n_last_track = 1;
3886 current_drive->xa_byte = 0x10;
3887 j = 2;
3888 } else
3889 for (j=current_drive->n_first_track;j<=current_drive->n_last_track;j++)
3890 {
3891 i=cc_ReadTocEntry(j);
3892 if (i<0)
3893 {
3894 msg(DBG_INF,"cc_ReadTocEntry(%d) returns %d.\n",j,i);
3895 return (i);
3896 }
3897 current_drive->TocBuffer[j].nixbyte=current_drive->TocEnt_nixbyte;
3898 current_drive->TocBuffer[j].ctl_adr=current_drive->TocEnt_ctl_adr;
3899 current_drive->TocBuffer[j].number=current_drive->TocEnt_number;
3900 current_drive->TocBuffer[j].format=current_drive->TocEnt_format;
3901 current_drive->TocBuffer[j].address=current_drive->TocEnt_address;
3902 current_drive->ored_ctl_adr |= current_drive->TocEnt_ctl_adr;
3903 }
3904
3905 current_drive->TocBuffer[j].nixbyte=0;
3906 current_drive->TocBuffer[j].ctl_adr=0;
3907 current_drive->TocBuffer[j].number=CDROM_LEADOUT;
3908 current_drive->TocBuffer[j].format=0;
3909 current_drive->TocBuffer[j].address=current_drive->size_msf;
3910
3911 current_drive->diskstate_flags |= toc_bit;
3912 return (0);
3913}
3914
3915static int DiskInfo(void)
3916{
3917 int i, j;
3918
3919 current_drive->mode=READ_M1;
3920
3921#undef LOOP_COUNT
3922#define LOOP_COUNT 10
3923
3924 msg(DBG_000,"DiskInfo entered.\n");
3925 for (j=1;j<LOOP_COUNT;j++)
3926 {
3927#if 0
3928 i=SetSpeed();
3929 if (i<0)
3930 {
3931 msg(DBG_INF,"DiskInfo: SetSpeed returns %d\n", i);
3932 continue;
3933 }
3934 i=cc_ModeSense();
3935 if (i<0)
3936 {
3937 msg(DBG_INF,"DiskInfo: cc_ModeSense returns %d\n", i);
3938 continue;
3939 }
3940#endif
3941 i=cc_ReadCapacity();
3942 if (i>=0) break;
3943 msg(DBG_INF,"DiskInfo: ReadCapacity #%d returns %d\n", j, i);
3944#if 0
3945 i=cc_DriveReset();
3946#endif
3947 if (!fam0_drive && j == 2) break;
3948 }
3949 if (j==LOOP_COUNT) return (-33);
3950
3951 i=cc_ReadTocDescr();
3952 if (i<0)
3953 {
3954 msg(DBG_INF,"DiskInfo: ReadTocDescr returns %d\n", i);
3955 return (i);
3956 }
3957 i=ReadToC();
3958 if (i<0)
3959 {
3960 msg(DBG_INF,"DiskInfo: ReadToC returns %d\n", i);
3961 return (i);
3962 }
3963 i=cc_CheckMultiSession();
3964 if (i<0)
3965 {
3966 msg(DBG_INF,"DiskInfo: cc_CheckMultiSession returns %d\n", i);
3967 return (i);
3968 }
3969 if (current_drive->f_multisession) current_drive->sbp_bufsiz=1;
3970 else current_drive->sbp_bufsiz=buffers;
3971 i=cc_ReadTocEntry(current_drive->n_first_track);
3972 if (i<0)
3973 {
3974 msg(DBG_INF,"DiskInfo: cc_ReadTocEntry(1) returns %d\n", i);
3975 return (i);
3976 }
3977 i=cc_ReadUPC();
3978 if (i<0) msg(DBG_INF,"DiskInfo: cc_ReadUPC returns %d\n", i);
3979 if ((fam0L_drive) && (current_drive->xa_byte==0x20 || current_drive->xa_byte == 0x10))
3980 {
3981
3982 cc_ModeSelect(CD_FRAMESIZE_RAW1);
3983 cc_ModeSense();
3984 }
3985 if (famT_drive) cc_prep_mode_T();
3986 msg(DBG_000,"DiskInfo done.\n");
3987 return (0);
3988}
3989
3990static int sbpcd_drive_status(struct cdrom_device_info *cdi, int slot_nr)
3991{
3992 struct sbpcd_drive *p = cdi->handle;
3993 int st;
3994
3995 if (CDSL_CURRENT != slot_nr) {
3996
3997 return -EINVAL;
3998 }
3999
4000 cc_ReadStatus();
4001 st=ResponseStatus();
4002 if (st<0)
4003 {
4004 msg(DBG_INF,"sbpcd_drive_status: timeout.\n");
4005 return (0);
4006 }
4007 msg(DBG_000,"Drive Status: door_locked =%d.\n", st_door_locked);
4008 msg(DBG_000,"Drive Status: door_closed =%d.\n", st_door_closed);
4009 msg(DBG_000,"Drive Status: caddy_in =%d.\n", st_caddy_in);
4010 msg(DBG_000,"Drive Status: disk_ok =%d.\n", st_diskok);
4011 msg(DBG_000,"Drive Status: spinning =%d.\n", st_spinning);
4012 msg(DBG_000,"Drive Status: busy =%d.\n", st_busy);
4013
4014#if 0
4015 if (!(p->status_bits & p_door_closed)) return CDS_TRAY_OPEN;
4016 if (p->status_bits & p_disk_ok) return CDS_DISC_OK;
4017 if (p->status_bits & p_disk_in) return CDS_DRIVE_NOT_READY;
4018
4019 return CDS_NO_DISC;
4020#else
4021 if (p->status_bits & p_spinning) return CDS_DISC_OK;
4022
4023 return CDS_NO_DISC;
4024
4025#endif
4026
4027}
4028
4029
4030
4031#ifdef FUTURE
4032
4033
4034
4035
4036static int prepare(u_char func, u_char subfunc)
4037{
4038 int i;
4039
4040 if (fam0L_drive)
4041 {
4042 i=inb(CDi_status);
4043 if (i&s_attention) GetStatus();
4044 }
4045 else if (fam1_drive) GetStatus();
4046 else if (fam2_drive) GetStatus();
4047 else if (famT_drive) GetStatus();
4048 if (current_drive->CD_changed==0xFF)
4049 {
4050 current_drive->diskstate_flags=0;
4051 current_drive->audio_state=0;
4052 if (!st_diskok)
4053 {
4054 i=check_allowed1(func,subfunc);
4055 if (i<0) return (-2);
4056 }
4057 else
4058 {
4059 i=check_allowed3(func,subfunc);
4060 if (i<0)
4061 {
4062 current_drive->CD_changed=1;
4063 return (-15);
4064 }
4065 }
4066 }
4067 else
4068 {
4069 if (!st_diskok)
4070 {
4071 current_drive->diskstate_flags=0;
4072 current_drive->audio_state=0;
4073 i=check_allowed1(func,subfunc);
4074 if (i<0) return (-2);
4075 }
4076 else
4077 {
4078 if (st_busy)
4079 {
4080 if (current_drive->audio_state!=audio_pausing)
4081 {
4082 i=check_allowed2(func,subfunc);
4083 if (i<0) return (-2);
4084 }
4085 }
4086 else
4087 {
4088 if (current_drive->audio_state==audio_playing) seek_pos_audio_end();
4089 current_drive->audio_state=0;
4090 }
4091 if (!frame_size_valid)
4092 {
4093 i=DiskInfo();
4094 if (i<0)
4095 {
4096 current_drive->diskstate_flags=0;
4097 current_drive->audio_state=0;
4098 i=check_allowed1(func,subfunc);
4099 if (i<0) return (-2);
4100 }
4101 }
4102 }
4103 }
4104 return (0);
4105}
4106#endif
4107
4108
4109
4110
4111
4112static int sbp_status(void)
4113{
4114 int st;
4115
4116 st=ResponseStatus();
4117 if (st<0)
4118 {
4119 msg(DBG_INF,"sbp_status: timeout.\n");
4120 return (0);
4121 }
4122
4123 if (!st_spinning) msg(DBG_SPI,"motor got off - ignoring.\n");
4124
4125 if (st_check)
4126 {
4127 msg(DBG_INF,"st_check detected - retrying.\n");
4128 return (0);
4129 }
4130 if (!st_door_closed)
4131 {
4132 msg(DBG_INF,"door is open - retrying.\n");
4133 return (0);
4134 }
4135 if (!st_caddy_in)
4136 {
4137 msg(DBG_INF,"disk removed - retrying.\n");
4138 return (0);
4139 }
4140 if (!st_diskok)
4141 {
4142 msg(DBG_INF,"!st_diskok detected - retrying.\n");
4143 return (0);
4144 }
4145 if (st_busy)
4146 {
4147 msg(DBG_INF,"st_busy detected - retrying.\n");
4148 return (0);
4149 }
4150 return (1);
4151}
4152
4153
4154static int sbpcd_get_last_session(struct cdrom_device_info *cdi, struct cdrom_multisession *ms_infp)
4155{
4156 struct sbpcd_drive *p = cdi->handle;
4157 ms_infp->addr_format = CDROM_LBA;
4158 ms_infp->addr.lba = p->lba_multi;
4159 if (p->f_multisession)
4160 ms_infp->xa_flag=1;
4161 else
4162 ms_infp->xa_flag=0;
4163
4164 return 0;
4165}
4166
4167
4168
4169
4170
4171
4172static int sbpcd_dev_ioctl(struct cdrom_device_info *cdi, u_int cmd,
4173 u_long arg)
4174{
4175 struct sbpcd_drive *p = cdi->handle;
4176 int i;
4177
4178 msg(DBG_IO2,"ioctl(%s, 0x%08lX, 0x%08lX)\n", cdi->name, cmd, arg);
4179 if (p->drv_id==-1) {
4180 msg(DBG_INF, "ioctl: bad device: %s\n", cdi->name);
4181 return (-ENXIO);
4182 }
4183 down(&ioctl_read_sem);
4184 if (p != current_drive)
4185 switch_drive(p);
4186
4187 msg(DBG_IO2,"ioctl: device %s, request %04X\n",cdi->name,cmd);
4188 switch (cmd)
4189 {
4190 case DDIOCSDBG:
4191 if (!capable(CAP_SYS_ADMIN)) RETURN_UP(-EPERM);
4192 i=sbpcd_dbg_ioctl(arg,1);
4193 RETURN_UP(i);
4194 case CDROMRESET:
4195 msg(DBG_IOC,"ioctl: CDROMRESET entered.\n");
4196 i=DriveReset();
4197 current_drive->audio_state=0;
4198 RETURN_UP(i);
4199
4200 case CDROMREADMODE1:
4201 msg(DBG_IOC,"ioctl: CDROMREADMODE1 requested.\n");
4202#ifdef SAFE_MIXED
4203 if (current_drive->has_data>1) RETURN_UP(-EBUSY);
4204#endif
4205 cc_ModeSelect(CD_FRAMESIZE);
4206 cc_ModeSense();
4207 current_drive->mode=READ_M1;
4208 RETURN_UP(0);
4209
4210 case CDROMREADMODE2:
4211 msg(DBG_IOC,"ioctl: CDROMREADMODE2 requested.\n");
4212#ifdef SAFE_MIXED
4213 if (current_drive->has_data>1) RETURN_UP(-EBUSY);
4214#endif
4215 cc_ModeSelect(CD_FRAMESIZE_RAW1);
4216 cc_ModeSense();
4217 current_drive->mode=READ_M2;
4218 RETURN_UP(0);
4219
4220 case CDROMAUDIOBUFSIZ:
4221 msg(DBG_IOC,"ioctl: CDROMAUDIOBUFSIZ entered.\n");
4222 if (current_drive->sbp_audsiz>0) vfree(current_drive->aud_buf);
4223 current_drive->aud_buf=NULL;
4224 current_drive->sbp_audsiz=arg;
4225
4226 if (current_drive->sbp_audsiz>16)
4227 {
4228 current_drive->sbp_audsiz = 0;
4229 RETURN_UP(current_drive->sbp_audsiz);
4230 }
4231
4232 if (current_drive->sbp_audsiz>0)
4233 {
4234 current_drive->aud_buf=(u_char *) vmalloc(current_drive->sbp_audsiz*CD_FRAMESIZE_RAW);
4235 if (current_drive->aud_buf==NULL)
4236 {
4237 msg(DBG_INF,"audio buffer (%d frames) not available.\n",current_drive->sbp_audsiz);
4238 current_drive->sbp_audsiz=0;
4239 }
4240 else msg(DBG_INF,"audio buffer size: %d frames.\n",current_drive->sbp_audsiz);
4241 }
4242 RETURN_UP(current_drive->sbp_audsiz);
4243
4244 case CDROMREADAUDIO:
4245 {
4246 int i=0, j=0, frame, block=0;
4247 u_int try=0;
4248 u_long timeout;
4249 u_char *p;
4250 u_int data_tries = 0;
4251 u_int data_waits = 0;
4252 u_int data_retrying = 0;
4253 int status_tries;
4254 int error_flag;
4255
4256 msg(DBG_IOC,"ioctl: CDROMREADAUDIO entered.\n");
4257 if (fam0_drive) RETURN_UP(-EINVAL);
4258 if (famL_drive) RETURN_UP(-EINVAL);
4259 if (famV_drive) RETURN_UP(-EINVAL);
4260 if (famT_drive) RETURN_UP(-EINVAL);
4261#ifdef SAFE_MIXED
4262 if (current_drive->has_data>1) RETURN_UP(-EBUSY);
4263#endif
4264 if (current_drive->aud_buf==NULL) RETURN_UP(-EINVAL);
4265 if (copy_from_user(&read_audio, (void __user *)arg,
4266 sizeof(struct cdrom_read_audio)))
4267 RETURN_UP(-EFAULT);
4268 if (read_audio.nframes < 0 || read_audio.nframes>current_drive->sbp_audsiz) RETURN_UP(-EINVAL);
4269 i=verify_area(VERIFY_WRITE, read_audio.buf,
4270 read_audio.nframes*CD_FRAMESIZE_RAW);
4271 if (i) RETURN_UP(i);
4272
4273 if (read_audio.addr_format==CDROM_MSF)
4274 block=msf2lba(&read_audio.addr.msf.minute);
4275 else if (read_audio.addr_format==CDROM_LBA)
4276 block=read_audio.addr.lba;
4277 else RETURN_UP(-EINVAL);
4278#if 000
4279 i=cc_SetSpeed(speed_150,0,0);
4280 if (i) msg(DBG_AUD,"read_audio: SetSpeed error %d\n", i);
4281#endif
4282 msg(DBG_AUD,"read_audio: lba: %d, msf: %06X\n",
4283 block, blk2msf(block));
4284 msg(DBG_AUD,"read_audio: before cc_ReadStatus.\n");
4285#if OLD_BUSY
4286 while (busy_data) sbp_sleep(HZ/10);
4287 busy_audio=1;
4288#endif
4289 error_flag=0;
4290 for (data_tries=5; data_tries>0; data_tries--)
4291 {
4292 msg(DBG_AUD,"data_tries=%d ...\n", data_tries);
4293 current_drive->mode=READ_AU;
4294 cc_ModeSelect(CD_FRAMESIZE_RAW);
4295 cc_ModeSense();
4296 for (status_tries=3; status_tries > 0; status_tries--)
4297 {
4298 flags_cmd_out |= f_respo3;
4299 cc_ReadStatus();
4300 if (sbp_status() != 0) break;
4301 if (st_check) cc_ReadError();
4302 sbp_sleep(1);
4303 }
4304 if (status_tries == 0)
4305 {
4306 msg(DBG_AUD,"read_audio: sbp_status: failed after 3 tries in line %d.\n", __LINE__);
4307 continue;
4308 }
4309 msg(DBG_AUD,"read_audio: sbp_status: ok.\n");
4310
4311 flags_cmd_out = f_putcmd | f_respo2 | f_ResponseStatus | f_obey_p_check;
4312 if (fam0L_drive)
4313 {
4314 flags_cmd_out |= f_lopsta | f_getsta | f_bit1;
4315 cmd_type=READ_M2;
4316 drvcmd[0]=CMD0_READ_XA;
4317 drvcmd[1]=(block>>16)&0x000000ff;
4318 drvcmd[2]=(block>>8)&0x000000ff;
4319 drvcmd[3]=block&0x000000ff;
4320 drvcmd[4]=0;
4321 drvcmd[5]=read_audio.nframes;
4322 drvcmd[6]=0;
4323 }
4324 else if (fam1_drive)
4325 {
4326 drvcmd[0]=CMD1_READ;
4327 lba2msf(block,&drvcmd[1]);
4328 drvcmd[4]=0;
4329 drvcmd[5]=0;
4330 drvcmd[6]=read_audio.nframes;
4331 }
4332 else if (fam2_drive)
4333 {
4334 drvcmd[0]=CMD2_READ_XA2;
4335 lba2msf(block,&drvcmd[1]);
4336 drvcmd[4]=0;
4337 drvcmd[5]=read_audio.nframes;
4338 drvcmd[6]=0x11;
4339 }
4340 else if (famT_drive)
4341 {
4342 }
4343 msg(DBG_AUD,"read_audio: before giving \"read\" command.\n");
4344 flags_cmd_out=f_putcmd;
4345 response_count=0;
4346 i=cmd_out();
4347 if (i<0) msg(DBG_INF,"error giving READ AUDIO command: %0d\n", i);
4348 sbp_sleep(0);
4349 msg(DBG_AUD,"read_audio: after giving \"read\" command.\n");
4350 for (frame=1;frame<2 && !error_flag; frame++)
4351 {
4352 try=maxtim_data;
4353 for (timeout=jiffies+9*HZ; ; )
4354 {
4355 for ( ; try!=0;try--)
4356 {
4357 j=inb(CDi_status);
4358 if (!(j&s_not_data_ready)) break;
4359 if (!(j&s_not_result_ready)) break;
4360 if (fam0L_drive) if (j&s_attention) break;
4361 }
4362 if (try != 0 || time_after_eq(jiffies, timeout)) break;
4363 if (data_retrying == 0) data_waits++;
4364 data_retrying = 1;
4365 sbp_sleep(1);
4366 try = 1;
4367 }
4368 if (try==0)
4369 {
4370 msg(DBG_INF,"read_audio: sbp_data: CDi_status timeout.\n");
4371 error_flag++;
4372 break;
4373 }
4374 msg(DBG_AUD,"read_audio: sbp_data: CDi_status ok.\n");
4375 if (j&s_not_data_ready)
4376 {
4377 msg(DBG_INF, "read_audio: sbp_data: DATA_READY timeout.\n");
4378 error_flag++;
4379 break;
4380 }
4381 msg(DBG_AUD,"read_audio: before reading data.\n");
4382 error_flag=0;
4383 p = current_drive->aud_buf;
4384 if (sbpro_type==1) OUT(CDo_sel_i_d,1);
4385 if (do_16bit)
4386 {
4387 u_short *p2 = (u_short *) p;
4388
4389 for (; (u_char *) p2 < current_drive->aud_buf + read_audio.nframes*CD_FRAMESIZE_RAW;)
4390 {
4391 if ((inb_p(CDi_status)&s_not_data_ready)) continue;
4392
4393
4394 *p2++ = inw_p(CDi_data);
4395 *p2++ = inw_p(CDi_data);
4396 }
4397 } else {
4398 for (; p < current_drive->aud_buf + read_audio.nframes*CD_FRAMESIZE_RAW;)
4399 {
4400 if ((inb_p(CDi_status)&s_not_data_ready)) continue;
4401
4402
4403 *p++ = inb_p(CDi_data);
4404 *p++ = inb_p(CDi_data);
4405 *p++ = inb_p(CDi_data);
4406 *p++ = inb_p(CDi_data);
4407 }
4408 }
4409 if (sbpro_type==1) OUT(CDo_sel_i_d,0);
4410 data_retrying = 0;
4411 }
4412 msg(DBG_AUD,"read_audio: after reading data.\n");
4413 if (error_flag)
4414 {
4415 msg(DBG_AUD,"read_audio: read aborted by drive\n");
4416#if 0000
4417 i=cc_DriveReset();
4418#else
4419 i=cc_ReadError();
4420#endif
4421 continue;
4422 }
4423 if (fam0L_drive)
4424 {
4425 i=maxtim_data;
4426 for (timeout=jiffies+9*HZ; time_before(jiffies, timeout); timeout--)
4427 {
4428 for ( ;i!=0;i--)
4429 {
4430 j=inb(CDi_status);
4431 if (!(j&s_not_data_ready)) break;
4432 if (!(j&s_not_result_ready)) break;
4433 if (j&s_attention) break;
4434 }
4435 if (i != 0 || time_after_eq(jiffies, timeout)) break;
4436 sbp_sleep(0);
4437 i = 1;
4438 }
4439 if (i==0) msg(DBG_AUD,"read_audio: STATUS TIMEOUT AFTER READ");
4440 if (!(j&s_attention))
4441 {
4442 msg(DBG_AUD,"read_audio: sbp_data: timeout waiting DRV_ATTN - retrying\n");
4443 i=cc_DriveReset();
4444 continue;
4445 }
4446 }
4447 do
4448 {
4449 if (fam0L_drive) cc_ReadStatus();
4450 i=ResponseStatus();
4451 if (i<0) { msg(DBG_AUD,
4452 "read_audio: cc_ReadStatus error after read: %02X\n",
4453 current_drive->status_bits);
4454 continue;
4455 }
4456 }
4457 while ((fam0L_drive)&&(!st_check)&&(!(i&p_success)));
4458 if (st_check)
4459 {
4460 i=cc_ReadError();
4461 msg(DBG_AUD,"read_audio: cc_ReadError was necessary after read: %02X\n",i);
4462 continue;
4463 }
4464 if (copy_to_user(read_audio.buf,
4465 current_drive->aud_buf,
4466 read_audio.nframes * CD_FRAMESIZE_RAW))
4467 RETURN_UP(-EFAULT);
4468 msg(DBG_AUD,"read_audio: copy_to_user done.\n");
4469 break;
4470 }
4471 cc_ModeSelect(CD_FRAMESIZE);
4472 cc_ModeSense();
4473 current_drive->mode=READ_M1;
4474#if OLD_BUSY
4475 busy_audio=0;
4476#endif
4477 if (data_tries == 0)
4478 {
4479 msg(DBG_AUD,"read_audio: failed after 5 tries in line %d.\n", __LINE__);
4480 RETURN_UP(-EIO);
4481 }
4482 msg(DBG_AUD,"read_audio: successful return.\n");
4483 RETURN_UP(0);
4484 }
4485
4486 default:
4487 msg(DBG_IOC,"ioctl: unknown function request %04X\n", cmd);
4488 RETURN_UP(-EINVAL);
4489 }
4490}
4491
4492static int sbpcd_audio_ioctl(struct cdrom_device_info *cdi, u_int cmd,
4493 void * arg)
4494{
4495 struct sbpcd_drive *p = cdi->handle;
4496 int i, st, j;
4497
4498 msg(DBG_IO2,"ioctl(%s, 0x%08lX, 0x%08p)\n", cdi->name, cmd, arg);
4499 if (p->drv_id==-1) {
4500 msg(DBG_INF, "ioctl: bad device: %s\n", cdi->name);
4501 return (-ENXIO);
4502 }
4503 down(&ioctl_read_sem);
4504 if (p != current_drive)
4505 switch_drive(p);
4506
4507 msg(DBG_IO2,"ioctl: device %s, request %04X\n",cdi->name,cmd);
4508 switch (cmd)
4509 {
4510
4511 case CDROMPAUSE:
4512 msg(DBG_IOC,"ioctl: CDROMPAUSE entered.\n");
4513
4514
4515
4516
4517 switch (current_drive->audio_state)
4518 {
4519 case audio_playing:
4520 if (famL_drive) i=cc_ReadSubQ();
4521 else i=cc_Pause_Resume(1);
4522 if (i<0) RETURN_UP(-EIO);
4523 if (famL_drive) i=cc_Pause_Resume(1);
4524 else i=cc_ReadSubQ();
4525 if (i<0) RETURN_UP(-EIO);
4526 current_drive->pos_audio_start=current_drive->SubQ_run_tot;
4527 current_drive->audio_state=audio_pausing;
4528 RETURN_UP(0);
4529 case audio_pausing:
4530 i=cc_Seek(current_drive->pos_audio_start,1);
4531 if (i<0) RETURN_UP(-EIO);
4532 RETURN_UP(0);
4533 default:
4534 RETURN_UP(-EINVAL);
4535 }
4536
4537 case CDROMRESUME:
4538 msg(DBG_IOC,"ioctl: CDROMRESUME entered.\n");
4539
4540
4541
4542 if (current_drive->audio_state!=audio_pausing) RETURN_UP(-EINVAL);
4543 if (famL_drive)
4544 i=cc_PlayAudio(current_drive->pos_audio_start,
4545 current_drive->pos_audio_end);
4546 else i=cc_Pause_Resume(3);
4547 if (i<0) RETURN_UP(-EIO);
4548 current_drive->audio_state=audio_playing;
4549 RETURN_UP(0);
4550
4551 case CDROMPLAYMSF:
4552 msg(DBG_IOC,"ioctl: CDROMPLAYMSF entered.\n");
4553#ifdef SAFE_MIXED
4554 if (current_drive->has_data>1) RETURN_UP(-EBUSY);
4555#endif
4556 if (current_drive->audio_state==audio_playing)
4557 {
4558 i=cc_Pause_Resume(1);
4559 if (i<0) RETURN_UP(-EIO);
4560 i=cc_ReadSubQ();
4561 if (i<0) RETURN_UP(-EIO);
4562 current_drive->pos_audio_start=current_drive->SubQ_run_tot;
4563 i=cc_Seek(current_drive->pos_audio_start,1);
4564 }
4565 memcpy(&msf, (void *) arg, sizeof(struct cdrom_msf));
4566
4567 current_drive->pos_audio_start = (msf.cdmsf_min0<<16) |
4568 (msf.cdmsf_sec0<<8) |
4569 msf.cdmsf_frame0;
4570 current_drive->pos_audio_end = (msf.cdmsf_min1<<16) |
4571 (msf.cdmsf_sec1<<8) |
4572 msf.cdmsf_frame1;
4573 msg(DBG_IOX,"ioctl: CDROMPLAYMSF %08X %08X\n",
4574 current_drive->pos_audio_start,current_drive->pos_audio_end);
4575 i=cc_PlayAudio(current_drive->pos_audio_start,current_drive->pos_audio_end);
4576 if (i<0)
4577 {
4578 msg(DBG_INF,"ioctl: cc_PlayAudio returns %d\n",i);
4579 DriveReset();
4580 current_drive->audio_state=0;
4581 RETURN_UP(-EIO);
4582 }
4583 current_drive->audio_state=audio_playing;
4584 RETURN_UP(0);
4585
4586 case CDROMPLAYTRKIND:
4587 msg(DBG_IOC,"ioctl: CDROMPLAYTRKIND entered.\n");
4588#ifdef SAFE_MIXED
4589 if (current_drive->has_data>1) RETURN_UP(-EBUSY);
4590#endif
4591 if (current_drive->audio_state==audio_playing)
4592 {
4593 msg(DBG_IOX,"CDROMPLAYTRKIND: already audio_playing.\n");
4594#if 1
4595 RETURN_UP(0);
4596#else
4597 RETURN_UP(-EINVAL);
4598#endif
4599 }
4600 memcpy(&ti,(void *) arg,sizeof(struct cdrom_ti));
4601 msg(DBG_IOX,"ioctl: trk0: %d, ind0: %d, trk1:%d, ind1:%d\n",
4602 ti.cdti_trk0,ti.cdti_ind0,ti.cdti_trk1,ti.cdti_ind1);
4603 if (ti.cdti_trk0<current_drive->n_first_track) RETURN_UP(-EINVAL);
4604 if (ti.cdti_trk0>current_drive->n_last_track) RETURN_UP(-EINVAL);
4605 if (ti.cdti_trk1<ti.cdti_trk0) ti.cdti_trk1=ti.cdti_trk0;
4606 if (ti.cdti_trk1>current_drive->n_last_track) ti.cdti_trk1=current_drive->n_last_track;
4607 current_drive->pos_audio_start=current_drive->TocBuffer[ti.cdti_trk0].address;
4608 current_drive->pos_audio_end=current_drive->TocBuffer[ti.cdti_trk1+1].address;
4609 i=cc_PlayAudio(current_drive->pos_audio_start,current_drive->pos_audio_end);
4610 if (i<0)
4611 {
4612 msg(DBG_INF,"ioctl: cc_PlayAudio returns %d\n",i);
4613 DriveReset();
4614 current_drive->audio_state=0;
4615 RETURN_UP(-EIO);
4616 }
4617 current_drive->audio_state=audio_playing;
4618 RETURN_UP(0);
4619
4620 case CDROMREADTOCHDR:
4621 msg(DBG_IOC,"ioctl: CDROMREADTOCHDR entered.\n");
4622 tochdr.cdth_trk0=current_drive->n_first_track;
4623 tochdr.cdth_trk1=current_drive->n_last_track;
4624 memcpy((void *) arg, &tochdr, sizeof(struct cdrom_tochdr));
4625 RETURN_UP(0);
4626
4627 case CDROMREADTOCENTRY:
4628 msg(DBG_IOC,"ioctl: CDROMREADTOCENTRY entered.\n");
4629 memcpy(&tocentry, (void *) arg, sizeof(struct cdrom_tocentry));
4630 i=tocentry.cdte_track;
4631 if (i==CDROM_LEADOUT) i=current_drive->n_last_track+1;
4632 else if (i<current_drive->n_first_track||i>current_drive->n_last_track)
4633 RETURN_UP(-EINVAL);
4634 tocentry.cdte_adr=current_drive->TocBuffer[i].ctl_adr&0x0F;
4635 tocentry.cdte_ctrl=(current_drive->TocBuffer[i].ctl_adr>>4)&0x0F;
4636 tocentry.cdte_datamode=current_drive->TocBuffer[i].format;
4637 if (tocentry.cdte_format==CDROM_MSF)
4638 {
4639 tocentry.cdte_addr.msf.minute=(current_drive->TocBuffer[i].address>>16)&0x00FF;
4640 tocentry.cdte_addr.msf.second=(current_drive->TocBuffer[i].address>>8)&0x00FF;
4641 tocentry.cdte_addr.msf.frame=current_drive->TocBuffer[i].address&0x00FF;
4642 }
4643 else if (tocentry.cdte_format==CDROM_LBA)
4644 tocentry.cdte_addr.lba=msf2blk(current_drive->TocBuffer[i].address);
4645 else RETURN_UP(-EINVAL);
4646 memcpy((void *) arg, &tocentry, sizeof(struct cdrom_tocentry));
4647 RETURN_UP(0);
4648
4649 case CDROMSTOP:
4650 msg(DBG_IOC,"ioctl: CDROMSTOP entered.\n");
4651#ifdef SAFE_MIXED
4652 if (current_drive->has_data>1) RETURN_UP(-EBUSY);
4653#endif
4654 i=cc_Pause_Resume(1);
4655 current_drive->audio_state=0;
4656#if 0
4657 cc_DriveReset();
4658#endif
4659 RETURN_UP(i);
4660
4661 case CDROMSTART:
4662 msg(DBG_IOC,"ioctl: CDROMSTART entered.\n");
4663 cc_SpinUp();
4664 current_drive->audio_state=0;
4665 RETURN_UP(0);
4666
4667 case CDROMVOLCTRL:
4668 msg(DBG_IOC,"ioctl: CDROMVOLCTRL entered.\n");
4669 memcpy(&volctrl,(char *) arg,sizeof(volctrl));
4670 current_drive->vol_chan0=0;
4671 current_drive->vol_ctrl0=volctrl.channel0;
4672 current_drive->vol_chan1=1;
4673 current_drive->vol_ctrl1=volctrl.channel1;
4674 i=cc_SetVolume();
4675 RETURN_UP(0);
4676
4677 case CDROMVOLREAD:
4678 msg(DBG_IOC,"ioctl: CDROMVOLREAD entered.\n");
4679 st=cc_GetVolume();
4680 if (st<0) RETURN_UP(st);
4681 volctrl.channel0=current_drive->vol_ctrl0;
4682 volctrl.channel1=current_drive->vol_ctrl1;
4683 volctrl.channel2=0;
4684 volctrl.channel2=0;
4685 memcpy((void *)arg,&volctrl,sizeof(volctrl));
4686 RETURN_UP(0);
4687
4688 case CDROMSUBCHNL:
4689 msg(DBG_IOS,"ioctl: CDROMSUBCHNL entered.\n");
4690
4691
4692
4693
4694
4695
4696 i=cc_ReadSubQ();
4697 if (i<0) {
4698 j=cc_ReadError();
4699 current_drive->audio_state=CDROM_AUDIO_NO_STATUS;
4700
4701
4702
4703 if (current_drive->CD_changed==0xFF) {
4704 msg(DBG_000,"Disk changed detect\n");
4705 current_drive->diskstate_flags &= ~cd_size_bit;
4706 }
4707 RETURN_UP(-EIO);
4708 }
4709 if (current_drive->CD_changed==0xFF) {
4710
4711 msg(DBG_000,"Disk changed STILL detected, rereading TOC!\n");
4712 i=DiskInfo();
4713 if(i==0) {
4714 current_drive->CD_changed=0x00;
4715 RETURN_UP(-EIO);
4716 } else {
4717 RETURN_UP(-EIO);
4718 }
4719 }
4720 memcpy(&SC, (void *) arg, sizeof(struct cdrom_subchnl));
4721
4722
4723
4724
4725
4726 cc_ReadStatus();
4727 i=ResponseStatus();
4728 msg(DBG_000,"Drive Status: door_locked =%d.\n", st_door_locked);
4729 msg(DBG_000,"Drive Status: door_closed =%d.\n", st_door_closed);
4730 msg(DBG_000,"Drive Status: caddy_in =%d.\n", st_caddy_in);
4731 msg(DBG_000,"Drive Status: disk_ok =%d.\n", st_diskok);
4732 msg(DBG_000,"Drive Status: spinning =%d.\n", st_spinning);
4733 msg(DBG_000,"Drive Status: busy =%d.\n", st_busy);
4734
4735 switch (current_drive->audio_state)
4736 {
4737 case audio_playing:
4738 if(st_busy==0) {
4739
4740 current_drive->audio_state=audio_completed;
4741 SC.cdsc_audiostatus=CDROM_AUDIO_COMPLETED;
4742 } else {
4743 SC.cdsc_audiostatus=CDROM_AUDIO_PLAY;
4744 }
4745 break;
4746 case audio_pausing:
4747 SC.cdsc_audiostatus=CDROM_AUDIO_PAUSED;
4748 break;
4749 case audio_completed:
4750 SC.cdsc_audiostatus=CDROM_AUDIO_COMPLETED;
4751 break;
4752 default:
4753 SC.cdsc_audiostatus=CDROM_AUDIO_NO_STATUS;
4754 break;
4755 }
4756 SC.cdsc_adr=current_drive->SubQ_ctl_adr;
4757 SC.cdsc_ctrl=current_drive->SubQ_ctl_adr>>4;
4758 SC.cdsc_trk=bcd2bin(current_drive->SubQ_trk);
4759 SC.cdsc_ind=bcd2bin(current_drive->SubQ_pnt_idx);
4760 if (SC.cdsc_format==CDROM_LBA)
4761 {
4762 SC.cdsc_absaddr.lba=msf2blk(current_drive->SubQ_run_tot);
4763 SC.cdsc_reladdr.lba=msf2blk(current_drive->SubQ_run_trk);
4764 }
4765 else
4766 {
4767 SC.cdsc_absaddr.msf.minute=(current_drive->SubQ_run_tot>>16)&0x00FF;
4768 SC.cdsc_absaddr.msf.second=(current_drive->SubQ_run_tot>>8)&0x00FF;
4769 SC.cdsc_absaddr.msf.frame=current_drive->SubQ_run_tot&0x00FF;
4770 SC.cdsc_reladdr.msf.minute=(current_drive->SubQ_run_trk>>16)&0x00FF;
4771 SC.cdsc_reladdr.msf.second=(current_drive->SubQ_run_trk>>8)&0x00FF;
4772 SC.cdsc_reladdr.msf.frame=current_drive->SubQ_run_trk&0x00FF;
4773 }
4774 memcpy((void *) arg, &SC, sizeof(struct cdrom_subchnl));
4775 msg(DBG_IOS,"CDROMSUBCHNL: %1X %02X %08X %08X %02X %02X %06X %06X\n",
4776 SC.cdsc_format,SC.cdsc_audiostatus,
4777 SC.cdsc_adr,SC.cdsc_ctrl,
4778 SC.cdsc_trk,SC.cdsc_ind,
4779 SC.cdsc_absaddr,SC.cdsc_reladdr);
4780 RETURN_UP(0);
4781
4782 default:
4783 msg(DBG_IOC,"ioctl: unknown function request %04X\n", cmd);
4784 RETURN_UP(-EINVAL);
4785 }
4786}
4787
4788
4789
4790
4791static void sbp_transfer(struct request *req)
4792{
4793 long offs;
4794
4795 while ( (req->nr_sectors > 0) &&
4796 (req->sector/4 >= current_drive->sbp_first_frame) &&
4797 (req->sector/4 <= current_drive->sbp_last_frame) )
4798 {
4799 offs = (req->sector - current_drive->sbp_first_frame * 4) * 512;
4800 memcpy(req->buffer, current_drive->sbp_buf + offs, 512);
4801 req->nr_sectors--;
4802 req->sector++;
4803 req->buffer += 512;
4804 }
4805}
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833#undef DEBUG_GTL
4834
4835
4836
4837
4838
4839static void do_sbpcd_request(request_queue_t * q)
4840{
4841 u_int block;
4842 u_int nsect;
4843 int status_tries, data_tries;
4844 struct request *req;
4845 struct sbpcd_drive *p;
4846#ifdef DEBUG_GTL
4847 static int xx_nr=0;
4848 int xnr;
4849#endif
4850
4851 request_loop:
4852#ifdef DEBUG_GTL
4853 xnr=++xx_nr;
4854
4855 req = elv_next_request(q);
4856
4857 if (!req)
4858 {
4859 printk( "do_sbpcd_request[%di](NULL), Pid:%d, Time:%li\n",
4860 xnr, current->pid, jiffies);
4861 printk( "do_sbpcd_request[%do](NULL) end 0 (null), Time:%li\n",
4862 xnr, jiffies);
4863 return;
4864 }
4865
4866 printk(" do_sbpcd_request[%di](%p:%ld+%ld), Pid:%d, Time:%li\n",
4867 xnr, req, req->sector, req->nr_sectors, current->pid, jiffies);
4868#endif
4869
4870 req = elv_next_request(q);
4871 if (!req)
4872 return;
4873
4874 if (req -> sector == -1)
4875 end_request(req, 0);
4876 spin_unlock_irq(q->queue_lock);
4877
4878 down(&ioctl_read_sem);
4879 if (rq_data_dir(elv_next_request(q)) != READ)
4880 {
4881 msg(DBG_INF, "bad cmd %d\n", req->cmd[0]);
4882 goto err_done;
4883 }
4884 p = req->rq_disk->private_data;
4885#if OLD_BUSY
4886 while (busy_audio) sbp_sleep(HZ);
4887 busy_data=1;
4888#endif
4889
4890 if (p->audio_state==audio_playing) goto err_done;
4891 if (p != current_drive)
4892 switch_drive(p);
4893
4894 block = req->sector;
4895 nsect = req->nr_sectors;
4896
4897 msg(DBG_BSZ,"read sector %d (%d sectors)\n", block, nsect);
4898#if 0
4899 msg(DBG_MUL,"read LBA %d\n", block/4);
4900#endif
4901
4902 sbp_transfer(req);
4903
4904 if (req->nr_sectors == 0)
4905 {
4906#ifdef DEBUG_GTL
4907 printk(" do_sbpcd_request[%do](%p:%ld+%ld) end 2, Time:%li\n",
4908 xnr, req, req->sector, req->nr_sectors, jiffies);
4909#endif
4910 up(&ioctl_read_sem);
4911 spin_lock_irq(q->queue_lock);
4912 end_request(req, 1);
4913 goto request_loop;
4914 }
4915
4916#ifdef FUTURE
4917 i=prepare(0,0);
4918 if (i!=0)
4919 msg(DBG_INF,"\"prepare\" tells error %d -- ignored\n", i);
4920#endif
4921
4922 if (!st_spinning) cc_SpinUp();
4923
4924 for (data_tries=n_retries; data_tries > 0; data_tries--)
4925 {
4926 for (status_tries=3; status_tries > 0; status_tries--)
4927 {
4928 flags_cmd_out |= f_respo3;
4929 cc_ReadStatus();
4930 if (sbp_status() != 0) break;
4931 if (st_check) cc_ReadError();
4932 sbp_sleep(1);
4933 }
4934 if (status_tries == 0)
4935 {
4936 msg(DBG_INF,"sbp_status: failed after 3 tries in line %d\n", __LINE__);
4937 break;
4938 }
4939
4940 sbp_read_cmd(req);
4941 sbp_sleep(0);
4942 if (sbp_data(req) != 0)
4943 {
4944#ifdef SAFE_MIXED
4945 current_drive->has_data=2;
4946#endif
4947#ifdef DEBUG_GTL
4948 printk(" do_sbpcd_request[%do](%p:%ld+%ld) end 3, Time:%li\n",
4949 xnr, req, req->sector, req->nr_sectors, jiffies);
4950#endif
4951 up(&ioctl_read_sem);
4952 spin_lock_irq(q->queue_lock);
4953 end_request(req, 1);
4954 goto request_loop;
4955 }
4956 }
4957
4958 err_done:
4959#if OLD_BUSY
4960 busy_data=0;
4961#endif
4962#ifdef DEBUG_GTL
4963 printk(" do_sbpcd_request[%do](%p:%ld+%ld) end 4 (error), Time:%li\n",
4964 xnr, req, req->sector, req->nr_sectors, jiffies);
4965#endif
4966 up(&ioctl_read_sem);
4967 sbp_sleep(0);
4968 spin_lock_irq(q->queue_lock);
4969 end_request(req, 0);
4970 goto request_loop;
4971}
4972
4973
4974
4975
4976static void sbp_read_cmd(struct request *req)
4977{
4978#undef OLD
4979
4980 int i;
4981 int block;
4982
4983 current_drive->sbp_first_frame=current_drive->sbp_last_frame=-1;
4984 current_drive->sbp_current = 0;
4985 block=req->sector/4;
4986 if (block+current_drive->sbp_bufsiz <= current_drive->CDsize_frm)
4987 current_drive->sbp_read_frames = current_drive->sbp_bufsiz;
4988 else
4989 {
4990 current_drive->sbp_read_frames=current_drive->CDsize_frm-block;
4991
4992 if (current_drive->sbp_read_frames < 1)
4993 {
4994 msg(DBG_INF,"requested frame %d, CD size %d ???\n",
4995 block, current_drive->CDsize_frm);
4996 current_drive->sbp_read_frames=1;
4997 }
4998 }
4999
5000 flags_cmd_out = f_putcmd | f_respo2 | f_ResponseStatus | f_obey_p_check;
5001 clr_cmdbuf();
5002 if (famV_drive)
5003 {
5004 drvcmd[0]=CMDV_READ;
5005 lba2msf(block,&drvcmd[1]);
5006 bin2bcdx(&drvcmd[1]);
5007 bin2bcdx(&drvcmd[2]);
5008 bin2bcdx(&drvcmd[3]);
5009 drvcmd[4]=current_drive->sbp_read_frames>>8;
5010 drvcmd[5]=current_drive->sbp_read_frames&0xff;
5011 drvcmd[6]=0x02;
5012 }
5013 else if (fam0L_drive)
5014 {
5015 flags_cmd_out |= f_lopsta | f_getsta | f_bit1;
5016 if (current_drive->xa_byte==0x20)
5017 {
5018 cmd_type=READ_M2;
5019 drvcmd[0]=CMD0_READ_XA;
5020 drvcmd[1]=(block>>16)&0x0ff;
5021 drvcmd[2]=(block>>8)&0x0ff;
5022 drvcmd[3]=block&0x0ff;
5023 drvcmd[4]=(current_drive->sbp_read_frames>>8)&0x0ff;
5024 drvcmd[5]=current_drive->sbp_read_frames&0x0ff;
5025 }
5026 else
5027 {
5028 drvcmd[0]=CMD0_READ;
5029 if (current_drive->drv_type>=drv_201)
5030 {
5031 lba2msf(block,&drvcmd[1]);
5032 bin2bcdx(&drvcmd[1]);
5033 bin2bcdx(&drvcmd[2]);
5034 bin2bcdx(&drvcmd[3]);
5035 }
5036 else
5037 {
5038 drvcmd[1]=(block>>16)&0x0ff;
5039 drvcmd[2]=(block>>8)&0x0ff;
5040 drvcmd[3]=block&0x0ff;
5041 }
5042 drvcmd[4]=(current_drive->sbp_read_frames>>8)&0x0ff;
5043 drvcmd[5]=current_drive->sbp_read_frames&0x0ff;
5044 drvcmd[6]=(current_drive->drv_type<drv_201)?0:2;
5045 }
5046 }
5047 else if (fam1_drive)
5048 {
5049 drvcmd[0]=CMD1_READ;
5050 lba2msf(block,&drvcmd[1]);
5051 drvcmd[5]=(current_drive->sbp_read_frames>>8)&0x0ff;
5052 drvcmd[6]=current_drive->sbp_read_frames&0x0ff;
5053 }
5054 else if (fam2_drive)
5055 {
5056 drvcmd[0]=CMD2_READ;
5057 lba2msf(block,&drvcmd[1]);
5058 drvcmd[4]=(current_drive->sbp_read_frames>>8)&0x0ff;
5059 drvcmd[5]=current_drive->sbp_read_frames&0x0ff;
5060 drvcmd[6]=0x02;
5061 }
5062 else if (famT_drive)
5063 {
5064 drvcmd[0]=CMDT_READ;
5065 drvcmd[2]=(block>>24)&0x0ff;
5066 drvcmd[3]=(block>>16)&0x0ff;
5067 drvcmd[4]=(block>>8)&0x0ff;
5068 drvcmd[5]=block&0x0ff;
5069 drvcmd[7]=(current_drive->sbp_read_frames>>8)&0x0ff;
5070 drvcmd[8]=current_drive->sbp_read_frames&0x0ff;
5071 }
5072 flags_cmd_out=f_putcmd;
5073 response_count=0;
5074 i=cmd_out();
5075 if (i<0) msg(DBG_INF,"error giving READ command: %0d\n", i);
5076 return;
5077}
5078
5079
5080
5081
5082
5083static int sbp_data(struct request *req)
5084{
5085 int i=0, j=0, l, frame;
5086 u_int try=0;
5087 u_long timeout;
5088 u_char *p;
5089 u_int data_tries = 0;
5090 u_int data_waits = 0;
5091 u_int data_retrying = 0;
5092 int error_flag;
5093 int xa_count;
5094 int max_latency;
5095 int success;
5096 int wait;
5097 int duration;
5098
5099 error_flag=0;
5100 success=0;
5101#if LONG_TIMING
5102 max_latency=9*HZ;
5103#else
5104 if (current_drive->f_multisession) max_latency=15*HZ;
5105 else max_latency=5*HZ;
5106#endif
5107 duration=jiffies;
5108 for (frame=0;frame<current_drive->sbp_read_frames&&!error_flag; frame++)
5109 {
5110 SBPCD_CLI;
5111
5112 del_timer(&data_timer);
5113 data_timer.expires=jiffies+max_latency;
5114 timed_out_data=0;
5115 add_timer(&data_timer);
5116 while (!timed_out_data)
5117 {
5118 if (current_drive->f_multisession) try=maxtim_data*4;
5119 else try=maxtim_data;
5120 msg(DBG_000,"sbp_data: CDi_status loop: try=%d.\n",try);
5121 for ( ; try!=0;try--)
5122 {
5123 j=inb(CDi_status);
5124 if (!(j&s_not_data_ready)) break;
5125 if (!(j&s_not_result_ready)) break;
5126 if (fam0LV_drive) if (j&s_attention) break;
5127 }
5128 if (!(j&s_not_data_ready)) goto data_ready;
5129 if (try==0)
5130 {
5131 if (data_retrying == 0) data_waits++;
5132 data_retrying = 1;
5133 msg(DBG_000,"sbp_data: CDi_status loop: sleeping.\n");
5134 sbp_sleep(1);
5135 try = 1;
5136 }
5137 }
5138 msg(DBG_INF,"sbp_data: CDi_status loop expired.\n");
5139 data_ready:
5140 del_timer(&data_timer);
5141
5142 if (timed_out_data)
5143 {
5144 msg(DBG_INF,"sbp_data: CDi_status timeout (timed_out_data) (%02X).\n", j);
5145 error_flag++;
5146 }
5147 if (try==0)
5148 {
5149 msg(DBG_INF,"sbp_data: CDi_status timeout (try=0) (%02X).\n", j);
5150 error_flag++;
5151 }
5152 if (!(j&s_not_result_ready))
5153 {
5154 msg(DBG_INF, "sbp_data: RESULT_READY where DATA_READY awaited (%02X).\n", j);
5155 response_count=20;
5156 j=ResponseInfo();
5157 j=inb(CDi_status);
5158 }
5159 if (j&s_not_data_ready)
5160 {
5161 if ((current_drive->ored_ctl_adr&0x40)==0)
5162 msg(DBG_INF, "CD contains no data tracks.\n");
5163 else msg(DBG_INF, "sbp_data: DATA_READY timeout (%02X).\n", j);
5164 error_flag++;
5165 }
5166 SBPCD_STI;
5167 if (error_flag) break;
5168
5169 msg(DBG_000, "sbp_data: beginning to read.\n");
5170 p = current_drive->sbp_buf + frame * CD_FRAMESIZE;
5171 if (sbpro_type==1) OUT(CDo_sel_i_d,1);
5172 if (cmd_type==READ_M2) {
5173 if (do_16bit) insw(CDi_data, xa_head_buf, CD_XA_HEAD>>1);
5174 else insb(CDi_data, xa_head_buf, CD_XA_HEAD);
5175 }
5176 if (do_16bit) insw(CDi_data, p, CD_FRAMESIZE>>1);
5177 else insb(CDi_data, p, CD_FRAMESIZE);
5178 if (cmd_type==READ_M2) {
5179 if (do_16bit) insw(CDi_data, xa_tail_buf, CD_XA_TAIL>>1);
5180 else insb(CDi_data, xa_tail_buf, CD_XA_TAIL);
5181 }
5182 current_drive->sbp_current++;
5183 if (sbpro_type==1) OUT(CDo_sel_i_d,0);
5184 if (cmd_type==READ_M2)
5185 {
5186 for (xa_count=0;xa_count<CD_XA_HEAD;xa_count++)
5187 sprintf(&msgbuf[xa_count*3], " %02X", xa_head_buf[xa_count]);
5188 msgbuf[xa_count*3]=0;
5189 msg(DBG_XA1,"xa head:%s\n", msgbuf);
5190 }
5191 data_retrying = 0;
5192 data_tries++;
5193 if (data_tries >= 1000)
5194 {
5195 msg(DBG_INF,"sbp_data() statistics: %d waits in %d frames.\n", data_waits, data_tries);
5196 data_waits = data_tries = 0;
5197 }
5198 }
5199 duration=jiffies-duration;
5200 msg(DBG_TEA,"time to read %d frames: %d jiffies .\n",frame,duration);
5201 if (famT_drive)
5202 {
5203 wait=8;
5204 do
5205 {
5206 if (teac==2)
5207 {
5208 if ((i=CDi_stat_loop_T()) == -1) break;
5209 }
5210 else
5211 {
5212 sbp_sleep(1);
5213 OUT(CDo_sel_i_d,0);
5214 i=inb(CDi_status);
5215 }
5216 if (!(i&s_not_data_ready))
5217 {
5218 OUT(CDo_sel_i_d,1);
5219 j=0;
5220 do
5221 {
5222 if (do_16bit) i=inw(CDi_data);
5223 else i=inb(CDi_data);
5224 j++;
5225 i=inb(CDi_status);
5226 }
5227 while (!(i&s_not_data_ready));
5228 msg(DBG_TEA, "==========too much data (%d bytes/words)==============.\n", j);
5229 }
5230 if (!(i&s_not_result_ready))
5231 {
5232 OUT(CDo_sel_i_d,0);
5233 l=0;
5234 do
5235 {
5236 infobuf[l++]=inb(CDi_info);
5237 i=inb(CDi_status);
5238 }
5239 while (!(i&s_not_result_ready));
5240 if (infobuf[0]==0x00) success=1;
5241#if 1
5242 for (j=0;j<l;j++) sprintf(&msgbuf[j*3], " %02X", infobuf[j]);
5243 msgbuf[j*3]=0;
5244 msg(DBG_TEA,"sbp_data info response:%s\n", msgbuf);
5245#endif
5246 if (infobuf[0]==0x02)
5247 {
5248 error_flag++;
5249 do
5250 {
5251 ++recursion;
5252 if (recursion>1) msg(DBG_TEA,"cmd_out_T READ_ERR recursion (sbp_data): %d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n",recursion);
5253 else msg(DBG_TEA,"sbp_data: CMDT_READ_ERR necessary.\n");
5254 clr_cmdbuf();
5255 drvcmd[0]=CMDT_READ_ERR;
5256 j=cmd_out_T();
5257 --recursion;
5258 sbp_sleep(1);
5259 }
5260 while (j<0);
5261 current_drive->error_state=infobuf[2];
5262 current_drive->b3=infobuf[3];
5263 current_drive->b4=infobuf[4];
5264 }
5265 break;
5266 }
5267 else
5268 {
5269#if 0
5270 msg(DBG_TEA, "============= waiting for result=================.\n");
5271 sbp_sleep(1);
5272#endif
5273 }
5274 }
5275 while (wait--);
5276 }
5277
5278 if (error_flag)
5279 {
5280 msg(DBG_TEA, "================error flag: %d=================.\n", error_flag);
5281 msg(DBG_INF,"sbp_data: read aborted by drive.\n");
5282#if 1
5283 i=cc_DriveReset();
5284#else
5285 i=cc_ReadError();
5286#endif
5287 return (0);
5288 }
5289
5290 if (fam0LV_drive)
5291 {
5292 SBPCD_CLI;
5293 i=maxtim_data;
5294 for (timeout=jiffies+HZ; time_before(jiffies, timeout); timeout--)
5295 {
5296 for ( ;i!=0;i--)
5297 {
5298 j=inb(CDi_status);
5299 if (!(j&s_not_data_ready)) break;
5300 if (!(j&s_not_result_ready)) break;
5301 if (j&s_attention) break;
5302 }
5303 if (i != 0 || time_after_eq(jiffies, timeout)) break;
5304 sbp_sleep(0);
5305 i = 1;
5306 }
5307 if (i==0) msg(DBG_INF,"status timeout after READ.\n");
5308 if (!(j&s_attention))
5309 {
5310 msg(DBG_INF,"sbp_data: timeout waiting DRV_ATTN - retrying.\n");
5311 i=cc_DriveReset();
5312 SBPCD_STI;
5313 return (0);
5314 }
5315 SBPCD_STI;
5316 }
5317
5318#if 0
5319 if (!success)
5320#endif
5321 do
5322 {
5323 if (fam0LV_drive) cc_ReadStatus();
5324#if 1
5325 if (famT_drive) msg(DBG_TEA, "================before ResponseStatus=================.\n", i);
5326#endif
5327 i=ResponseStatus();
5328#if 1
5329 if (famT_drive) msg(DBG_TEA, "================ResponseStatus: %d=================.\n", i);
5330#endif
5331 if (i<0)
5332 {
5333 msg(DBG_INF,"bad cc_ReadStatus after read: %02X\n", current_drive->status_bits);
5334 return (0);
5335 }
5336 }
5337 while ((fam0LV_drive)&&(!st_check)&&(!(i&p_success)));
5338 if (st_check)
5339 {
5340 i=cc_ReadError();
5341 msg(DBG_INF,"cc_ReadError was necessary after read: %d\n",i);
5342 return (0);
5343 }
5344 if (fatal_err)
5345 {
5346 fatal_err=0;
5347 current_drive->sbp_first_frame=current_drive->sbp_last_frame=-1;
5348 current_drive->sbp_current = 0;
5349 msg(DBG_INF,"sbp_data: fatal_err - retrying.\n");
5350 return (0);
5351 }
5352
5353 current_drive->sbp_first_frame = req -> sector / 4;
5354 current_drive->sbp_last_frame = current_drive->sbp_first_frame + current_drive->sbp_read_frames - 1;
5355 sbp_transfer(req);
5356 return (1);
5357}
5358
5359
5360static int sbpcd_block_open(struct inode *inode, struct file *file)
5361{
5362 struct sbpcd_drive *p = inode->i_bdev->bd_disk->private_data;
5363 return cdrom_open(p->sbpcd_infop, inode, file);
5364}
5365
5366static int sbpcd_block_release(struct inode *inode, struct file *file)
5367{
5368 struct sbpcd_drive *p = inode->i_bdev->bd_disk->private_data;
5369 return cdrom_release(p->sbpcd_infop, file);
5370}
5371
5372static int sbpcd_block_ioctl(struct inode *inode, struct file *file,
5373 unsigned cmd, unsigned long arg)
5374{
5375 struct sbpcd_drive *p = inode->i_bdev->bd_disk->private_data;
5376 return cdrom_ioctl(file, p->sbpcd_infop, inode, cmd, arg);
5377}
5378
5379static int sbpcd_block_media_changed(struct gendisk *disk)
5380{
5381 struct sbpcd_drive *p = disk->private_data;
5382 return cdrom_media_changed(p->sbpcd_infop);
5383}
5384
5385static struct block_device_operations sbpcd_bdops =
5386{
5387 .owner = THIS_MODULE,
5388 .open = sbpcd_block_open,
5389 .release = sbpcd_block_release,
5390 .ioctl = sbpcd_block_ioctl,
5391 .media_changed = sbpcd_block_media_changed,
5392};
5393
5394
5395
5396
5397static int sbpcd_open(struct cdrom_device_info *cdi, int purpose)
5398{
5399 struct sbpcd_drive *p = cdi->handle;
5400
5401 down(&ioctl_read_sem);
5402 switch_drive(p);
5403
5404
5405
5406
5407 msg(DBG_LCK,"open_count: %d -> %d\n",
5408 current_drive->open_count,current_drive->open_count+1);
5409 if (++current_drive->open_count<=1)
5410 {
5411 int i;
5412 i=LockDoor();
5413 current_drive->open_count=1;
5414 if (famT_drive) msg(DBG_TEA,"sbpcd_open: before i=DiskInfo();.\n");
5415 i=DiskInfo();
5416 if (famT_drive) msg(DBG_TEA,"sbpcd_open: after i=DiskInfo();.\n");
5417 if ((current_drive->ored_ctl_adr&0x40)==0)
5418 {
5419 msg(DBG_INF,"CD contains no data tracks.\n");
5420#ifdef SAFE_MIXED
5421 current_drive->has_data=0;
5422#endif
5423 }
5424#ifdef SAFE_MIXED
5425 else if (current_drive->has_data<1) current_drive->has_data=1;
5426#endif
5427 }
5428 if (!st_spinning) cc_SpinUp();
5429 RETURN_UP(0);
5430}
5431
5432
5433
5434
5435static void sbpcd_release(struct cdrom_device_info * cdi)
5436{
5437 struct sbpcd_drive *p = cdi->handle;
5438
5439 if (p->drv_id==-1) {
5440 msg(DBG_INF, "release: bad device: %s\n", cdi->name);
5441 return;
5442 }
5443 down(&ioctl_read_sem);
5444 switch_drive(p);
5445
5446
5447
5448 msg(DBG_LCK,"open_count: %d -> %d\n",
5449 p->open_count,p->open_count-1);
5450 if (p->open_count>-2)
5451 {
5452 if (--p->open_count<=0)
5453 {
5454 p->sbp_first_frame=p->sbp_last_frame=-1;
5455 if (p->audio_state!=audio_playing)
5456 if (p->f_eject) cc_SpinDown();
5457 p->diskstate_flags &= ~cd_size_bit;
5458 p->open_count=0;
5459#ifdef SAFE_MIXED
5460 p->has_data=0;
5461#endif
5462 }
5463 }
5464 up(&ioctl_read_sem);
5465 return ;
5466}
5467
5468
5469
5470
5471static int sbpcd_media_changed( struct cdrom_device_info *cdi, int disc_nr);
5472static struct cdrom_device_ops sbpcd_dops = {
5473 .open = sbpcd_open,
5474 .release = sbpcd_release,
5475 .drive_status = sbpcd_drive_status,
5476 .media_changed = sbpcd_media_changed,
5477 .tray_move = sbpcd_tray_move,
5478 .lock_door = sbpcd_lock_door,
5479 .select_speed = sbpcd_select_speed,
5480 .get_last_session = sbpcd_get_last_session,
5481 .get_mcn = sbpcd_get_mcn,
5482 .reset = sbpcd_reset,
5483 .audio_ioctl = sbpcd_audio_ioctl,
5484 .dev_ioctl = sbpcd_dev_ioctl,
5485 .capability = CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK |
5486 CDC_MULTI_SESSION | CDC_MEDIA_CHANGED |
5487 CDC_MCN | CDC_PLAY_AUDIO | CDC_IOCTLS,
5488 .n_minors = 1,
5489};
5490
5491
5492
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504
5505
5506
5507
5508
5509
5510
5511
5512
5513
5514
5515
5516
5517
5518int sbpcd_setup(char *s)
5519{
5520#ifndef MODULE
5521 int p[4];
5522 (void)get_options(s, ARRAY_SIZE(p), p);
5523 setup_done++;
5524 msg(DBG_INI,"sbpcd_setup called with %04X,%s\n",p[1], s);
5525 sbpro_type=0;
5526 if (p[0]>1) sbpro_type=p[2];
5527 else if (!strcmp(s,str_sb)) sbpro_type=1;
5528 else if (!strcmp(s,str_sb_l)) sbpro_type=1;
5529 else if (!strcmp(s,str_sp)) sbpro_type=2;
5530 else if (!strcmp(s,str_sp_l)) sbpro_type=2;
5531 else if (!strcmp(s,str_ss)) sbpro_type=2;
5532 else if (!strcmp(s,str_ss_l)) sbpro_type=2;
5533 else if (!strcmp(s,str_t16)) sbpro_type=3;
5534 else if (!strcmp(s,str_t16_l)) sbpro_type=3;
5535 if (p[0]>0) sbpcd_ioaddr=p[1];
5536 if (p[0]>2) max_drives=p[3];
5537#else
5538 sbpcd_ioaddr = sbpcd[0];
5539 sbpro_type = sbpcd[1];
5540#endif
5541
5542 CDo_command=sbpcd_ioaddr;
5543 CDi_info=sbpcd_ioaddr;
5544 CDi_status=sbpcd_ioaddr+1;
5545 CDo_sel_i_d=sbpcd_ioaddr+1;
5546 CDo_reset=sbpcd_ioaddr+2;
5547 CDo_enable=sbpcd_ioaddr+3;
5548 f_16bit=0;
5549 if ((sbpro_type==1)||(sbpro_type==3))
5550 {
5551 CDi_data=sbpcd_ioaddr;
5552 if (sbpro_type==3)
5553 {
5554 f_16bit=1;
5555 sbpro_type=1;
5556 }
5557 }
5558 else CDi_data=sbpcd_ioaddr+2;
5559
5560 return 1;
5561}
5562
5563__setup("sbpcd=", sbpcd_setup);
5564
5565
5566
5567
5568
5569
5570
5571
5572
5573
5574
5575
5576
5577
5578
5579
5580
5581
5582
5583static int __init config_spea(void)
5584{
5585
5586
5587
5588
5589
5590
5591
5592
5593 int n_ports=0x10;
5594
5595 int irq_number=0;
5596 int dma_channel=0;
5597 int dack_polarity=0;
5598 int drq_polarity=0x40;
5599 int i;
5600
5601#define SPEA_REG_1 sbpcd_ioaddr-0x08+4
5602#define SPEA_REG_2 sbpcd_ioaddr-0x08+5
5603
5604 OUT(SPEA_REG_1,0xFF);
5605 i=inb(SPEA_REG_1);
5606 if (i!=0x0F)
5607 {
5608 msg(DBG_SEQ,"no SPEA interface at %04X present.\n", sbpcd_ioaddr);
5609 return (-1);
5610 }
5611 OUT(SPEA_REG_1,0x04);
5612 OUT(SPEA_REG_2,0xC0);
5613
5614 OUT(SPEA_REG_1,0x05);
5615 OUT(SPEA_REG_2,0x10|drq_polarity|dack_polarity);
5616
5617#if 1
5618#define SPEA_PATTERN 0x80
5619#else
5620#define SPEA_PATTERN 0x00
5621#endif
5622 OUT(SPEA_REG_1,0x06);
5623 OUT(SPEA_REG_2,dma_channel|irq_number|SPEA_PATTERN);
5624 OUT(SPEA_REG_2,dma_channel|irq_number|SPEA_PATTERN);
5625
5626 OUT(SPEA_REG_1,0x09);
5627 i=(inb(SPEA_REG_2)&0xCF)|n_ports;
5628 OUT(SPEA_REG_2,i);
5629
5630 sbpro_type = 0;
5631 msg(DBG_SEQ,"found SoundScape interface at %04X.\n", sbpcd_ioaddr);
5632 return (0);
5633}
5634
5635
5636
5637
5638
5639
5640
5641
5642#ifdef MODULE
5643int __init __sbpcd_init(void)
5644#else
5645int __init sbpcd_init(void)
5646#endif
5647{
5648 int i=0, j=0;
5649 int addr[2]={1, CDROM_PORT};
5650 int port_index;
5651
5652 sti();
5653
5654 msg(DBG_INF,"sbpcd.c %s\n", VERSION);
5655#ifndef MODULE
5656#if DISTRIBUTION
5657 if (!setup_done)
5658 {
5659 msg(DBG_INF,"Looking for Matsushita/Panasonic, CreativeLabs, Longshine, TEAC CD-ROM drives\n");
5660 msg(DBG_INF,"= = = = = = = = = = W A R N I N G = = = = = = = = = =\n");
5661 msg(DBG_INF,"Auto-Probing can cause a hang (f.e. touching an NE2000 card).\n");
5662 msg(DBG_INF,"If that happens, you have to reboot and use the\n");
5663 msg(DBG_INF,"LILO (kernel) command line feature like:\n");
5664 msg(DBG_INF," LILO boot: ... sbpcd=0x230,SoundBlaster\n");
5665 msg(DBG_INF,"or like:\n");
5666 msg(DBG_INF," LILO boot: ... sbpcd=0x300,LaserMate\n");
5667 msg(DBG_INF,"or like:\n");
5668 msg(DBG_INF," LILO boot: ... sbpcd=0x338,SoundScape\n");
5669 msg(DBG_INF,"with your REAL address.\n");
5670 msg(DBG_INF,"= = = = = = = = = = END of WARNING = = = = = == = = =\n");
5671 }
5672#endif
5673 sbpcd[0]=sbpcd_ioaddr;
5674 sbpcd[1]=sbpro_type;
5675#endif
5676
5677 for (port_index=0;port_index<NUM_PROBE;port_index+=2)
5678 {
5679 addr[1]=sbpcd[port_index];
5680 if (addr[1]==0) break;
5681 if (check_region(addr[1],4))
5682 {
5683 msg(DBG_INF,"check_region: %03X is not free.\n",addr[1]);
5684 continue;
5685 }
5686 if (sbpcd[port_index+1]==2) type=str_sp;
5687 else if (sbpcd[port_index+1]==1) type=str_sb;
5688 else if (sbpcd[port_index+1]==3) type=str_t16;
5689 else type=str_lm;
5690 sbpcd_setup((char *)type);
5691#if DISTRIBUTION
5692 msg(DBG_INF,"Scanning 0x%X (%s)...\n", CDo_command, type);
5693#endif
5694 if (sbpcd[port_index+1]==2)
5695 {
5696 i=config_spea();
5697 if (i<0) continue;
5698 }
5699#ifdef PATH_CHECK
5700 if (check_card(addr[1])) continue;
5701#endif
5702 i=check_drives();
5703 msg(DBG_INI,"check_drives done.\n");
5704 if (i>=0) break;
5705 }
5706
5707 if (ndrives==0)
5708 {
5709 msg(DBG_INF, "No drive found.\n");
5710#ifdef MODULE
5711 return -EIO;
5712#else
5713 goto init_done;
5714#endif
5715 }
5716
5717 if (port_index>0)
5718 {
5719 msg(DBG_INF, "You should read Documentation/cdrom/sbpcd\n");
5720 msg(DBG_INF, "and then configure sbpcd.h for your hardware.\n");
5721 }
5722 check_datarate();
5723 msg(DBG_INI,"check_datarate done.\n");
5724
5725 for (j=0;j<NR_SBPCD;j++)
5726 {
5727 struct sbpcd_drive *p = D_S + j;
5728 if (p->drv_id==-1)
5729 continue;
5730 switch_drive(p);
5731#if 1
5732 if (!famL_drive) cc_DriveReset();
5733#endif
5734 if (!st_spinning) cc_SpinUp();
5735 p->sbp_first_frame = -1;
5736 p->sbp_last_frame = -1;
5737 p->sbp_read_frames = 0;
5738 p->sbp_current = 0;
5739 p->CD_changed=1;
5740 p->frame_size=CD_FRAMESIZE;
5741 p->f_eject=0;
5742#if EJECT
5743 if (!fam0_drive) p->f_eject=1;
5744#endif
5745 cc_ReadStatus();
5746 i=ResponseStatus();
5747 if (famT_drive) i=ResponseStatus();
5748 if (i<0)
5749 {
5750 if (i!=-402)
5751 msg(DBG_INF,"init: ResponseStatus returns %d.\n",i);
5752 }
5753 else
5754 {
5755 if (st_check)
5756 {
5757 i=cc_ReadError();
5758 msg(DBG_INI,"init: cc_ReadError returns %d\n",i);
5759 }
5760 }
5761 msg(DBG_INI,"init: first GetStatus: %d\n",i);
5762 msg(DBG_LCS,"init: first GetStatus: error_byte=%d\n",
5763 p->error_byte);
5764 if (p->error_byte==aud_12)
5765 {
5766 timeout=jiffies+2*HZ;
5767 do
5768 {
5769 i=GetStatus();
5770 msg(DBG_INI,"init: second GetStatus: %02X\n",i);
5771 msg(DBG_LCS,
5772 "init: second GetStatus: error_byte=%d\n",
5773 p->error_byte);
5774 if (i<0) break;
5775 if (!st_caddy_in) break;
5776 }
5777 while ((!st_diskok)||time_after(jiffies, timeout));
5778 }
5779 i=SetSpeed();
5780 if (i>=0) p->CD_changed=1;
5781 }
5782
5783 if (!request_region(CDo_command,4,major_name))
5784 {
5785 printk(KERN_WARNING "sbpcd: Unable to request region 0x%x\n", CDo_command);
5786 return -EIO;
5787 }
5788
5789
5790
5791
5792
5793#if SOUND_BASE
5794 OUT(MIXER_addr,MIXER_CD_Volume);
5795 OUT(MIXER_data,0xCC);
5796#endif
5797
5798 if (register_blkdev(MAJOR_NR, major_name)) {
5799#ifdef MODULE
5800 return -EIO;
5801#else
5802 goto init_done;
5803#endif
5804 }
5805
5806
5807
5808
5809 sbpcd_queue = blk_init_queue(do_sbpcd_request, &sbpcd_lock);
5810 if (!sbpcd_queue) {
5811 release_region(CDo_command,4);
5812 unregister_blkdev(MAJOR_NR, major_name);
5813 return -ENOMEM;
5814 }
5815
5816 devfs_mk_dir("sbp");
5817
5818 for (j=0;j<NR_SBPCD;j++)
5819 {
5820 struct cdrom_device_info * sbpcd_infop;
5821 struct gendisk *disk;
5822 struct sbpcd_drive *p = D_S + j;
5823
5824 if (p->drv_id==-1) continue;
5825 switch_drive(p);
5826#ifdef SAFE_MIXED
5827 p->has_data=0;
5828#endif
5829
5830
5831
5832 p->aud_buf=NULL;
5833 p->sbp_audsiz=0;
5834 p->sbp_bufsiz=buffers;
5835 if (p->drv_type&drv_fam1)
5836 if (READ_AUDIO>0)
5837 p->sbp_audsiz = READ_AUDIO;
5838 p->sbp_buf=(u_char *) vmalloc(buffers*CD_FRAMESIZE);
5839 if (!p->sbp_buf) {
5840 msg(DBG_INF,"data buffer (%d frames) not available.\n",
5841 buffers);
5842 if ((unregister_blkdev(MAJOR_NR, major_name) == -EINVAL))
5843 {
5844 printk("Can't unregister %s\n", major_name);
5845 }
5846 release_region(CDo_command,4);
5847 blk_cleanup_queue(sbpcd_queue);
5848 return -EIO;
5849 }
5850#ifdef MODULE
5851 msg(DBG_INF,"data buffer size: %d frames.\n",buffers);
5852#endif
5853 if (p->sbp_audsiz>0)
5854 {
5855 p->aud_buf=(u_char *) vmalloc(p->sbp_audsiz*CD_FRAMESIZE_RAW);
5856 if (p->aud_buf==NULL) msg(DBG_INF,"audio buffer (%d frames) not available.\n",p->sbp_audsiz);
5857 else msg(DBG_INF,"audio buffer size: %d frames.\n",p->sbp_audsiz);
5858 }
5859 sbpcd_infop = vmalloc(sizeof (struct cdrom_device_info));
5860 if (sbpcd_infop == NULL)
5861 {
5862 release_region(CDo_command,4);
5863 blk_cleanup_queue(sbpcd_queue);
5864 return -ENOMEM;
5865 }
5866 memset(sbpcd_infop, 0, sizeof(struct cdrom_device_info));
5867 sbpcd_infop->ops = &sbpcd_dops;
5868 sbpcd_infop->speed = 2;
5869 sbpcd_infop->capacity = 1;
5870 sprintf(sbpcd_infop->name, "sbpcd%d", j);
5871 sbpcd_infop->handle = p;
5872 p->sbpcd_infop = sbpcd_infop;
5873 disk = alloc_disk(1);
5874 disk->major = MAJOR_NR;
5875 disk->first_minor = j;
5876 disk->fops = &sbpcd_bdops;
5877 strcpy(disk->disk_name, sbpcd_infop->name);
5878 disk->flags = GENHD_FL_CD;
5879 sprintf(disk->devfs_name, "sbp/c0t%d", p->drv_id);
5880 p->disk = disk;
5881 if (register_cdrom(sbpcd_infop))
5882 {
5883 printk(" sbpcd: Unable to register with Uniform CD-ROm driver\n");
5884 }
5885 disk->private_data = p;
5886 disk->queue = sbpcd_queue;
5887 add_disk(disk);
5888 }
5889 blk_queue_hardsect_size(sbpcd_queue, CD_FRAMESIZE);
5890
5891#ifndef MODULE
5892 init_done:
5893#endif
5894 return 0;
5895}
5896
5897#ifdef MODULE
5898void sbpcd_exit(void)
5899{
5900 int j;
5901
5902 if ((unregister_blkdev(MAJOR_NR, major_name) == -EINVAL))
5903 {
5904 msg(DBG_INF, "What's that: can't unregister %s.\n", major_name);
5905 return;
5906 }
5907 release_region(CDo_command,4);
5908 blk_cleanup_queue(sbpcd_queue);
5909 for (j=0;j<NR_SBPCD;j++)
5910 {
5911 if (D_S[j].drv_id==-1) continue;
5912 del_gendisk(D_S[j].disk);
5913 put_disk(D_S[j].disk);
5914 devfs_remove("sbp/c0t%d", j);
5915 vfree(D_S[j].sbp_buf);
5916 if (D_S[j].sbp_audsiz>0) vfree(D_S[j].aud_buf);
5917 if ((unregister_cdrom(D_S[j].sbpcd_infop) == -EINVAL))
5918 {
5919 msg(DBG_INF, "What's that: can't unregister info %s.\n", major_name);
5920 return;
5921 }
5922 vfree(D_S[j].sbpcd_infop);
5923 }
5924 devfs_remove("sbp");
5925 msg(DBG_INF, "%s module released.\n", major_name);
5926}
5927
5928
5929module_init(__sbpcd_init) ;
5930module_exit(sbpcd_exit);
5931
5932
5933#endif
5934static int sbpcd_media_changed(struct cdrom_device_info *cdi, int disc_nr)
5935{
5936 struct sbpcd_drive *p = cdi->handle;
5937 msg(DBG_CHK,"media_check (%s) called\n", cdi->name);
5938
5939 if (p->CD_changed==0xFF)
5940 {
5941 p->CD_changed=0;
5942 msg(DBG_CHK,"medium changed (drive %s)\n", cdi->name);
5943 current_drive->diskstate_flags &= ~toc_bit;
5944
5945 current_drive->diskstate_flags &= ~cd_size_bit;
5946#ifdef SAFE_MIXED
5947 current_drive->has_data=0;
5948#endif
5949
5950 return (1);
5951 }
5952 else
5953 return (0);
5954}
5955
5956MODULE_LICENSE("GPL");
5957
5958
5959MODULE_ALIAS_BLOCKDEV_MAJOR(MATSUSHITA_CDROM_MAJOR);
5960
5961
5962
5963
5964
5965
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979