This source file includes following definitions.
- cdrom_in_bytes
- cdrom_out_bytes
- cdrom_analyze_sense_data
- restore_request
- cdrom_queue_request_sense
- cdrom_end_request
- cdrom_saw_media_change
- cdrom_decode_status
- cdrom_start_packet_command
- cdrom_transfer_packet_command
- cdrom_buffer_sectors
- cdrom_read_check_ireason
- cdrom_read_intr
- cdrom_read_from_buffer
- cdrom_start_read_continuation
- cdrom_start_read
- cdrom_pc_intr
- cdrom_do_pc_continuation
- cdrom_do_packet_command
- cdrom_sleep
- cdrom_queue_packet_command
- cdrom_do_drive_cmd
- ide_do_rw_cdrom
- bin2bcd
- bcd2bin
- lba_to_msf
- msf_to_lba
- cdrom_check_status
- cdrom_lockdoor
- cdrom_eject
- cdrom_pause
- cdrom_startstop
- cdrom_read_capacity
- cdrom_read_tocentry
- cdrom_read_toc
- cdrom_read_subchannel
- cdrom_mode_sense
- cdrom_mode_select
- cdrom_play_lba_range_play12
- cdrom_play_lba_range_msf
- cdrom_play_lba_range_1
- cdrom_play_lba_range
- cdrom_get_toc_entry
- cdrom_read_block
- ide_cdrom_ioctl
- ide_cdrom_check_media_change
- ide_cdrom_open
- ide_cdrom_release
- ide_cdrom_setup
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104 #include <linux/types.h>
105 #include <linux/kernel.h>
106 #include <linux/delay.h>
107 #include <linux/timer.h>
108 #include <linux/malloc.h>
109 #include <linux/ioport.h>
110 #include <linux/interrupt.h>
111 #include <linux/blkdev.h>
112 #include <linux/errno.h>
113 #include <linux/hdreg.h>
114 #include <linux/cdrom.h>
115 #include <asm/irq.h>
116 #include <asm/io.h>
117 #include <asm/byteorder.h>
118 #include <asm/segment.h>
119 #ifdef __alpha__
120 # include <asm/unaligned.h>
121 #endif
122
123 #include "ide.h"
124
125
126
127
128
129
130
131 #ifndef VERBOSE_IDE_CD_ERRORS
132 #define VERBOSE_IDE_CD_ERRORS 0
133 #endif
134
135
136
137
138
139
140 #ifndef STANDARD_ATAPI
141 #define STANDARD_ATAPI 0
142 #endif
143
144
145
146
147
148 #ifndef NO_DOOR_LOCKING
149 #define NO_DOOR_LOCKING 0
150 #endif
151
152
153
154
155 #define SECTOR_SIZE 512
156 #define SECTOR_BITS 9
157 #define SECTORS_PER_FRAME (CD_FRAMESIZE / SECTOR_SIZE)
158
159 #define MIN(a,b) ((a) < (b) ? (a) : (b))
160
161
162 #define PACKET_COMMAND 4315
163 #define REQUEST_SENSE_COMMAND 4316
164 #define RESET_DRIVE_COMMAND 4317
165
166
167
168 #define TEST_UNIT_READY 0x00
169 #define REQUEST_SENSE 0x03
170 #define START_STOP 0x1b
171 #define ALLOW_MEDIUM_REMOVAL 0x1e
172 #define READ_CAPACITY 0x25
173 #define READ_10 0x28
174 #define MODE_SENSE_10 0x5a
175 #define MODE_SELECT_10 0x55
176 #define READ_CD 0xbe
177
178
179
180
181 #define NO_SENSE 0x00
182 #define RECOVERED_ERROR 0x01
183 #define NOT_READY 0x02
184 #define MEDIUM_ERROR 0x03
185 #define HARDWARE_ERROR 0x04
186 #define ILLEGAL_REQUEST 0x05
187 #define UNIT_ATTENTION 0x06
188 #define DATA_PROTECT 0x07
189 #define ABORTED_COMMAND 0x0b
190 #define MISCOMPARE 0x0e
191
192
193
194
195
196
197
198
199 struct ide_cd_config_flags {
200 __u8 drq_interrupt : 1;
201
202 __u8 no_doorlock : 1;
203 #if ! STANDARD_ATAPI
204 __u8 no_playaudio12: 1;
205
206 __u8 no_lba_toc : 1;
207 __u8 playmsf_uses_bcd : 1;
208 __u8 old_readcd : 1;
209 __u8 vertos_lossage: 1;
210
211 #endif
212 __u8 reserved : 1;
213 };
214 #define CDROM_CONFIG_FLAGS(drive) ((struct ide_cd_config_flags *)&((drive)->bios_sect))
215
216
217
218
219 struct ide_cd_state_flags {
220 __u8 media_changed : 1;
221 __u8 toc_valid : 1;
222 __u8 door_locked : 1;
223 __u8 eject_on_close: 1;
224 __u8 reserved : 4;
225 };
226 #define CDROM_STATE_FLAGS(drive) ((struct ide_cd_state_flags *)&((drive)->bios_head))
227
228
229 #define SECTOR_BUFFER_SIZE CD_FRAMESIZE
230
231
232
233
234
235
236
237
238
239
240
241
242
243 static inline
244 void cdrom_in_bytes (ide_drive_t *drive, void *buffer, uint bytecount)
245 {
246 ++bytecount;
247 ide_input_data (drive, buffer, bytecount / 4);
248 if ((bytecount & 0x03) >= 2)
249 {
250 insw (IDE_DATA_REG, ((byte *)buffer) + (bytecount & ~0x03), 1);
251 }
252 }
253
254
255 static inline
256 void cdrom_out_bytes (ide_drive_t *drive, void *buffer, uint bytecount)
257 {
258 ++bytecount;
259 ide_output_data (drive, buffer, bytecount / 4);
260 if ((bytecount & 0x03) >= 2)
261 {
262 outsw (IDE_DATA_REG, ((byte *)buffer) + (bytecount & ~0x03), 1);
263 }
264 }
265
266
267
268
269
270
271
272 #define ARY_LEN(a) ((sizeof(a) / sizeof(a[0])))
273
274 #if VERBOSE_IDE_CD_ERRORS
275
276
277
278 char *sense_key_texts[16] = {
279 "No sense data",
280 "Recovered error",
281 "Not ready",
282 "Medium error",
283 "Hardware error",
284 "Illegal request",
285 "Unit attention",
286 "Data protect",
287 "(reserved)",
288 "(reserved)",
289 "(reserved)",
290 "Aborted command",
291 "(reserved)",
292 "(reserved)",
293 "Miscompare",
294 "(reserved)",
295 };
296
297
298
299
300 struct {
301 short asc_ascq;
302 char *text;
303 } sense_data_texts[] = {
304 { 0x0000, "No additional sense information" },
305 { 0x0011, "Audio play operation in progress" },
306 { 0x0012, "Audio play operation paused" },
307 { 0x0013, "Audio play operation successfully completed" },
308 { 0x0014, "Audio play operation stopped due to error" },
309 { 0x0015, "No current audio status to return" },
310
311 { 0x0200, "No seek complete" },
312
313 { 0x0400, "Logical unit not ready - cause not reportable" },
314 { 0x0401, "Logical unit not ready - in progress (sic) of becoming ready" },
315 { 0x0402, "Logical unit not ready - initializing command required" },
316 { 0x0403, "Logical unit not ready - manual intervention required" },
317
318 { 0x0600, "No reference position found" },
319
320 { 0x0900, "Track following error" },
321 { 0x0901, "Tracking servo failure" },
322 { 0x0902, "Focus servo failure" },
323 { 0x0903, "Spindle servo failure" },
324
325 { 0x1100, "Unrecovered read error" },
326 { 0x1106, "CIRC unrecovered error" },
327
328 { 0x1500, "Random positioning error" },
329 { 0x1501, "Mechanical positioning error" },
330 { 0x1502, "Positioning error detected by read of medium" },
331
332 { 0x1700, "Recovered data with no error correction applied" },
333 { 0x1701, "Recovered data with retries" },
334 { 0x1702, "Recovered data with positive head offset" },
335 { 0x1703, "Recovered data with negative head offset" },
336 { 0x1704, "Recovered data with retries and/or CIRC applied" },
337 { 0x1705, "Recovered data using previous sector ID" },
338
339 { 0x1800, "Recovered data with error correction applied" },
340 { 0x1801, "Recovered data with error correction and retries applied" },
341 { 0x1802, "Recovered data - the data was auto-reallocated" },
342 { 0x1803, "Recovered data with CIRC" },
343 { 0x1804, "Recovered data with L-EC" },
344 { 0x1805, "Recovered data - recommend reassignment" },
345 { 0x1806, "Recovered data - recommend rewrite" },
346
347 { 0x1a00, "Parameter list length error" },
348
349 { 0x2000, "Invalid command operation code" },
350
351 { 0x2100, "Logical block address out of range" },
352
353 { 0x2400, "Invalid field in command packet" },
354
355 { 0x2600, "Invalid field in parameter list" },
356 { 0x2601, "Parameter not supported" },
357 { 0x2602, "Parameter value invalid" },
358 { 0x2603, "Threshold parameters not supported" },
359
360 { 0x2800, "Not ready to ready transition, medium may have changed" },
361
362 { 0x2900, "Power on, reset or bus device reset occurred" },
363
364 { 0x2a00, "Parameters changed" },
365 { 0x2a01, "Mode parameters changed" },
366
367 { 0x3000, "Incompatible medium installed" },
368 { 0x3001, "Cannot read medium - unknown format" },
369 { 0x3002, "Cannot read medium - incompatible format" },
370
371 { 0x3700, "Rounded parameter" },
372
373 { 0x3900, "Saving parameters not supported" },
374
375 { 0x3a00, "Medium not present" },
376
377 { 0x3f00, "ATAPI CD-ROM drive operating conditions have changed" },
378 { 0x3f01, "Microcode has been changed" },
379 { 0x3f02, "Changed operating definition" },
380 { 0x3f03, "Inquiry data has changed" },
381
382 { 0x4000, "Diagnostic failure on component (ASCQ)" },
383
384 { 0x4400, "Internal ATAPI CD-ROM drive failure" },
385
386 { 0x4e00, "Overlapped commands attempted" },
387
388 { 0x5300, "Media load or eject failed" },
389 { 0x5302, "Medium removal prevented" },
390
391 { 0x5700, "Unable to recover table of contents" },
392
393 { 0x5a00, "Operator request or state change input (unspecified)" },
394 { 0x5a01, "Operator medium removal request" },
395
396 { 0x5b00, "Threshold condition met" },
397
398 { 0x5c00, "Status change" },
399
400 { 0x6300, "End of user area encountered on this track" },
401
402 { 0x6400, "Illegal mode for this track" },
403
404 { 0xbf00, "Loss of streaming" },
405 };
406 #endif
407
408
409
410
411
412
413
414
415 static
416 void cdrom_analyze_sense_data (ide_drive_t *drive,
417 struct atapi_request_sense *reqbuf,
418 struct packet_command *failed_command)
419 {
420
421
422
423 if (failed_command &&
424 failed_command->c[0] == SCMD_READ_SUBCHANNEL &&
425 (reqbuf->sense_key == NOT_READY || reqbuf->sense_key == UNIT_ATTENTION))
426 return;
427
428 #if VERBOSE_IDE_CD_ERRORS
429 {
430 int i;
431 char *s;
432 char buf[80];
433
434 printk ("ATAPI device %s:\n", drive->name);
435
436 printk (" Error code: 0x%02x\n", reqbuf->error_code);
437
438 if (reqbuf->sense_key >= 0 &&
439 reqbuf->sense_key < ARY_LEN (sense_key_texts))
440 s = sense_key_texts[reqbuf->sense_key];
441 else
442 s = "(bad sense key)";
443
444 printk (" Sense key: 0x%02x - %s\n", reqbuf->sense_key, s);
445
446 if (reqbuf->asc == 0x40) {
447 sprintf (buf, "Diagnostic failure on component 0x%02x", reqbuf->ascq);
448 s = buf;
449 }
450
451 else {
452 int lo, hi;
453 int key = (reqbuf->asc << 8);
454 if ( ! (reqbuf->ascq >= 0x80 && reqbuf->ascq <= 0xdd) )
455 key |= reqbuf->ascq;
456
457 lo = 0;
458 hi = ARY_LEN (sense_data_texts);
459 s = NULL;
460
461 while (hi > lo) {
462 int mid = (lo + hi) / 2;
463 if (sense_data_texts[mid].asc_ascq == key) {
464 s = sense_data_texts[mid].text;
465 break;
466 }
467 else if (sense_data_texts[mid].asc_ascq > key)
468 hi = mid;
469 else
470 lo = mid+1;
471 }
472 }
473
474 if (s == NULL) {
475 if (reqbuf->asc > 0x80)
476 s = "(vendor-specific error)";
477 else
478 s = "(reserved error code)";
479 }
480
481 printk (" Additional sense data: 0x%02x, 0x%02x - %s\n",
482 reqbuf->asc, reqbuf->ascq, s);
483
484 if (failed_command != NULL) {
485 printk (" Failed packet command: ");
486 for (i=0; i<sizeof (failed_command->c); i++)
487 printk ("%02x ", failed_command->c[i]);
488 printk ("\n");
489 }
490
491 if (reqbuf->sense_key == ILLEGAL_REQUEST &&
492 (reqbuf->sense_key_specific[0] & 0x80) != 0)
493 {
494 printk (" Error in %s byte %d",
495 (reqbuf->sense_key_specific[0] & 0x40) != 0
496 ? "command packet"
497 : "command data",
498 (reqbuf->sense_key_specific[1] << 8) +
499 reqbuf->sense_key_specific[2]);
500
501 if ((reqbuf->sense_key_specific[0] & 0x40) != 0)
502 {
503 printk (" bit %d", reqbuf->sense_key_specific[0] & 0x07);
504 }
505
506 printk ("\n");
507 }
508 }
509
510 #else
511
512
513
514
515 if (reqbuf->sense_key == UNIT_ATTENTION ||
516 (reqbuf->sense_key == NOT_READY && (reqbuf->asc == 4 ||
517 reqbuf->asc == 0x3a)))
518 return;
519
520 printk ("%s: code: 0x%02x key: 0x%02x asc: 0x%02x ascq: 0x%02x\n",
521 drive->name,
522 reqbuf->error_code, reqbuf->sense_key, reqbuf->asc, reqbuf->ascq);
523 #endif
524 }
525
526
527
528
529 static void restore_request (struct request *rq)
530 {
531 if (rq->buffer != rq->bh->b_data)
532 {
533 int n = (rq->buffer - rq->bh->b_data) / SECTOR_SIZE;
534 rq->buffer = rq->bh->b_data;
535 rq->nr_sectors += n;
536 rq->sector -= n;
537 }
538 rq->current_nr_sectors = rq->bh->b_size >> SECTOR_BITS;
539 }
540
541
542 static void cdrom_queue_request_sense (ide_drive_t *drive,
543 struct semaphore *sem,
544 struct atapi_request_sense *reqbuf,
545 struct packet_command *failed_command)
546 {
547 struct request *rq;
548 struct packet_command *pc;
549 int len;
550
551
552
553 if (reqbuf == NULL)
554 reqbuf = &drive->cdrom_info.sense_data;
555
556
557
558 pc = &HWIF(drive)->request_sense_pc;
559 memset (pc, 0, sizeof (*pc));
560
561
562
563
564
565 len = sizeof (*reqbuf) / 4;
566 len *= 4;
567
568 pc->c[0] = REQUEST_SENSE;
569 pc->c[4] = len;
570 pc->buffer = (char *)reqbuf;
571 pc->buflen = len;
572 pc->sense_data = (struct atapi_request_sense *)failed_command;
573
574
575
576 rq = &HWIF(drive)->request_sense_request;
577 ide_init_drive_cmd (rq);
578 rq->cmd = REQUEST_SENSE_COMMAND;
579 rq->buffer = (char *)pc;
580 rq->sem = sem;
581 (void) ide_do_drive_cmd (drive, rq, ide_preempt);
582 }
583
584
585 static void cdrom_end_request (int uptodate, ide_drive_t *drive)
586 {
587 struct request *rq = HWGROUP(drive)->rq;
588
589
590
591 if (!uptodate && rq->bh != 0)
592 {
593 int adj = rq->current_nr_sectors - 1;
594 rq->current_nr_sectors -= adj;
595 rq->sector += adj;
596 }
597
598 if (rq->cmd == REQUEST_SENSE_COMMAND && uptodate)
599 {
600 struct packet_command *pc = (struct packet_command *)rq->buffer;
601 cdrom_analyze_sense_data (drive,
602 (struct atapi_request_sense *)(pc->buffer - pc->c[4]),
603 (struct packet_command *)pc->sense_data);
604 }
605
606 ide_end_request (uptodate, HWGROUP(drive));
607 }
608
609
610
611
612 static void cdrom_saw_media_change (ide_drive_t *drive)
613 {
614 CDROM_STATE_FLAGS (drive)->media_changed = 1;
615 CDROM_STATE_FLAGS (drive)->toc_valid = 0;
616 drive->cdrom_info.nsectors_buffered = 0;
617 }
618
619
620
621
622 static int cdrom_decode_status (ide_drive_t *drive, int good_stat, int *stat_ret)
623 {
624 struct request *rq = HWGROUP(drive)->rq;
625 int stat, err, sense_key, cmd;
626
627
628 stat = GET_STAT();
629 *stat_ret = stat;
630
631 if (OK_STAT (stat, good_stat, BAD_R_STAT))
632 return 0;
633
634
635 err = IN_BYTE (IDE_ERROR_REG);
636 sense_key = err >> 4;
637
638 if (rq == NULL)
639 printk ("%s : missing request in cdrom_decode_status\n", drive->name);
640 else
641 {
642 cmd = rq->cmd;
643
644 if (cmd == REQUEST_SENSE_COMMAND)
645 {
646
647
648
649
650 struct packet_command *pc = (struct packet_command *)rq->buffer;
651 pc->stat = 1;
652 cdrom_end_request (1, drive);
653 ide_error (drive, "request sense failure", stat);
654 return 1;
655 }
656
657 else if (cmd == PACKET_COMMAND)
658 {
659
660
661 struct packet_command *pc = (struct packet_command *)rq->buffer;
662 struct semaphore *sem = NULL;
663
664
665 if (sense_key == NOT_READY)
666 {
667 cdrom_saw_media_change (drive);
668
669
670
671
672
673
674 if (pc->c[0] != SCMD_READ_SUBCHANNEL)
675 printk ("%s : tray open or drive not ready\n", drive->name);
676 }
677
678
679 else if (sense_key == UNIT_ATTENTION)
680 {
681 cdrom_saw_media_change (drive);
682 printk ("%s: media changed\n", drive->name);
683 }
684
685
686 else
687 {
688 ide_dump_status (drive, "packet command error", stat);
689 }
690
691
692
693
694
695
696
697
698
699 if ((stat & ERR_STAT) != 0)
700 {
701 sem = rq->sem;
702 rq->sem = NULL;
703 }
704
705 pc->stat = 1;
706 cdrom_end_request (1, drive);
707
708 if ((stat & ERR_STAT) != 0)
709 cdrom_queue_request_sense (drive, sem, pc->sense_data, pc);
710 }
711
712 else
713 {
714
715
716
717 if (sense_key == NOT_READY)
718 {
719 cdrom_saw_media_change (drive);
720
721
722 printk ("%s : tray open\n", drive->name);
723 cdrom_end_request (0, drive);
724 }
725
726
727 else if (sense_key == UNIT_ATTENTION)
728 {
729 cdrom_saw_media_change (drive);
730
731
732
733 if (++rq->errors > ERROR_MAX)
734 {
735 cdrom_end_request (0, drive);
736 }
737 }
738
739
740 else if (sense_key == ILLEGAL_REQUEST || sense_key == DATA_PROTECT)
741 {
742 ide_dump_status (drive, "command error", stat);
743 cdrom_end_request (0, drive);
744 }
745
746
747 else if ((err & ~ABRT_ERR) != 0)
748 {
749 ide_error (drive, "cdrom_decode_status", stat);
750 return 1;
751 }
752
753
754 else if ((++rq->errors > ERROR_MAX))
755 {
756 cdrom_end_request (0, drive);
757 }
758
759
760
761 if ((stat & ERR_STAT) != 0)
762 cdrom_queue_request_sense (drive, NULL, NULL, NULL);
763 }
764 }
765
766
767 return 1;
768 }
769
770
771
772
773
774
775
776
777
778 static int cdrom_start_packet_command (ide_drive_t *drive, int xferlen,
779 ide_handler_t *handler)
780 {
781
782 if (ide_wait_stat (drive, 0, BUSY_STAT, WAIT_READY)) return 1;
783
784
785 OUT_BYTE (0, IDE_FEATURE_REG);
786 OUT_BYTE (0, IDE_NSECTOR_REG);
787 OUT_BYTE (0, IDE_SECTOR_REG);
788
789 OUT_BYTE (xferlen & 0xff, IDE_LCYL_REG);
790 OUT_BYTE (xferlen >> 8 , IDE_HCYL_REG);
791 OUT_BYTE (drive->ctl, IDE_CONTROL_REG);
792
793 if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt)
794 {
795 ide_set_handler (drive, handler, WAIT_CMD);
796 OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG);
797 }
798 else
799 {
800 OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG);
801 (*handler) (drive);
802 }
803
804 return 0;
805 }
806
807
808
809
810
811
812
813 static int cdrom_transfer_packet_command (ide_drive_t *drive,
814 char *cmd_buf, int cmd_len,
815 ide_handler_t *handler)
816 {
817 if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt)
818 {
819
820
821 int stat_dum;
822
823
824 if (cdrom_decode_status (drive, DRQ_STAT, &stat_dum)) return 1;
825 }
826 else
827 {
828
829 if (ide_wait_stat (drive, DRQ_STAT, BUSY_STAT, WAIT_READY)) return 1;
830 }
831
832
833 ide_set_handler (drive, handler, WAIT_CMD);
834
835
836 cdrom_out_bytes (drive, cmd_buf, cmd_len);
837
838 return 0;
839 }
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854 static void cdrom_buffer_sectors (ide_drive_t *drive, unsigned long sector,
855 int sectors_to_transfer)
856 {
857 struct cdrom_info *info = &drive->cdrom_info;
858
859
860 int sectors_to_buffer = MIN (sectors_to_transfer,
861 (SECTOR_BUFFER_SIZE >> SECTOR_BITS) -
862 info->nsectors_buffered);
863
864 char *dest;
865
866
867
868
869 if (info->sector_buffer == NULL)
870 {
871 info->sector_buffer = (char *) kmalloc (SECTOR_BUFFER_SIZE, GFP_ATOMIC);
872
873
874 if (info->sector_buffer == NULL)
875 sectors_to_buffer = 0;
876 }
877
878
879 if (info->nsectors_buffered == 0)
880 info->sector_buffered = sector;
881
882
883 dest = info->sector_buffer + info->nsectors_buffered * SECTOR_SIZE;
884 while (sectors_to_buffer > 0)
885 {
886 cdrom_in_bytes (drive, dest, SECTOR_SIZE);
887 --sectors_to_buffer;
888 --sectors_to_transfer;
889 ++info->nsectors_buffered;
890 dest += SECTOR_SIZE;
891 }
892
893
894 while (sectors_to_transfer > 0)
895 {
896 char dum[SECTOR_SIZE];
897 cdrom_in_bytes (drive, dum, sizeof (dum));
898 --sectors_to_transfer;
899 }
900 }
901
902
903
904
905
906
907
908 static inline
909 int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason)
910 {
911 ireason &= 3;
912 if (ireason == 2) return 0;
913
914 if (ireason == 0)
915 {
916
917 printk ("%s: cdrom_read_intr: "
918 "Drive wants to transfer data the wrong way!\n",
919 drive->name);
920
921
922
923 while (len > 0)
924 {
925 int dum = 0;
926 cdrom_out_bytes (drive, &dum, sizeof (dum));
927 len -= sizeof (dum);
928 }
929 }
930
931 else
932 {
933
934 printk ("%s: cdrom_read_intr: bad interrupt reason %d\n",
935 drive->name, ireason);
936 }
937
938 cdrom_end_request (0, drive);
939 return -1;
940 }
941
942
943
944
945
946 static void cdrom_read_intr (ide_drive_t *drive)
947 {
948 int stat;
949 int ireason, len, sectors_to_transfer, nskip;
950
951 struct request *rq = HWGROUP(drive)->rq;
952
953
954 if (cdrom_decode_status (drive, 0, &stat)) return;
955
956
957 ireason = IN_BYTE (IDE_NSECTOR_REG);
958 len = IN_BYTE (IDE_LCYL_REG) + 256 * IN_BYTE (IDE_HCYL_REG);
959
960
961 if ((stat & DRQ_STAT) == 0)
962 {
963
964
965 if (rq->current_nr_sectors > 0)
966 {
967 printk ("%s: cdrom_read_intr: data underrun (%ld blocks)\n",
968 drive->name, rq->current_nr_sectors);
969 cdrom_end_request (0, drive);
970 }
971 else
972 cdrom_end_request (1, drive);
973
974 return;
975 }
976
977
978 if (cdrom_read_check_ireason (drive, len, ireason)) return;
979
980
981
982 if ((len % SECTOR_SIZE) != 0)
983 {
984 printk ("%s: cdrom_read_intr: Bad transfer size %d\n",
985 drive->name, len);
986 printk (" This drive is not supported by this version of the driver\n");
987 cdrom_end_request (0, drive);
988 return;
989 }
990
991
992 sectors_to_transfer = len / SECTOR_SIZE;
993
994
995 nskip = MIN ((int)(rq->current_nr_sectors - (rq->bh->b_size >> SECTOR_BITS)),
996 sectors_to_transfer);
997
998 while (nskip > 0)
999 {
1000
1001 char dum[SECTOR_SIZE];
1002 cdrom_in_bytes (drive, dum, sizeof (dum));
1003
1004 --rq->current_nr_sectors;
1005 --nskip;
1006 --sectors_to_transfer;
1007 }
1008
1009
1010 while (sectors_to_transfer > 0)
1011 {
1012 int this_transfer;
1013
1014
1015
1016 if (rq->current_nr_sectors == 0 &&
1017 rq->nr_sectors > 0)
1018 cdrom_end_request (1, drive);
1019
1020
1021
1022 if (rq->current_nr_sectors == 0)
1023 {
1024 cdrom_buffer_sectors (drive, rq->sector, sectors_to_transfer);
1025 sectors_to_transfer = 0;
1026 }
1027 else
1028 {
1029
1030
1031
1032 this_transfer = MIN (sectors_to_transfer,
1033 rq->current_nr_sectors);
1034
1035
1036 while (this_transfer > 0)
1037 {
1038 cdrom_in_bytes (drive, rq->buffer, SECTOR_SIZE);
1039 rq->buffer += SECTOR_SIZE;
1040 --rq->nr_sectors;
1041 --rq->current_nr_sectors;
1042 ++rq->sector;
1043 --this_transfer;
1044 --sectors_to_transfer;
1045 }
1046 }
1047 }
1048
1049
1050
1051 ide_set_handler (drive, &cdrom_read_intr, WAIT_CMD);
1052 }
1053
1054
1055
1056
1057
1058
1059 static int cdrom_read_from_buffer (ide_drive_t *drive)
1060 {
1061 struct cdrom_info *info = &drive->cdrom_info;
1062 struct request *rq = HWGROUP(drive)->rq;
1063
1064
1065 if (info->sector_buffer == NULL) return 0;
1066
1067
1068
1069 while (rq->nr_sectors > 0 &&
1070 rq->sector >= info->sector_buffered &&
1071 rq->sector < info->sector_buffered + info->nsectors_buffered)
1072 {
1073 if (rq->current_nr_sectors == 0)
1074 cdrom_end_request (1, drive);
1075
1076 memcpy (rq->buffer,
1077 info->sector_buffer +
1078 (rq->sector - info->sector_buffered) * SECTOR_SIZE,
1079 SECTOR_SIZE);
1080 rq->buffer += SECTOR_SIZE;
1081 --rq->current_nr_sectors;
1082 --rq->nr_sectors;
1083 ++rq->sector;
1084 }
1085
1086
1087 if (rq->nr_sectors == 0)
1088 {
1089 cdrom_end_request (1, drive);
1090 return -1;
1091 }
1092
1093
1094 if (rq->current_nr_sectors == 0)
1095 cdrom_end_request (1, drive);
1096
1097
1098
1099
1100
1101 if (rq->current_nr_sectors < (rq->bh->b_size >> SECTOR_BITS) &&
1102 (rq->sector % SECTORS_PER_FRAME) != 0)
1103 {
1104 printk ("%s: cdrom_read_from_buffer: buffer botch (%ld)\n",
1105 drive->name, rq->sector);
1106 cdrom_end_request (0, drive);
1107 return -1;
1108 }
1109
1110 return 0;
1111 }
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121 static void cdrom_start_read_continuation (ide_drive_t *drive)
1122 {
1123 struct packet_command pc;
1124 struct request *rq = HWGROUP(drive)->rq;
1125
1126 int nsect, sector, nframes, frame, nskip;
1127
1128
1129 nsect = rq->nr_sectors;
1130
1131
1132 sector = rq->sector;
1133
1134
1135
1136
1137
1138
1139
1140 nskip = (sector % SECTORS_PER_FRAME);
1141 if (nskip > 0)
1142 {
1143
1144 if (rq->current_nr_sectors != (rq->bh->b_size >> SECTOR_BITS))
1145 {
1146 printk ("%s: cdrom_start_read_continuation: buffer botch (%ld)\n",
1147 drive->name, rq->current_nr_sectors);
1148 cdrom_end_request (0, drive);
1149 return;
1150 }
1151
1152 sector -= nskip;
1153 nsect += nskip;
1154 rq->current_nr_sectors += nskip;
1155 }
1156
1157
1158
1159 nframes = (nsect + SECTORS_PER_FRAME-1) / SECTORS_PER_FRAME;
1160 frame = sector / SECTORS_PER_FRAME;
1161
1162
1163 nframes = MIN (nframes, 65535);
1164
1165
1166 memset (&pc.c, 0, sizeof (pc.c));
1167 pc.c[0] = READ_10;
1168 pc.c[7] = (nframes >> 8);
1169 pc.c[8] = (nframes & 0xff);
1170 #ifdef __alpha__
1171 stl_u (htonl (frame), (unsigned int *) &pc.c[2]);
1172 #else
1173 *(int *)(&pc.c[2]) = htonl (frame);
1174 #endif
1175
1176
1177 (void) cdrom_transfer_packet_command (drive, pc.c, sizeof (pc.c),
1178 &cdrom_read_intr);
1179 }
1180
1181
1182
1183
1184
1185 static void cdrom_start_read (ide_drive_t *drive, unsigned int block)
1186 {
1187 struct request *rq = HWGROUP(drive)->rq;
1188 int minor = MINOR (rq->rq_dev);
1189
1190
1191
1192 if ((minor & PARTN_MASK) != 0) {
1193 rq->sector = block;
1194 minor &= ~PARTN_MASK;
1195 rq->rq_dev = MKDEV (MAJOR(rq->rq_dev), minor);
1196 }
1197
1198
1199
1200 restore_request (rq);
1201
1202
1203 if (cdrom_read_from_buffer (drive))
1204 return;
1205
1206
1207 drive->cdrom_info.nsectors_buffered = 0;
1208
1209
1210 cdrom_start_packet_command (drive, 32768, cdrom_start_read_continuation);
1211 }
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221 static int
1222 cdrom_lockdoor (ide_drive_t *drive, int lockflag,
1223 struct atapi_request_sense *reqbuf);
1224
1225
1226
1227
1228 static void cdrom_pc_intr (ide_drive_t *drive)
1229 {
1230 int ireason, len, stat, thislen;
1231 struct request *rq = HWGROUP(drive)->rq;
1232 struct packet_command *pc = (struct packet_command *)rq->buffer;
1233
1234
1235 if (cdrom_decode_status (drive, 0, &stat)) return;
1236
1237
1238 ireason = IN_BYTE (IDE_NSECTOR_REG);
1239 len = IN_BYTE (IDE_LCYL_REG) + 256 * IN_BYTE (IDE_HCYL_REG);
1240
1241
1242
1243 if ((stat & DRQ_STAT) == 0)
1244 {
1245
1246
1247 if (pc->c[0] == REQUEST_SENSE && pc->buflen > 0 && pc->buflen <= 5) {
1248 while (pc->buflen > 0) {
1249 *pc->buffer++ = 0;
1250 --pc->buflen;
1251 }
1252 }
1253
1254 if (pc->buflen == 0)
1255 cdrom_end_request (1, drive);
1256 else
1257 {
1258 printk ("%s: cdrom_pc_intr: data underrun %d\n",
1259 drive->name, pc->buflen);
1260 pc->stat = 1;
1261 cdrom_end_request (1, drive);
1262 }
1263 return;
1264 }
1265
1266
1267 thislen = pc->buflen;
1268 if (thislen < 0) thislen = -thislen;
1269 if (thislen > len) thislen = len;
1270
1271
1272 if ((ireason & 3) == 0)
1273 {
1274
1275 if (pc->buflen > 0)
1276 {
1277 printk ("%s: cdrom_pc_intr: Drive wants to transfer data the wrong way!\n",
1278 drive->name);
1279 pc->stat = 1;
1280 thislen = 0;
1281 }
1282
1283
1284 cdrom_out_bytes (drive, pc->buffer, thislen);
1285
1286
1287
1288 while (len > thislen)
1289 {
1290 int dum = 0;
1291 cdrom_out_bytes (drive, &dum, sizeof (dum));
1292 len -= sizeof (dum);
1293 }
1294
1295
1296 pc->buffer += thislen;
1297 pc->buflen += thislen;
1298 }
1299
1300
1301 else if ((ireason & 3) == 2)
1302 {
1303
1304 if (pc->buflen < 0)
1305 {
1306 printk ("%s: cdrom_pc_intr: Drive wants to transfer data the wrong way!\n",
1307 drive->name);
1308 pc->stat = 1;
1309 thislen = 0;
1310 }
1311
1312
1313 cdrom_in_bytes (drive, pc->buffer, thislen);
1314
1315
1316
1317 while (len > thislen)
1318 {
1319 int dum = 0;
1320 cdrom_in_bytes (drive, &dum, sizeof (dum));
1321 len -= sizeof (dum);
1322 }
1323
1324
1325 pc->buffer += thislen;
1326 pc->buflen -= thislen;
1327 }
1328
1329 else
1330 {
1331 printk ("%s: cdrom_pc_intr: The drive appears confused (ireason = 0x%2x)\n",
1332 drive->name, ireason);
1333 pc->stat = 1;
1334 }
1335
1336
1337 ide_set_handler (drive, &cdrom_pc_intr, WAIT_CMD);
1338 }
1339
1340
1341 static void cdrom_do_pc_continuation (ide_drive_t *drive)
1342 {
1343 struct request *rq = HWGROUP(drive)->rq;
1344 struct packet_command *pc = (struct packet_command *)rq->buffer;
1345
1346
1347 cdrom_transfer_packet_command (drive, pc->c, sizeof (pc->c), &cdrom_pc_intr);
1348 }
1349
1350
1351 static void cdrom_do_packet_command (ide_drive_t *drive)
1352 {
1353 int len;
1354 struct request *rq = HWGROUP(drive)->rq;
1355 struct packet_command *pc = (struct packet_command *)rq->buffer;
1356
1357 len = pc->buflen;
1358 if (len < 0) len = -len;
1359
1360 pc->stat = 0;
1361
1362
1363 cdrom_start_packet_command (drive, len, cdrom_do_pc_continuation);
1364 }
1365
1366
1367
1368
1369 static
1370 void cdrom_sleep (int time)
1371 {
1372 current->state = TASK_INTERRUPTIBLE;
1373 current->timeout = jiffies + time;
1374 schedule ();
1375 }
1376
1377 static
1378 int cdrom_queue_packet_command (ide_drive_t *drive, struct packet_command *pc)
1379 {
1380 struct atapi_request_sense my_reqbuf;
1381 int retries = 10;
1382 struct request req;
1383
1384
1385
1386 if (pc->sense_data == NULL)
1387 pc->sense_data = &my_reqbuf;
1388 pc->sense_data->sense_key = 0;
1389
1390
1391 do {
1392 ide_init_drive_cmd (&req);
1393 req.cmd = PACKET_COMMAND;
1394 req.buffer = (char *)pc;
1395 (void) ide_do_drive_cmd (drive, &req, ide_wait);
1396
1397 if (pc->stat != 0)
1398 {
1399
1400
1401 struct atapi_request_sense *reqbuf = pc->sense_data;
1402
1403 if (reqbuf->sense_key == UNIT_ATTENTION)
1404 ;
1405
1406
1407
1408
1409 else if (reqbuf->sense_key == NOT_READY && reqbuf->asc == 4)
1410 {
1411 cdrom_sleep (HZ);
1412 }
1413
1414
1415 else
1416 retries = 0;
1417
1418 --retries;
1419 }
1420
1421
1422 } while (pc->stat != 0 && retries >= 0);
1423
1424
1425
1426 if (pc->stat != 0)
1427 return -EIO;
1428
1429 else
1430 {
1431
1432
1433
1434
1435 if (CDROM_STATE_FLAGS (drive)->door_locked == 0 &&
1436 (pc->c[0] != REQUEST_SENSE &&
1437 pc->c[0] != ALLOW_MEDIUM_REMOVAL &&
1438 pc->c[0] != START_STOP))
1439 {
1440 (void) cdrom_lockdoor (drive, 1, NULL);
1441 }
1442 return 0;
1443 }
1444 }
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455 static
1456 void cdrom_do_drive_cmd (ide_drive_t *drive)
1457 {
1458 struct request *rq = HWGROUP(drive)->rq;
1459 byte *args = rq->buffer;
1460
1461 if (args)
1462 {
1463 #if 0
1464 if (args[0] == WIN_SETFEATURES &&
1465 (args[2] == 0x66 || args[2] == 0xcc || args[2] == 0x02 ||
1466 args[2] == 0xdd || args[2] == 0x5d))
1467 {
1468 OUT_BYTE (args[2], io_base + IDE_FEATURE_OFFSET);
1469 <send cmd>
1470 }
1471 else
1472 #endif
1473 {
1474 printk ("%s: Unsupported drive command %02x %02x %02x\n",
1475 drive->name, args[0], args[1], args[2]);
1476 rq->errors = 1;
1477 }
1478 }
1479
1480 cdrom_end_request (1, drive);
1481 }
1482
1483
1484
1485
1486
1487
1488
1489 void ide_do_rw_cdrom (ide_drive_t *drive, unsigned long block)
1490 {
1491 struct request *rq = HWGROUP(drive)->rq;
1492
1493 if (rq -> cmd == PACKET_COMMAND || rq -> cmd == REQUEST_SENSE_COMMAND)
1494 cdrom_do_packet_command (drive);
1495
1496 else if (rq -> cmd == RESET_DRIVE_COMMAND)
1497 {
1498 cdrom_end_request (1, drive);
1499 ide_do_reset (drive);
1500 return;
1501 }
1502
1503 else if (rq -> cmd == IDE_DRIVE_CMD)
1504 cdrom_do_drive_cmd (drive);
1505
1506 else if (rq -> cmd != READ)
1507 {
1508 printk ("ide-cd: bad cmd %d\n", rq -> cmd);
1509 cdrom_end_request (0, drive);
1510 }
1511 else
1512 cdrom_start_read (drive, block);
1513 }
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527 #if ! STANDARD_ATAPI
1528 static
1529 int bin2bcd (int x)
1530 {
1531 return (x%10) | ((x/10) << 4);
1532 }
1533
1534
1535 static
1536 int bcd2bin (int x)
1537 {
1538 return (x >> 4) * 10 + (x & 0x0f);
1539 }
1540 #endif
1541
1542
1543 static inline
1544 void lba_to_msf (int lba, byte *m, byte *s, byte *f)
1545 {
1546 lba += CD_BLOCK_OFFSET;
1547 lba &= 0xffffff;
1548 *m = lba / (CD_SECS * CD_FRAMES);
1549 lba %= (CD_SECS * CD_FRAMES);
1550 *s = lba / CD_FRAMES;
1551 *f = lba % CD_FRAMES;
1552 }
1553
1554
1555 static inline
1556 int msf_to_lba (byte m, byte s, byte f)
1557 {
1558 return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_BLOCK_OFFSET;
1559 }
1560
1561
1562 static int
1563 cdrom_check_status (ide_drive_t *drive,
1564 struct atapi_request_sense *reqbuf)
1565 {
1566 struct packet_command pc;
1567
1568 memset (&pc, 0, sizeof (pc));
1569
1570 pc.sense_data = reqbuf;
1571 pc.c[0] = TEST_UNIT_READY;
1572
1573 return cdrom_queue_packet_command (drive, &pc);
1574 }
1575
1576
1577
1578 static int
1579 cdrom_lockdoor (ide_drive_t *drive, int lockflag,
1580 struct atapi_request_sense *reqbuf)
1581 {
1582 struct atapi_request_sense my_reqbuf;
1583 int stat;
1584 struct packet_command pc;
1585
1586 if (reqbuf == NULL)
1587 reqbuf = &my_reqbuf;
1588
1589
1590 if (CDROM_CONFIG_FLAGS (drive)->no_doorlock)
1591 stat = 0;
1592 else
1593 {
1594 memset (&pc, 0, sizeof (pc));
1595 pc.sense_data = reqbuf;
1596
1597 pc.c[0] = ALLOW_MEDIUM_REMOVAL;
1598 pc.c[4] = (lockflag != 0);
1599 stat = cdrom_queue_packet_command (drive, &pc);
1600 }
1601
1602 if (stat == 0)
1603 CDROM_STATE_FLAGS (drive)->door_locked = lockflag;
1604 else
1605 {
1606
1607
1608 if (reqbuf->sense_key == ILLEGAL_REQUEST && reqbuf->asc == 0x24)
1609 {
1610 printk ("%s: door locking not supported\n", drive->name);
1611 CDROM_CONFIG_FLAGS (drive)->no_doorlock = 1;
1612 stat = 0;
1613 CDROM_STATE_FLAGS (drive)->door_locked = lockflag;
1614 }
1615 }
1616 return stat;
1617 }
1618
1619
1620
1621
1622 static int
1623 cdrom_eject (ide_drive_t *drive, int ejectflag,
1624 struct atapi_request_sense *reqbuf)
1625 {
1626 struct packet_command pc;
1627
1628 memset (&pc, 0, sizeof (pc));
1629 pc.sense_data = reqbuf;
1630
1631 pc.c[0] = START_STOP;
1632 pc.c[4] = 2 + (ejectflag != 0);
1633 return cdrom_queue_packet_command (drive, &pc);
1634 }
1635
1636
1637 static int
1638 cdrom_pause (ide_drive_t *drive, int pauseflag,
1639 struct atapi_request_sense *reqbuf)
1640 {
1641 struct packet_command pc;
1642
1643 memset (&pc, 0, sizeof (pc));
1644 pc.sense_data = reqbuf;
1645
1646 pc.c[0] = SCMD_PAUSE_RESUME;
1647 pc.c[8] = !pauseflag;
1648 return cdrom_queue_packet_command (drive, &pc);
1649 }
1650
1651
1652 static int
1653 cdrom_startstop (ide_drive_t *drive, int startflag,
1654 struct atapi_request_sense *reqbuf)
1655 {
1656 struct packet_command pc;
1657
1658 memset (&pc, 0, sizeof (pc));
1659 pc.sense_data = reqbuf;
1660
1661 pc.c[0] = START_STOP;
1662 pc.c[1] = 1;
1663 pc.c[4] = startflag;
1664 return cdrom_queue_packet_command (drive, &pc);
1665 }
1666
1667
1668 static int
1669 cdrom_read_capacity (ide_drive_t *drive, unsigned *capacity,
1670 struct atapi_request_sense *reqbuf)
1671 {
1672 struct {
1673 unsigned lba;
1674 unsigned blocklen;
1675 } capbuf;
1676
1677 int stat;
1678 struct packet_command pc;
1679
1680 memset (&pc, 0, sizeof (pc));
1681 pc.sense_data = reqbuf;
1682
1683 pc.c[0] = READ_CAPACITY;
1684 pc.buffer = (char *)&capbuf;
1685 pc.buflen = sizeof (capbuf);
1686
1687 stat = cdrom_queue_packet_command (drive, &pc);
1688 if (stat == 0)
1689 {
1690 *capacity = ntohl (capbuf.lba);
1691 }
1692
1693 return stat;
1694 }
1695
1696
1697 static int
1698 cdrom_read_tocentry (ide_drive_t *drive, int trackno, int msf_flag,
1699 int format, char *buf, int buflen,
1700 struct atapi_request_sense *reqbuf)
1701 {
1702 struct packet_command pc;
1703
1704 memset (&pc, 0, sizeof (pc));
1705 pc.sense_data = reqbuf;
1706
1707 pc.buffer = buf;
1708 pc.buflen = buflen;
1709 pc.c[0] = SCMD_READ_TOC;
1710 pc.c[6] = trackno;
1711 pc.c[7] = (buflen >> 8);
1712 pc.c[8] = (buflen & 0xff);
1713 pc.c[9] = (format << 6);
1714 if (msf_flag) pc.c[1] = 2;
1715 return cdrom_queue_packet_command (drive, &pc);
1716 }
1717
1718
1719
1720 static int
1721 cdrom_read_toc (ide_drive_t *drive,
1722 struct atapi_request_sense *reqbuf)
1723 {
1724 int msf_flag;
1725 int stat, ntracks, i;
1726 struct atapi_toc *toc = drive->cdrom_info.toc;
1727 struct {
1728 struct atapi_toc_header hdr;
1729 struct atapi_toc_entry ent;
1730 } ms_tmp;
1731
1732 if (toc == NULL)
1733 {
1734
1735 toc = (struct atapi_toc *) kmalloc (sizeof (struct atapi_toc),
1736 GFP_KERNEL);
1737 drive->cdrom_info.toc = toc;
1738 }
1739
1740 if (toc == NULL)
1741 {
1742 printk ("%s: No cdrom TOC buffer!\n", drive->name);
1743 return -EIO;
1744 }
1745
1746
1747
1748 if (CDROM_STATE_FLAGS (drive)->toc_valid)
1749 (void) cdrom_check_status (drive, NULL);
1750
1751 if (CDROM_STATE_FLAGS (drive)->toc_valid) return 0;
1752
1753 #if STANDARD_ATAPI
1754 msf_flag = 0;
1755 #else
1756
1757 msf_flag = (CDROM_CONFIG_FLAGS (drive)->no_lba_toc);
1758 #endif
1759
1760
1761 stat = cdrom_read_tocentry (drive, 0, msf_flag, 0, (char *)&toc->hdr,
1762 sizeof (struct atapi_toc_header) +
1763 sizeof (struct atapi_toc_entry),
1764 reqbuf);
1765 if (stat) return stat;
1766
1767 #if ! STANDARD_ATAPI
1768 if (CDROM_CONFIG_FLAGS (drive)->vertos_lossage)
1769 {
1770 toc->hdr.first_track = bcd2bin (toc->hdr.first_track);
1771 toc->hdr.last_track = bcd2bin (toc->hdr.last_track);
1772
1773 }
1774 #endif
1775
1776 ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
1777 if (ntracks <= 0) return -EIO;
1778 if (ntracks > MAX_TRACKS) ntracks = MAX_TRACKS;
1779
1780
1781 stat = cdrom_read_tocentry (drive, 0, msf_flag, 0, (char *)&toc->hdr,
1782 sizeof (struct atapi_toc_header) +
1783 (ntracks+1) * sizeof (struct atapi_toc_entry),
1784 reqbuf);
1785 if (stat) return stat;
1786 toc->hdr.toc_length = ntohs (toc->hdr.toc_length);
1787
1788 #if ! STANDARD_ATAPI
1789 if (CDROM_CONFIG_FLAGS (drive)->vertos_lossage)
1790 {
1791 toc->hdr.first_track = bcd2bin (toc->hdr.first_track);
1792 toc->hdr.last_track = bcd2bin (toc->hdr.last_track);
1793
1794 }
1795 #endif
1796
1797 for (i=0; i<=ntracks; i++)
1798 {
1799 #if ! STANDARD_ATAPI
1800 if (msf_flag)
1801 {
1802 if (CDROM_CONFIG_FLAGS (drive)->vertos_lossage)
1803 {
1804 toc->ent[i].track = bcd2bin (toc->ent[i].track);
1805 toc->ent[i].addr.msf.m = bcd2bin (toc->ent[i].addr.msf.m);
1806 toc->ent[i].addr.msf.s = bcd2bin (toc->ent[i].addr.msf.s);
1807 toc->ent[i].addr.msf.f = bcd2bin (toc->ent[i].addr.msf.f);
1808 }
1809 toc->ent[i].addr.lba = msf_to_lba (toc->ent[i].addr.msf.m,
1810 toc->ent[i].addr.msf.s,
1811 toc->ent[i].addr.msf.f);
1812 }
1813 else
1814 #endif
1815 toc->ent[i].addr.lba = ntohl (toc->ent[i].addr.lba);
1816 }
1817
1818
1819 stat = cdrom_read_tocentry (drive, 0, msf_flag, 1,
1820 (char *)&ms_tmp, sizeof (ms_tmp),
1821 reqbuf);
1822 if (stat) return stat;
1823 #if ! STANDARD_ATAPI
1824 if (msf_flag)
1825 toc->last_session_lba = msf_to_lba (ms_tmp.ent.addr.msf.m,
1826 ms_tmp.ent.addr.msf.s,
1827 ms_tmp.ent.addr.msf.f);
1828 else
1829 #endif
1830 toc->last_session_lba = ntohl (ms_tmp.ent.addr.lba);
1831
1832 toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track);
1833
1834
1835 stat = cdrom_read_capacity (drive, &toc->capacity, reqbuf);
1836 if (stat) toc->capacity = 0x1fffff;
1837
1838 HWIF(drive)->gd->sizes[drive->select.b.unit << PARTN_BITS]
1839 = toc->capacity * SECTORS_PER_FRAME;
1840 drive->part[0].nr_sects = toc->capacity * SECTORS_PER_FRAME;
1841
1842
1843 CDROM_STATE_FLAGS (drive)->toc_valid = 1;
1844
1845 return 0;
1846 }
1847
1848
1849 static int
1850 cdrom_read_subchannel (ide_drive_t *drive,
1851 char *buf, int buflen,
1852 struct atapi_request_sense *reqbuf)
1853 {
1854 struct packet_command pc;
1855
1856 memset (&pc, 0, sizeof (pc));
1857 pc.sense_data = reqbuf;
1858
1859 pc.buffer = buf;
1860 pc.buflen = buflen;
1861 pc.c[0] = SCMD_READ_SUBCHANNEL;
1862 pc.c[2] = 0x40;
1863 pc.c[3] = 0x01;
1864 pc.c[7] = (buflen >> 8);
1865 pc.c[8] = (buflen & 0xff);
1866 return cdrom_queue_packet_command (drive, &pc);
1867 }
1868
1869
1870
1871 static int
1872 cdrom_mode_sense (ide_drive_t *drive, int pageno, int modeflag,
1873 char *buf, int buflen,
1874 struct atapi_request_sense *reqbuf)
1875 {
1876 struct packet_command pc;
1877
1878 memset (&pc, 0, sizeof (pc));
1879 pc.sense_data = reqbuf;
1880
1881 pc.buffer = buf;
1882 pc.buflen = buflen;
1883 pc.c[0] = MODE_SENSE_10;
1884 pc.c[2] = pageno | (modeflag << 6);
1885 pc.c[7] = (buflen >> 8);
1886 pc.c[8] = (buflen & 0xff);
1887 return cdrom_queue_packet_command (drive, &pc);
1888 }
1889
1890
1891 static int
1892 cdrom_mode_select (ide_drive_t *drive, int pageno, char *buf, int buflen,
1893 struct atapi_request_sense *reqbuf)
1894 {
1895 struct packet_command pc;
1896
1897 memset (&pc, 0, sizeof (pc));
1898 pc.sense_data = reqbuf;
1899
1900 pc.buffer = buf;
1901 pc.buflen = - buflen;
1902 pc.c[0] = MODE_SELECT_10;
1903 pc.c[1] = 0x10;
1904 pc.c[2] = pageno;
1905 pc.c[7] = (buflen >> 8);
1906 pc.c[8] = (buflen & 0xff);
1907 return cdrom_queue_packet_command (drive, &pc);
1908 }
1909
1910
1911 static int
1912 cdrom_play_lba_range_play12 (ide_drive_t *drive, int lba_start, int lba_end,
1913 struct atapi_request_sense *reqbuf)
1914 {
1915 struct packet_command pc;
1916
1917 memset (&pc, 0, sizeof (pc));
1918 pc.sense_data = reqbuf;
1919
1920 pc.c[0] = SCMD_PLAYAUDIO12;
1921 #ifdef __alpha__
1922 stq_u(((long) htonl (lba_end - lba_start) << 32) | htonl(lba_start),
1923 (unsigned long *) &pc.c[2]);
1924 #else
1925 *(int *)(&pc.c[2]) = htonl (lba_start);
1926 *(int *)(&pc.c[6]) = htonl (lba_end - lba_start);
1927 #endif
1928
1929 return cdrom_queue_packet_command (drive, &pc);
1930 }
1931
1932
1933 #if ! STANDARD_ATAPI
1934 static int
1935 cdrom_play_lba_range_msf (ide_drive_t *drive, int lba_start, int lba_end,
1936 struct atapi_request_sense *reqbuf)
1937 {
1938 struct packet_command pc;
1939
1940 memset (&pc, 0, sizeof (pc));
1941 pc.sense_data = reqbuf;
1942
1943 pc.c[0] = SCMD_PLAYAUDIO_MSF;
1944 lba_to_msf (lba_start, &pc.c[3], &pc.c[4], &pc.c[5]);
1945 lba_to_msf (lba_end-1, &pc.c[6], &pc.c[7], &pc.c[8]);
1946
1947 if (CDROM_CONFIG_FLAGS (drive)->playmsf_uses_bcd)
1948 {
1949 pc.c[3] = bin2bcd (pc.c[3]);
1950 pc.c[4] = bin2bcd (pc.c[4]);
1951 pc.c[5] = bin2bcd (pc.c[5]);
1952 pc.c[6] = bin2bcd (pc.c[6]);
1953 pc.c[7] = bin2bcd (pc.c[7]);
1954 pc.c[8] = bin2bcd (pc.c[8]);
1955 }
1956
1957 return cdrom_queue_packet_command (drive, &pc);
1958 }
1959 #endif
1960
1961
1962 static int
1963 cdrom_play_lba_range_1 (ide_drive_t *drive, int lba_start, int lba_end,
1964 struct atapi_request_sense *reqbuf)
1965 {
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977 #if ! STANDARD_ATAPI
1978 if (CDROM_CONFIG_FLAGS (drive)->no_playaudio12)
1979 return cdrom_play_lba_range_msf (drive, lba_start, lba_end, reqbuf);
1980 else
1981 #endif
1982 {
1983 int stat;
1984 struct atapi_request_sense my_reqbuf;
1985
1986 if (reqbuf == NULL)
1987 reqbuf = &my_reqbuf;
1988
1989 stat = cdrom_play_lba_range_play12 (drive, lba_start, lba_end, reqbuf);
1990 if (stat == 0) return 0;
1991
1992 #if ! STANDARD_ATAPI
1993
1994 if (reqbuf->sense_key == ILLEGAL_REQUEST && reqbuf->asc == 0x20)
1995 {
1996
1997
1998 printk ("%s: Drive does not support PLAYAUDIO12; "
1999 "trying PLAYAUDIO_MSF\n", drive->name);
2000 CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 1;
2001 CDROM_CONFIG_FLAGS (drive)->playmsf_uses_bcd = 1;
2002 return cdrom_play_lba_range_msf (drive, lba_start, lba_end, reqbuf);
2003 }
2004 #endif
2005
2006
2007 return stat;
2008 }
2009 }
2010
2011
2012
2013
2014 static int
2015 cdrom_play_lba_range (ide_drive_t *drive, int lba_start, int lba_end,
2016 struct atapi_request_sense *reqbuf)
2017 {
2018 int i, stat;
2019 struct atapi_request_sense my_reqbuf;
2020
2021 if (reqbuf == NULL)
2022 reqbuf = &my_reqbuf;
2023
2024
2025
2026
2027
2028 for (i=0; i<75; i++)
2029 {
2030 stat = cdrom_play_lba_range_1 (drive, lba_start, lba_end, reqbuf);
2031
2032 if (stat == 0 ||
2033 !(reqbuf->sense_key == ILLEGAL_REQUEST && reqbuf->asc == 0x24))
2034 return stat;
2035
2036 --lba_end;
2037 if (lba_end <= lba_start) break;
2038 }
2039
2040 return stat;
2041 }
2042
2043
2044 static
2045 int cdrom_get_toc_entry (ide_drive_t *drive, int track,
2046 struct atapi_toc_entry **ent,
2047 struct atapi_request_sense *reqbuf)
2048 {
2049 int stat, ntracks;
2050 struct atapi_toc *toc;
2051
2052
2053 stat = cdrom_read_toc (drive, reqbuf);
2054 if (stat) return stat;
2055
2056 toc = drive->cdrom_info.toc;
2057
2058
2059 ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
2060 if (track == CDROM_LEADOUT)
2061 *ent = &toc->ent[ntracks];
2062 else if (track < toc->hdr.first_track ||
2063 track > toc->hdr.last_track)
2064 return -EINVAL;
2065 else
2066 *ent = &toc->ent[track - toc->hdr.first_track];
2067
2068 return 0;
2069 }
2070
2071
2072 static int
2073 cdrom_read_block (ide_drive_t *drive, int format, int lba,
2074 char *buf, int buflen,
2075 struct atapi_request_sense *reqbuf)
2076 {
2077 struct packet_command pc;
2078 struct atapi_request_sense my_reqbuf;
2079 int stat;
2080
2081 if (reqbuf == NULL)
2082 reqbuf = &my_reqbuf;
2083
2084 memset (&pc, 0, sizeof (pc));
2085 pc.sense_data = reqbuf;
2086
2087 pc.buffer = buf;
2088 pc.buflen = buflen;
2089
2090 #if ! STANDARD_ATAPI
2091 if (CDROM_CONFIG_FLAGS (drive)->old_readcd)
2092 pc.c[0] = 0xd4;
2093 else
2094 #endif
2095 pc.c[0] = READ_CD;
2096
2097 pc.c[1] = (format << 2);
2098 #ifdef __alpha__
2099 stl_u(htonl (lba), (unsigned int *) &pc.c[2]);
2100 #else
2101 *(int *)(&pc.c[2]) = htonl (lba);
2102 #endif
2103 pc.c[8] = 1;
2104 pc.c[9] = 0x10;
2105
2106 stat = cdrom_queue_packet_command (drive, &pc);
2107
2108 #if ! STANDARD_ATAPI
2109
2110
2111 if (stat && reqbuf->sense_key == ILLEGAL_REQUEST && reqbuf->asc == 0x20 &&
2112 CDROM_CONFIG_FLAGS (drive)->old_readcd == 0)
2113 {
2114 printk ("%s: Drive does not recognize READ_CD; trying opcode 0xd4\n",
2115 drive->name);
2116 CDROM_CONFIG_FLAGS (drive)->old_readcd = 1;
2117 return cdrom_read_block (drive, format, lba, buf, buflen, reqbuf);
2118 }
2119 #endif
2120
2121 return stat;
2122 }
2123
2124
2125 int ide_cdrom_ioctl (ide_drive_t *drive, struct inode *inode,
2126 struct file *file, unsigned int cmd, unsigned long arg)
2127 {
2128 switch (cmd)
2129 {
2130 case CDROMEJECT:
2131 {
2132 int stat;
2133
2134 if (drive->usage > 1)
2135 return -EBUSY;
2136
2137 stat = cdrom_lockdoor (drive, 0, NULL);
2138 if (stat) return stat;
2139
2140 return cdrom_eject (drive, 0, NULL);
2141 }
2142
2143 case CDROMEJECT_SW:
2144 {
2145 CDROM_STATE_FLAGS (drive)->eject_on_close = arg;
2146 return 0;
2147 }
2148
2149 case CDROMPAUSE:
2150 return cdrom_pause (drive, 1, NULL);
2151
2152 case CDROMRESUME:
2153 return cdrom_pause (drive, 0, NULL);
2154
2155 case CDROMSTART:
2156 return cdrom_startstop (drive, 1, NULL);
2157
2158 case CDROMSTOP:
2159 {
2160 int stat;
2161
2162 stat = cdrom_startstop (drive, 0, NULL);
2163 if (stat) return stat;
2164
2165 return cdrom_eject (drive, 1, NULL);
2166 }
2167
2168 case CDROMPLAYMSF:
2169 {
2170 struct cdrom_msf msf;
2171 int stat, lba_start, lba_end;
2172
2173 stat = verify_area (VERIFY_READ, (void *)arg, sizeof (msf));
2174 if (stat) return stat;
2175
2176 memcpy_fromfs (&msf, (void *) arg, sizeof(msf));
2177
2178 lba_start = msf_to_lba (msf.cdmsf_min0, msf.cdmsf_sec0,
2179 msf.cdmsf_frame0);
2180 lba_end = msf_to_lba (msf.cdmsf_min1, msf.cdmsf_sec1,
2181 msf.cdmsf_frame1) + 1;
2182
2183 if (lba_end <= lba_start) return -EINVAL;
2184
2185 return cdrom_play_lba_range (drive, lba_start, lba_end, NULL);
2186 }
2187
2188
2189
2190 case CDROMPLAYTRKIND:
2191 {
2192 int stat, lba_start, lba_end;
2193 struct cdrom_ti ti;
2194 struct atapi_toc_entry *first_toc, *last_toc;
2195
2196 stat = verify_area (VERIFY_READ, (void *)arg, sizeof (ti));
2197 if (stat) return stat;
2198
2199 memcpy_fromfs (&ti, (void *) arg, sizeof(ti));
2200
2201 stat = cdrom_get_toc_entry (drive, ti.cdti_trk0, &first_toc, NULL);
2202 if (stat) return stat;
2203 stat = cdrom_get_toc_entry (drive, ti.cdti_trk1, &last_toc, NULL);
2204 if (stat) return stat;
2205
2206 if (ti.cdti_trk1 != CDROM_LEADOUT) ++last_toc;
2207 lba_start = first_toc->addr.lba;
2208 lba_end = last_toc->addr.lba;
2209
2210 if (lba_end <= lba_start) return -EINVAL;
2211
2212 return cdrom_play_lba_range (drive, lba_start, lba_end, NULL);
2213 }
2214
2215 case CDROMREADTOCHDR:
2216 {
2217 int stat;
2218 struct cdrom_tochdr tochdr;
2219 struct atapi_toc *toc;
2220
2221 stat = verify_area (VERIFY_WRITE, (void *) arg, sizeof (tochdr));
2222 if (stat) return stat;
2223
2224
2225 stat = cdrom_read_toc (drive, NULL);
2226 if (stat) return stat;
2227
2228 toc = drive->cdrom_info.toc;
2229 tochdr.cdth_trk0 = toc->hdr.first_track;
2230 tochdr.cdth_trk1 = toc->hdr.last_track;
2231
2232 memcpy_tofs ((void *) arg, &tochdr, sizeof (tochdr));
2233
2234 return stat;
2235 }
2236
2237 case CDROMREADTOCENTRY:
2238 {
2239 int stat;
2240 struct cdrom_tocentry tocentry;
2241 struct atapi_toc_entry *toce;
2242
2243 stat = verify_area (VERIFY_READ, (void *) arg, sizeof (tocentry));
2244 if (stat) return stat;
2245 stat = verify_area (VERIFY_WRITE, (void *) arg, sizeof (tocentry));
2246 if (stat) return stat;
2247
2248 memcpy_fromfs (&tocentry, (void *) arg, sizeof (tocentry));
2249
2250 stat = cdrom_get_toc_entry (drive, tocentry.cdte_track, &toce, NULL);
2251 if (stat) return stat;
2252
2253 tocentry.cdte_ctrl = toce->control;
2254 tocentry.cdte_adr = toce->adr;
2255
2256 if (tocentry.cdte_format == CDROM_MSF)
2257 {
2258
2259 lba_to_msf (toce->addr.lba,
2260 &tocentry.cdte_addr.msf.minute,
2261 &tocentry.cdte_addr.msf.second,
2262 &tocentry.cdte_addr.msf.frame);
2263 }
2264 else
2265 tocentry.cdte_addr.lba = toce->addr.lba;
2266
2267 memcpy_tofs ((void *) arg, &tocentry, sizeof (tocentry));
2268
2269 return stat;
2270 }
2271
2272 case CDROMSUBCHNL:
2273 {
2274 struct atapi_cdrom_subchnl scbuf;
2275 int stat, abs_lba, rel_lba;
2276 struct cdrom_subchnl subchnl;
2277
2278 stat = verify_area (VERIFY_WRITE, (void *) arg, sizeof (subchnl));
2279 if (stat) return stat;
2280 stat = verify_area (VERIFY_READ, (void *) arg, sizeof (subchnl));
2281 if (stat) return stat;
2282
2283 memcpy_fromfs (&subchnl, (void *) arg, sizeof (subchnl));
2284
2285 stat = cdrom_read_subchannel (drive, (char *)&scbuf, sizeof (scbuf),
2286 NULL);
2287 if (stat) return stat;
2288
2289 #if ! STANDARD_ATAPI
2290 if (CDROM_CONFIG_FLAGS (drive)->vertos_lossage)
2291 {
2292 abs_lba = msf_to_lba (bcd2bin (scbuf.acdsc_absaddr.msf.minute),
2293 bcd2bin (scbuf.acdsc_absaddr.msf.second),
2294 bcd2bin (scbuf.acdsc_absaddr.msf.frame));
2295 rel_lba = msf_to_lba (bcd2bin (scbuf.acdsc_reladdr.msf.minute),
2296 bcd2bin (scbuf.acdsc_reladdr.msf.second),
2297 bcd2bin (scbuf.acdsc_reladdr.msf.frame));
2298 scbuf.acdsc_trk = bcd2bin (scbuf.acdsc_trk);
2299 }
2300 else
2301 #endif
2302 {
2303 abs_lba = ntohl (scbuf.acdsc_absaddr.lba);
2304 rel_lba = ntohl (scbuf.acdsc_reladdr.lba);
2305 }
2306
2307 if (subchnl.cdsc_format == CDROM_MSF)
2308 {
2309 lba_to_msf (abs_lba,
2310 &subchnl.cdsc_absaddr.msf.minute,
2311 &subchnl.cdsc_absaddr.msf.second,
2312 &subchnl.cdsc_absaddr.msf.frame);
2313 lba_to_msf (rel_lba,
2314 &subchnl.cdsc_reladdr.msf.minute,
2315 &subchnl.cdsc_reladdr.msf.second,
2316 &subchnl.cdsc_reladdr.msf.frame);
2317 }
2318 else
2319 {
2320 subchnl.cdsc_absaddr.lba = abs_lba;
2321 subchnl.cdsc_reladdr.lba = rel_lba;
2322 }
2323
2324 subchnl.cdsc_audiostatus = scbuf.acdsc_audiostatus;
2325 subchnl.cdsc_ctrl = scbuf.acdsc_ctrl;
2326 subchnl.cdsc_trk = scbuf.acdsc_trk;
2327 subchnl.cdsc_ind = scbuf.acdsc_ind;
2328
2329 memcpy_tofs ((void *) arg, &subchnl, sizeof (subchnl));
2330
2331 return stat;
2332 }
2333
2334 case CDROMVOLCTRL:
2335 {
2336 struct cdrom_volctrl volctrl;
2337 char buffer[24], mask[24];
2338 int stat;
2339
2340 stat = verify_area (VERIFY_READ, (void *) arg, sizeof (volctrl));
2341 if (stat) return stat;
2342 memcpy_fromfs (&volctrl, (void *) arg, sizeof (volctrl));
2343
2344 stat = cdrom_mode_sense (drive, 0x0e, 0, buffer, sizeof (buffer),NULL);
2345 if (stat) return stat;
2346 stat = cdrom_mode_sense (drive, 0x0e, 1, mask , sizeof (buffer),NULL);
2347 if (stat) return stat;
2348
2349 buffer[1] = buffer[2] = 0;
2350
2351 buffer[17] = volctrl.channel0 & mask[17];
2352 buffer[19] = volctrl.channel1 & mask[19];
2353 buffer[21] = volctrl.channel2 & mask[21];
2354 buffer[23] = volctrl.channel3 & mask[23];
2355
2356 return cdrom_mode_select (drive, 0x0e, buffer, sizeof (buffer), NULL);
2357 }
2358
2359 case CDROMVOLREAD:
2360 {
2361 struct cdrom_volctrl volctrl;
2362 char buffer[24];
2363 int stat;
2364
2365 stat = verify_area (VERIFY_WRITE, (void *) arg, sizeof (volctrl));
2366 if (stat) return stat;
2367
2368 stat = cdrom_mode_sense (drive, 0x0e, 0, buffer, sizeof (buffer), NULL);
2369 if (stat) return stat;
2370
2371 volctrl.channel0 = buffer[17];
2372 volctrl.channel1 = buffer[19];
2373 volctrl.channel2 = buffer[21];
2374 volctrl.channel3 = buffer[23];
2375
2376 memcpy_tofs ((void *) arg, &volctrl, sizeof (volctrl));
2377
2378 return 0;
2379 }
2380
2381 case CDROMMULTISESSION:
2382 {
2383 struct cdrom_multisession ms_info;
2384 struct atapi_toc *toc;
2385 int stat;
2386
2387 stat = verify_area (VERIFY_READ, (void *)arg, sizeof (ms_info));
2388 if (stat) return stat;
2389 stat = verify_area (VERIFY_WRITE, (void *)arg, sizeof (ms_info));
2390 if (stat) return stat;
2391
2392 memcpy_fromfs (&ms_info, (void *)arg, sizeof (ms_info));
2393
2394
2395 stat = cdrom_read_toc (drive, NULL);
2396 if (stat) return stat;
2397
2398 toc = drive->cdrom_info.toc;
2399
2400 if (ms_info.addr_format == CDROM_MSF)
2401 lba_to_msf (toc->last_session_lba,
2402 &ms_info.addr.msf.minute,
2403 &ms_info.addr.msf.second,
2404 &ms_info.addr.msf.frame);
2405
2406 else if (ms_info.addr_format == CDROM_LBA)
2407 ms_info.addr.lba = toc->last_session_lba;
2408
2409 else
2410 return -EINVAL;
2411
2412 ms_info.xa_flag = toc->xa_flag;
2413
2414 memcpy_tofs ((void *)arg, &ms_info, sizeof (ms_info));
2415
2416 return 0;
2417 }
2418
2419
2420 case CDROMREADAUDIO:
2421 {
2422 int stat, lba;
2423 struct atapi_toc *toc;
2424 struct cdrom_read_audio ra;
2425 char buf[CD_FRAMESIZE_RAW];
2426
2427
2428 stat = cdrom_read_toc (drive, NULL);
2429 if (stat) return stat;
2430
2431 toc = drive->cdrom_info.toc;
2432
2433 stat = verify_area (VERIFY_READ, (char *)arg, sizeof (ra));
2434 if (stat) return stat;
2435
2436 memcpy_fromfs (&ra, (void *)arg, sizeof (ra));
2437
2438 if (ra.nframes < 0 || ra.nframes > toc->capacity)
2439 return -EINVAL;
2440 else if (ra.nframes == 0)
2441 return 0;
2442
2443 stat = verify_area (VERIFY_WRITE, (char *)ra.buf,
2444 ra.nframes * CD_FRAMESIZE_RAW);
2445 if (stat) return stat;
2446
2447 if (ra.addr_format == CDROM_MSF)
2448 lba = msf_to_lba (ra.addr.msf.minute, ra.addr.msf.second,
2449 ra.addr.msf.frame);
2450
2451 else if (ra.addr_format == CDROM_LBA)
2452 lba = ra.addr.lba;
2453
2454 else
2455 return -EINVAL;
2456
2457 if (lba < 0 || lba >= toc->capacity)
2458 return -EINVAL;
2459
2460 while (ra.nframes > 0)
2461 {
2462 stat = cdrom_read_block (drive, 1, lba, buf,
2463 CD_FRAMESIZE_RAW, NULL);
2464 if (stat) return stat;
2465 memcpy_tofs (ra.buf, buf, CD_FRAMESIZE_RAW);
2466 ra.buf += CD_FRAMESIZE_RAW;
2467 --ra.nframes;
2468 ++lba;
2469 }
2470
2471 return 0;
2472 }
2473
2474 case CDROMREADMODE1:
2475 case CDROMREADMODE2:
2476 {
2477 struct cdrom_msf msf;
2478 int blocksize, format, stat, lba;
2479 struct atapi_toc *toc;
2480 char buf[CD_FRAMESIZE_RAW0];
2481
2482 if (cmd == CDROMREADMODE1)
2483 {
2484 blocksize = CD_FRAMESIZE;
2485 format = 2;
2486 }
2487 else
2488 {
2489 blocksize = CD_FRAMESIZE_RAW0;
2490 format = 3;
2491 }
2492
2493 stat = verify_area (VERIFY_READ, (char *)arg, sizeof (msf));
2494 if (stat) return stat;
2495 stat = verify_area (VERIFY_WRITE, (char *)arg, blocksize);
2496 if (stat) return stat;
2497
2498 memcpy_fromfs (&msf, (void *)arg, sizeof (msf));
2499
2500 lba = msf_to_lba (msf.cdmsf_min0, msf.cdmsf_sec0, msf.cdmsf_frame0);
2501
2502
2503 stat = cdrom_read_toc (drive, NULL);
2504 if (stat) return stat;
2505
2506 toc = drive->cdrom_info.toc;
2507
2508 if (lba < 0 || lba >= toc->capacity)
2509 return -EINVAL;
2510
2511 stat = cdrom_read_block (drive, format, lba, buf, blocksize, NULL);
2512 if (stat) return stat;
2513
2514 memcpy_tofs ((char *)arg, buf, blocksize);
2515 return 0;
2516 }
2517
2518 #if 0
2519 case CDROMRESET:
2520 {
2521 struct request req;
2522 ide_init_drive_cmd (&req);
2523 req.cmd = RESET_DRIVE_COMMAND;
2524 return ide_do_drive_cmd (drive, &req, ide_wait);
2525 }
2526 #endif
2527
2528
2529 #ifdef TEST
2530 case 0x1234:
2531 {
2532 int stat;
2533 struct packet_command pc;
2534 int len, lena;
2535
2536 memset (&pc, 0, sizeof (pc));
2537
2538 stat = verify_area (VERIFY_READ, (void *) arg, sizeof (pc.c));
2539 if (stat) return stat;
2540 memcpy_fromfs (&pc.c, (void *) arg, sizeof (pc.c));
2541 arg += sizeof (pc.c);
2542
2543 stat = verify_area (VERIFY_READ, (void *) arg, sizeof (len));
2544 if (stat) return stat;
2545 memcpy_fromfs (&len, (void *) arg , sizeof (len));
2546 arg += sizeof (len);
2547
2548 if (len > 0) {
2549 stat = verify_area (VERIFY_WRITE, (void *) arg, len);
2550 if (stat) return stat;
2551 }
2552
2553 lena = len;
2554 if (lena < 0) lena = 0;
2555
2556 {
2557 char buf[lena];
2558 if (len > 0) {
2559 pc.buflen = len;
2560 pc.buffer = buf;
2561 }
2562
2563 stat = cdrom_queue_packet_command (drive, &pc);
2564
2565 if (len > 0)
2566 memcpy_tofs ((void *)arg, buf, len);
2567 }
2568
2569 return stat;
2570 }
2571 #endif
2572
2573 default:
2574 return -EPERM;
2575 }
2576
2577 }
2578
2579
2580
2581
2582
2583
2584
2585 int ide_cdrom_check_media_change (ide_drive_t *drive)
2586 {
2587 int retval;
2588
2589 (void) cdrom_check_status (drive, NULL);
2590
2591 retval = CDROM_STATE_FLAGS (drive)->media_changed;
2592 CDROM_STATE_FLAGS (drive)->media_changed = 0;
2593
2594 return retval;
2595 }
2596
2597
2598 int ide_cdrom_open (struct inode *ip, struct file *fp, ide_drive_t *drive)
2599 {
2600
2601 if (fp->f_mode & 2)
2602 {
2603 --drive->usage;
2604 return -EROFS;
2605 }
2606
2607
2608 if (drive->usage == 1)
2609 {
2610 int stat;
2611 struct atapi_request_sense my_reqbuf;
2612 my_reqbuf.sense_key = 0;
2613
2614
2615 stat = cdrom_check_status (drive, &my_reqbuf);
2616
2617
2618 if (stat && my_reqbuf.sense_key == NOT_READY)
2619 {
2620 cdrom_eject (drive, 1, &my_reqbuf);
2621 stat = cdrom_check_status (drive, &my_reqbuf);
2622 }
2623
2624
2625 if (stat && my_reqbuf.sense_key != UNIT_ATTENTION)
2626 {
2627 --drive->usage;
2628 return -ENXIO;
2629 }
2630
2631
2632 (void) cdrom_lockdoor (drive, 1, &my_reqbuf);
2633
2634
2635 (void) cdrom_read_toc (drive, &my_reqbuf);
2636 }
2637
2638 return 0;
2639 }
2640
2641
2642
2643
2644
2645
2646 void ide_cdrom_release (struct inode *inode, struct file *file, ide_drive_t *drive)
2647 {
2648 if (drive->usage == 0)
2649 {
2650 invalidate_buffers (inode->i_rdev);
2651
2652
2653 (void) cdrom_lockdoor (drive, 0, NULL);
2654
2655
2656 if (CDROM_STATE_FLAGS (drive)->eject_on_close)
2657 (void) cdrom_eject (drive, 0, NULL);
2658 }
2659 }
2660
2661
2662
2663
2664
2665
2666
2667 void ide_cdrom_setup (ide_drive_t *drive)
2668 {
2669 blksize_size[HWIF(drive)->major][drive->select.b.unit << PARTN_BITS] = CD_FRAMESIZE;
2670
2671 drive->special.all = 0;
2672 drive->ready_stat = 0;
2673
2674 CDROM_STATE_FLAGS (drive)->media_changed = 0;
2675 CDROM_STATE_FLAGS (drive)->toc_valid = 0;
2676 CDROM_STATE_FLAGS (drive)->door_locked = 0;
2677
2678
2679 CDROM_STATE_FLAGS (drive)->eject_on_close= 0;
2680
2681 #if NO_DOOR_LOCKING
2682 CDROM_CONFIG_FLAGS (drive)->no_doorlock = 1;
2683 #else
2684 CDROM_CONFIG_FLAGS (drive)->no_doorlock = 0;
2685 #endif
2686
2687 if (drive->id != NULL) {
2688 CDROM_CONFIG_FLAGS (drive)->drq_interrupt =
2689 ((drive->id->config & 0x0060) == 0x20);
2690 } else {
2691 CDROM_CONFIG_FLAGS (drive)->drq_interrupt = 0;
2692 }
2693
2694 #if ! STANDARD_ATAPI
2695 CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 0;
2696 CDROM_CONFIG_FLAGS (drive)->old_readcd = 0;
2697 CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 0;
2698 CDROM_CONFIG_FLAGS (drive)->playmsf_uses_bcd = 0;
2699 CDROM_CONFIG_FLAGS (drive)->vertos_lossage = 0;
2700
2701 if (drive->id != NULL) {
2702
2703 if (strcmp (drive->id->model, "CD220E") == 0 ||
2704 strcmp (drive->id->model, "CD") == 0)
2705 CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
2706
2707 else if (strcmp (drive->id->model, "TO-ICSLYAL") == 0 ||
2708 strcmp (drive->id->model, "OTI-SCYLLA") == 0)
2709 CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
2710
2711
2712
2713 else if (strcmp (drive->id->model, "DCI-2S10") == 0)
2714 CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
2715
2716 else if (strcmp (drive->id->model, "CDA26803I SE") == 0)
2717 {
2718 CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
2719
2720
2721 CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 1;
2722 }
2723
2724
2725 else if (strcmp (drive->id->model, "V003S0DS") == 0)
2726 {
2727 CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
2728
2729
2730 if (drive->id->fw_rev[4] == '1' &&
2731 drive->id->fw_rev[6] <= '2')
2732 {
2733 CDROM_CONFIG_FLAGS (drive)->vertos_lossage = 1;
2734 CDROM_CONFIG_FLAGS (drive)->playmsf_uses_bcd = 1;
2735 }
2736 }
2737 else if (strcmp (drive->id->model, "0V300SSD") == 0 ||
2738 strcmp (drive->id->model, "V003M0DP") == 0 ||
2739 strcmp (drive->id->model, "0V300MPD") == 0 ||
2740 strcmp (drive->id->model, "0V300HPD") == 0 ||
2741 strcmp (drive->id->model, "V003H0DP") == 0)
2742 CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
2743
2744
2745 else if (strcmp (drive->id->model, "V004E0DT") == 0 ||
2746 strcmp (drive->id->model, "0V400ETD") == 0 ||
2747 strcmp (drive->id->model, "V004H0DT") == 0 ||
2748 strcmp (drive->id->model, "0V400HTD") == 0)
2749 CDROM_CONFIG_FLAGS (drive)->no_lba_toc = 1;
2750
2751 else if ( strcmp (drive->id->model, "CD-ROM CDU55D") == 0)
2752 CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 1;
2753
2754 else if (strcmp (drive->id->model, "CD-ROM CDU55E") == 0)
2755 CDROM_CONFIG_FLAGS (drive)->no_playaudio12 = 1;
2756 }
2757 #endif
2758
2759 drive->cdrom_info.toc = NULL;
2760 drive->cdrom_info.sector_buffer = NULL;
2761 drive->cdrom_info.sector_buffered = 0;
2762 drive->cdrom_info.nsectors_buffered = 0;
2763 }
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778