1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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#define IDECD_VERSION "4.59-ac1"
298
299#include <linux/config.h>
300#include <linux/module.h>
301#include <linux/types.h>
302#include <linux/kernel.h>
303#include <linux/delay.h>
304#include <linux/timer.h>
305#include <linux/slab.h>
306#include <linux/interrupt.h>
307#include <linux/errno.h>
308#include <linux/cdrom.h>
309#include <linux/ide.h>
310#include <linux/completion.h>
311
312#include <asm/irq.h>
313#include <asm/io.h>
314#include <asm/byteorder.h>
315#include <asm/uaccess.h>
316#include <asm/unaligned.h>
317
318#include "ide-cd.h"
319
320
321
322
323
324
325
326static void cdrom_saw_media_change (ide_drive_t *drive)
327{
328 struct cdrom_info *info = drive->driver_data;
329
330 CDROM_STATE_FLAGS (drive)->media_changed = 1;
331 CDROM_STATE_FLAGS (drive)->toc_valid = 0;
332 info->nsectors_buffered = 0;
333}
334
335static int cdrom_log_sense(ide_drive_t *drive, struct packet_command *pc,
336 struct request_sense *sense)
337{
338 int log = 0;
339
340 if (sense == NULL || pc == NULL || pc->quiet)
341 return 0;
342
343 switch (sense->sense_key) {
344 case NO_SENSE: case RECOVERED_ERROR:
345 break;
346 case NOT_READY:
347
348
349
350
351
352 if (sense->asc == 0x3a || sense->asc == 0x04)
353 break;
354 log = 1;
355 break;
356 case UNIT_ATTENTION:
357
358
359
360
361
362 cdrom_saw_media_change(drive);
363 break;
364 default:
365 log = 1;
366 break;
367 }
368 return log;
369}
370
371static
372void cdrom_analyze_sense_data(ide_drive_t *drive,
373 struct packet_command *failed_command,
374 struct request_sense *sense)
375{
376
377 if (!cdrom_log_sense(drive, failed_command, sense))
378 return;
379
380
381
382
383
384
385 if (failed_command && failed_command->c[0] == GPCMD_READ_TOC_PMA_ATIP)
386 if (sense->sense_key == 0x05 && sense->asc == 0x24)
387 return;
388
389#if VERBOSE_IDE_CD_ERRORS
390 {
391 int i;
392 const char *s;
393 char buf[80];
394
395 printk ("ATAPI device %s:\n", drive->name);
396 if (sense->error_code==0x70)
397 printk(" Error: ");
398 else if (sense->error_code==0x71)
399 printk(" Deferred Error: ");
400 else if (sense->error_code == 0x7f)
401 printk(" Vendor-specific Error: ");
402 else
403 printk(" Unknown Error Type: ");
404
405 if (sense->sense_key < ARY_LEN(sense_key_texts))
406 s = sense_key_texts[sense->sense_key];
407 else
408 s = "bad sense key!";
409
410 printk("%s -- (Sense key=0x%02x)\n", s, sense->sense_key);
411
412 if (sense->asc == 0x40) {
413 sprintf(buf, "Diagnostic failure on component 0x%02x",
414 sense->ascq);
415 s = buf;
416 } else {
417 int lo = 0, mid, hi = ARY_LEN(sense_data_texts);
418 unsigned long key = (sense->sense_key << 16);
419 key |= (sense->asc << 8);
420 if (!(sense->ascq >= 0x80 && sense->ascq <= 0xdd))
421 key |= sense->ascq;
422 s = NULL;
423
424 while (hi > lo) {
425 mid = (lo + hi) / 2;
426 if (sense_data_texts[mid].asc_ascq == key ||
427 sense_data_texts[mid].asc_ascq == (0xff0000|key)) {
428 s = sense_data_texts[mid].text;
429 break;
430 }
431 else if (sense_data_texts[mid].asc_ascq > key)
432 hi = mid;
433 else
434 lo = mid+1;
435 }
436 }
437
438 if (s == NULL) {
439 if (sense->asc > 0x80)
440 s = "(vendor-specific error)";
441 else
442 s = "(reserved error code)";
443 }
444
445 printk(" %s -- (asc=0x%02x, ascq=0x%02x)\n",
446 s, sense->asc, sense->ascq);
447
448 if (failed_command != NULL) {
449
450 int lo=0, mid, hi= ARY_LEN (packet_command_texts);
451 s = NULL;
452
453 while (hi > lo) {
454 mid = (lo + hi) / 2;
455 if (packet_command_texts[mid].packet_command ==
456 failed_command->c[0]) {
457 s = packet_command_texts[mid].text;
458 break;
459 }
460 if (packet_command_texts[mid].packet_command >
461 failed_command->c[0])
462 hi = mid;
463 else
464 lo = mid+1;
465 }
466
467 printk (" The failed \"%s\" packet command was: \n \"", s);
468 for (i=0; i<sizeof (failed_command->c); i++)
469 printk ("%02x ", failed_command->c[i]);
470 printk ("\"\n");
471 }
472
473
474
475
476
477
478 if (sense->sense_key == NOT_READY && (sense->sks[0] & 0x80)) {
479 int progress = (sense->sks[1] << 8 | sense->sks[2]) * 100;
480 printk(" Command is %02d%% complete\n", progress / 0xffff);
481
482 }
483
484 if (sense->sense_key == ILLEGAL_REQUEST &&
485 (sense->sks[0] & 0x80) != 0) {
486 printk(" Error in %s byte %d",
487 (sense->sks[0] & 0x40) != 0 ?
488 "command packet" : "command data",
489 (sense->sks[1] << 8) + sense->sks[2]);
490
491 if ((sense->sks[0] & 0x40) != 0)
492 printk (" bit %d", sense->sks[0] & 0x07);
493
494 printk ("\n");
495 }
496 }
497
498#else
499
500
501
502
503 if (sense->sense_key == UNIT_ATTENTION ||
504 (sense->sense_key == NOT_READY && (sense->asc == 4 ||
505 sense->asc == 0x3a)))
506 return;
507
508 printk("%s: error code: 0x%02x sense_key: 0x%02x asc: 0x%02x ascq: 0x%02x\n",
509 drive->name,
510 sense->error_code, sense->sense_key,
511 sense->asc, sense->ascq);
512#endif
513}
514
515static void cdrom_queue_request_sense(ide_drive_t *drive,
516 struct completion *wait,
517 struct request_sense *sense,
518 struct packet_command *failed_command)
519{
520 struct cdrom_info *info = drive->driver_data;
521 struct packet_command *pc = &info->request_sense_pc;
522 struct request *rq;
523
524 if (sense == NULL)
525 sense = &info->sense_data;
526
527 memset(pc, 0, sizeof(struct packet_command));
528 pc->c[0] = GPCMD_REQUEST_SENSE;
529 pc->c[4] = pc->buflen = 18;
530 pc->buffer = (char *) sense;
531 pc->sense = (struct request_sense *) failed_command;
532
533
534 rq = &info->request_sense_request;
535 ide_init_drive_cmd(rq);
536 rq->cmd = REQUEST_SENSE_COMMAND;
537 rq->buffer = (char *) pc;
538 rq->waiting = wait;
539 (void) ide_do_drive_cmd(drive, rq, ide_preempt);
540}
541
542
543
544
545
546static int ide_cdrom_end_request (ide_drive_t *drive, int uptodate)
547{
548 struct request *rq;
549 unsigned long flags;
550 int ret = 1;
551
552 spin_lock_irqsave(&io_request_lock, flags);
553 rq = HWGROUP(drive)->rq;
554
555
556
557
558
559 if (drive->state == DMA_PIO_RETRY && drive->retry_pio <= 3) {
560 drive->state = 0;
561 HWGROUP(drive)->hwif->ide_dma_on(drive);
562 }
563
564 if (!end_that_request_first(rq, uptodate, drive->name)) {
565 add_blkdev_randomness(MAJOR(rq->rq_dev));
566 blkdev_dequeue_request(rq);
567 HWGROUP(drive)->rq = NULL;
568 end_that_request_last(rq);
569 ret = 0;
570 }
571 spin_unlock_irqrestore(&io_request_lock, flags);
572 return ret;
573}
574
575
576
577
578byte ide_cdrom_dump_status (ide_drive_t *drive, const char *msg, byte stat)
579{
580 unsigned long flags;
581
582 atapi_status_t status;
583 atapi_error_t error;
584
585 status.all = stat;
586 local_irq_set(flags);
587 printk("%s: %s: status=0x%02x", drive->name, msg, stat);
588#if FANCY_STATUS_DUMPS
589 printk(" { ");
590 if (status.b.bsy)
591 printk("Busy ");
592 else {
593 if (status.b.drdy) printk("DriveReady ");
594 if (status.b.df) printk("DeviceFault ");
595 if (status.b.dsc) printk("SeekComplete ");
596 if (status.b.drq) printk("DataRequest ");
597 if (status.b.corr) printk("CorrectedError ");
598 if (status.b.idx) printk("Index ");
599 if (status.b.check) printk("Error ");
600 }
601 printk("}");
602#endif
603 printk("\n");
604 if ((status.all & (status.b.bsy|status.b.check)) == status.b.check) {
605 error.all = HWIF(drive)->INB(IDE_ERROR_REG);
606 printk("%s: %s: error=0x%02x", drive->name, msg, error.all);
607#if FANCY_STATUS_DUMPS
608 if (error.b.ili) printk("IllegalLengthIndication ");
609 if (error.b.eom) printk("EndOfMedia ");
610 if (error.b.abrt) printk("Aborted Command ");
611 if (error.b.mcr) printk("MediaChangeRequested ");
612 if (error.b.sense_key) printk("LastFailedSense 0x%02x ",
613 error.b.sense_key);
614#endif
615 printk("\n");
616 }
617 local_irq_restore(flags);
618 return error.all;
619}
620
621
622
623
624ide_startstop_t ide_cdrom_error (ide_drive_t *drive, const char *msg, byte stat)
625{
626 struct request *rq;
627 byte err;
628
629 err = ide_cdrom_dump_status(drive, msg, stat);
630 if (drive == NULL || (rq = HWGROUP(drive)->rq) == NULL)
631 return ide_stopped;
632
633 if (rq->cmd == IDE_DRIVE_CMD || rq->cmd == IDE_DRIVE_TASK) {
634 rq->errors = 1;
635 ide_end_drive_cmd(drive, stat, err);
636 return ide_stopped;
637 }
638
639 if (stat & BUSY_STAT || ((stat & WRERR_STAT) && !drive->nowerr)) {
640
641 rq->errors |= ERROR_RESET;
642 } else {
643
644 }
645 if (HWIF(drive)->INB(IDE_STATUS_REG) & (BUSY_STAT|DRQ_STAT))
646
647 HWIF(drive)->OUTB(WIN_IDLEIMMEDIATE,IDE_COMMAND_REG);
648 if (rq->errors >= ERROR_MAX) {
649 DRIVER(drive)->end_request(drive, 0);
650 } else {
651 if ((rq->errors & ERROR_RESET) == ERROR_RESET) {
652 ++rq->errors;
653 return ide_do_reset(drive);
654 }
655 ++rq->errors;
656 }
657 return ide_stopped;
658}
659
660ide_startstop_t ide_cdrom_abort (ide_drive_t *drive, const char *msg)
661{
662 struct request *rq;
663
664 if (drive == NULL || (rq = HWGROUP(drive)->rq) == NULL)
665 return ide_stopped;
666
667 if (rq->cmd == IDE_DRIVE_CMD || rq->cmd == IDE_DRIVE_TASK) {
668 rq->errors = 1;
669 ide_end_drive_cmd(drive, BUSY_STAT, 0);
670 return ide_stopped;
671 }
672 rq->errors |= ERROR_RESET;
673 DRIVER(drive)->end_request(drive, 0);
674 return ide_stopped;
675}
676
677static void cdrom_end_request (ide_drive_t *drive, int uptodate)
678{
679 struct request *rq = HWGROUP(drive)->rq;
680
681 if (rq->cmd == REQUEST_SENSE_COMMAND && uptodate) {
682 struct packet_command *pc = (struct packet_command *) rq->buffer;
683 cdrom_analyze_sense_data(drive,
684 (struct packet_command *) pc->sense,
685 (struct request_sense *) (pc->buffer - pc->c[4]));
686 }
687 if (blk_fs_request(rq) && !rq->current_nr_sectors)
688 uptodate = 1;
689
690 ide_cdrom_end_request(drive, uptodate);
691}
692
693
694
695
696static int cdrom_decode_status (ide_startstop_t *startstop, ide_drive_t *drive,
697 int good_stat, int *stat_ret)
698{
699 struct request *rq = HWGROUP(drive)->rq;
700 int stat, err, sense_key;
701 struct packet_command *pc;
702
703
704 *stat_ret = stat = HWIF(drive)->INB(IDE_STATUS_REG);
705
706 if (OK_STAT (stat, good_stat, BAD_R_STAT))
707 return 0;
708
709
710 err = HWIF(drive)->INB(IDE_ERROR_REG);
711 sense_key = err >> 4;
712
713 if (rq == NULL) {
714 printk("%s: missing rq in cdrom_decode_status\n", drive->name);
715 *startstop = ide_stopped;
716 return 1;
717 }
718
719 if (rq->cmd == REQUEST_SENSE_COMMAND) {
720
721
722
723
724 pc = (struct packet_command *) rq->buffer;
725 pc->stat = 1;
726 cdrom_end_request(drive, 1);
727 *startstop = DRIVER(drive)->error(drive, "request sense failure", stat);
728 return 1;
729
730 } else if (rq->cmd == PACKET_COMMAND) {
731
732 struct completion *wait = NULL;
733 pc = (struct packet_command *) rq->buffer;
734
735
736 if (sense_key == NOT_READY) {
737 cdrom_saw_media_change (drive);
738 } else if (sense_key == UNIT_ATTENTION) {
739
740 cdrom_saw_media_change (drive);
741
742 return 0;
743 } else if (!pc->quiet) {
744
745 ide_dump_status(drive, "packet command error", stat);
746 }
747
748
749
750
751
752
753
754
755
756
757 if ((stat & ERR_STAT) != 0) {
758 wait = rq->waiting;
759 rq->waiting = NULL;
760 }
761
762 pc->stat = 1;
763 cdrom_end_request(drive, 1);
764
765 if ((stat & ERR_STAT) != 0)
766 cdrom_queue_request_sense(drive, wait, pc->sense, pc);
767 } else if (blk_fs_request(rq)) {
768 int do_end_request = 0;
769
770
771
772 if (sense_key == NOT_READY) {
773
774 cdrom_saw_media_change (drive);
775
776
777 printk ("%s: tray open\n", drive->name);
778 do_end_request = 1;
779 } else if (sense_key == UNIT_ATTENTION) {
780
781 cdrom_saw_media_change (drive);
782
783
784
785
786 if (++rq->errors > ERROR_MAX)
787 do_end_request = 1;
788 } else if (sense_key == ILLEGAL_REQUEST ||
789 sense_key == DATA_PROTECT) {
790
791
792 ide_dump_status (drive, "command error", stat);
793 do_end_request = 1;
794 } else if (sense_key == MEDIUM_ERROR) {
795
796
797 ide_dump_status (drive, "media error (bad sector)", stat);
798 do_end_request = 1;
799 } else if ((err & ~ABRT_ERR) != 0) {
800
801
802 *startstop = DRIVER(drive)->error(drive, "cdrom_decode_status", stat);
803 return 1;
804 } else if ((++rq->errors > ERROR_MAX)) {
805
806 do_end_request = 1;
807 }
808
809 if (do_end_request)
810 cdrom_end_request(drive, 0);
811
812
813
814 if ((stat & ERR_STAT) != 0)
815 cdrom_queue_request_sense(drive, NULL, NULL, NULL);
816 }
817
818
819 *startstop = ide_stopped;
820 return 1;
821}
822
823static int cdrom_timer_expiry(ide_drive_t *drive)
824{
825 struct request *rq = HWGROUP(drive)->rq;
826 struct packet_command *pc = (struct packet_command *) rq->buffer;
827 unsigned long wait = 0;
828
829
830
831
832
833
834
835 switch (pc->c[0]) {
836 case GPCMD_BLANK:
837 case GPCMD_FORMAT_UNIT:
838 case GPCMD_RESERVE_RZONE_TRACK:
839 wait = WAIT_CMD;
840 break;
841 default:
842 wait = 0;
843 break;
844 }
845 return wait;
846}
847
848
849
850
851
852
853
854
855static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive,
856 int xferlen,
857 ide_handler_t *handler)
858{
859 ide_startstop_t startstop;
860 struct cdrom_info *info = drive->driver_data;
861
862
863 if (ide_wait_stat(&startstop, drive, 0, BUSY_STAT, WAIT_READY))
864 return startstop;
865
866 if (info->dma) {
867 if (info->cmd == READ) {
868 info->dma = !HWIF(drive)->ide_dma_read(drive);
869 } else if (info->cmd == WRITE) {
870 info->dma = !HWIF(drive)->ide_dma_write(drive);
871 } else {
872 printk("ide-cd: DMA set, but not allowed\n");
873 }
874 }
875
876
877
878 HWIF(drive)->OUTB(info->dma, IDE_FEATURE_REG);
879 HWIF(drive)->OUTB(0, IDE_IREASON_REG);
880 HWIF(drive)->OUTB(0, IDE_SECTOR_REG);
881
882 HWIF(drive)->OUTB(xferlen & 0xff, IDE_BCOUNTL_REG);
883 HWIF(drive)->OUTB(xferlen >> 8 , IDE_BCOUNTH_REG);
884 if (IDE_CONTROL_REG)
885 HWIF(drive)->OUTB(drive->ctl, IDE_CONTROL_REG);
886
887 if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) {
888
889 ide_execute_command(drive, WIN_PACKETCMD, handler, WAIT_CMD, cdrom_timer_expiry);
890 return ide_started;
891 } else {
892
893 HWIF(drive)->OUTB(WIN_PACKETCMD, IDE_COMMAND_REG);
894 return (*handler) (drive);
895 }
896}
897
898
899
900
901
902
903
904
905
906
907static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive,
908 struct packet_command *pc,
909 ide_handler_t *handler)
910{
911 unsigned char *cmd_buf = pc->c;
912 int cmd_len = sizeof(pc->c);
913 unsigned int timeout = pc->timeout;
914 struct cdrom_info *info = drive->driver_data;
915 ide_startstop_t startstop;
916
917 if (CDROM_CONFIG_FLAGS(drive)->drq_interrupt) {
918
919
920 int stat_dum;
921
922
923 if (cdrom_decode_status(&startstop, drive, DRQ_STAT, &stat_dum))
924 return startstop;
925 } else {
926
927 if (ide_wait_stat(&startstop, drive, DRQ_STAT,
928 BUSY_STAT, WAIT_READY))
929 return startstop;
930 }
931
932
933 ide_set_handler(drive, handler, timeout, cdrom_timer_expiry);
934
935
936 HWIF(drive)->atapi_output_bytes(drive, cmd_buf, cmd_len);
937
938
939 if (info->dma)
940 (void) HWIF(drive)->ide_dma_begin(drive);
941
942 return ide_started;
943}
944
945
946
947
948
949
950
951
952
953
954
955
956static void cdrom_buffer_sectors (ide_drive_t *drive, unsigned long sector,
957 int sectors_to_transfer)
958{
959 struct cdrom_info *info = drive->driver_data;
960
961
962 int sectors_to_buffer = MIN (sectors_to_transfer,
963 (SECTOR_BUFFER_SIZE >> SECTOR_BITS) -
964 info->nsectors_buffered);
965
966 char *dest;
967
968
969 if (info->buffer == NULL)
970 sectors_to_buffer = 0;
971
972
973 if (info->nsectors_buffered == 0)
974 info->sector_buffered = sector;
975
976
977 dest = info->buffer + info->nsectors_buffered * SECTOR_SIZE;
978 while (sectors_to_buffer > 0) {
979 HWIF(drive)->atapi_input_bytes(drive, dest, SECTOR_SIZE);
980 --sectors_to_buffer;
981 --sectors_to_transfer;
982 ++info->nsectors_buffered;
983 dest += SECTOR_SIZE;
984 }
985
986
987 while (sectors_to_transfer > 0) {
988 char dum[SECTOR_SIZE];
989 HWIF(drive)->atapi_input_bytes(drive, dum, sizeof (dum));
990 --sectors_to_transfer;
991 }
992}
993
994
995
996
997
998
999static inline
1000int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason)
1001{
1002 ireason &= 3;
1003 if (ireason == 2) return 0;
1004
1005 if (ireason == 0) {
1006
1007 printk ("%s: cdrom_read_intr: "
1008 "Drive wants to transfer data the wrong way!\n",
1009 drive->name);
1010
1011
1012
1013 while (len > 0) {
1014 int dum = 0;
1015 HWIF(drive)->atapi_output_bytes(drive, &dum, sizeof (dum));
1016 len -= sizeof (dum);
1017 }
1018 } else if (ireason == 1) {
1019
1020
1021
1022 (void) HWIF(drive)->INB(IDE_STATUS_REG);
1023 return 0;
1024 } else {
1025
1026 printk ("%s: cdrom_read_intr: bad interrupt reason %d\n",
1027 drive->name, ireason);
1028 }
1029
1030 cdrom_end_request(drive, 0);
1031 return -1;
1032}
1033
1034
1035
1036
1037static ide_startstop_t cdrom_read_intr (ide_drive_t *drive)
1038{
1039 int stat;
1040 int ireason, len, sectors_to_transfer, nskip;
1041 struct cdrom_info *info = drive->driver_data;
1042 u8 lowcyl = 0, highcyl = 0;
1043 int i, dma = info->dma, dma_error = 0;
1044 ide_startstop_t startstop;
1045
1046 struct request *rq = HWGROUP(drive)->rq;
1047
1048
1049 if (dma) {
1050 info->dma = 0;
1051 if ((dma_error = HWIF(drive)->ide_dma_end(drive)))
1052 HWIF(drive)->ide_dma_off(drive);
1053 }
1054
1055 if (cdrom_decode_status (&startstop, drive, 0, &stat))
1056 return startstop;
1057
1058 if (dma) {
1059 if (!dma_error) {
1060 for (i = rq->nr_sectors; i > 0;) {
1061 i -= rq->current_nr_sectors;
1062 ide_cdrom_end_request(drive, 1);
1063 }
1064 return ide_stopped;
1065 } else
1066 return DRIVER(drive)->error(drive, "dma error", stat);
1067 }
1068
1069
1070 ireason = HWIF(drive)->INB(IDE_IREASON_REG);
1071 lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1072 highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1073
1074 len = lowcyl + (256 * highcyl);
1075
1076
1077 if ((stat & DRQ_STAT) == 0) {
1078
1079
1080 if (rq->current_nr_sectors > 0) {
1081 printk ("%s: cdrom_read_intr: data underrun (%ld blocks)\n",
1082 drive->name, rq->current_nr_sectors);
1083 cdrom_end_request(drive, 0);
1084 } else
1085 cdrom_end_request(drive, 1);
1086 return ide_stopped;
1087 }
1088
1089
1090 if (cdrom_read_check_ireason (drive, len, ireason))
1091 return ide_stopped;
1092
1093
1094
1095
1096 if ((len % SECTOR_SIZE) != 0) {
1097 printk ("%s: cdrom_read_intr: Bad transfer size %d\n",
1098 drive->name, len);
1099 if (CDROM_CONFIG_FLAGS(drive)->limit_nframes)
1100 printk (" This drive is not supported by this version of the driver\n");
1101 else {
1102 printk (" Trying to limit transfer sizes\n");
1103 CDROM_CONFIG_FLAGS(drive)->limit_nframes = 1;
1104 }
1105 cdrom_end_request(drive, 0);
1106 return ide_stopped;
1107 }
1108
1109
1110 sectors_to_transfer = len / SECTOR_SIZE;
1111
1112
1113
1114 nskip = MIN ((int)(rq->current_nr_sectors - (rq->bh->b_size >> SECTOR_BITS)),
1115 sectors_to_transfer);
1116
1117 while (nskip > 0) {
1118
1119 char dum[SECTOR_SIZE];
1120 HWIF(drive)->atapi_input_bytes(drive, dum, sizeof (dum));
1121
1122 --rq->current_nr_sectors;
1123 --nskip;
1124 --sectors_to_transfer;
1125 }
1126
1127
1128 while (sectors_to_transfer > 0) {
1129 int this_transfer;
1130
1131
1132
1133 if (rq->current_nr_sectors == 0 && rq->nr_sectors)
1134 cdrom_end_request(drive, 1);
1135
1136
1137
1138 if (rq->current_nr_sectors == 0) {
1139 cdrom_buffer_sectors(drive, rq->sector, sectors_to_transfer);
1140 sectors_to_transfer = 0;
1141 } else {
1142
1143
1144
1145 this_transfer = MIN (sectors_to_transfer,
1146 rq->current_nr_sectors);
1147
1148
1149
1150 while (this_transfer > 0) {
1151 HWIF(drive)->atapi_input_bytes(drive, rq->buffer, SECTOR_SIZE);
1152 rq->buffer += SECTOR_SIZE;
1153 --rq->nr_sectors;
1154 --rq->current_nr_sectors;
1155 ++rq->sector;
1156 --this_transfer;
1157 --sectors_to_transfer;
1158 }
1159 }
1160 }
1161
1162
1163 ide_set_handler(drive, &cdrom_read_intr, WAIT_CMD, NULL);
1164 return ide_started;
1165}
1166
1167
1168
1169
1170
1171static int cdrom_read_from_buffer (ide_drive_t *drive)
1172{
1173 struct cdrom_info *info = drive->driver_data;
1174 struct request *rq = HWGROUP(drive)->rq;
1175
1176
1177 if (info->buffer == NULL) return 0;
1178
1179
1180
1181 while (rq->nr_sectors > 0 &&
1182 rq->sector >= info->sector_buffered &&
1183 rq->sector < info->sector_buffered + info->nsectors_buffered) {
1184 if (rq->current_nr_sectors == 0)
1185 cdrom_end_request(drive, 1);
1186
1187 memcpy (rq->buffer,
1188 info->buffer +
1189 (rq->sector - info->sector_buffered) * SECTOR_SIZE,
1190 SECTOR_SIZE);
1191 rq->buffer += SECTOR_SIZE;
1192 --rq->current_nr_sectors;
1193 --rq->nr_sectors;
1194 ++rq->sector;
1195 }
1196
1197
1198
1199 if (rq->nr_sectors == 0) {
1200 cdrom_end_request(drive, 1);
1201 return -1;
1202 }
1203
1204
1205 if (rq->current_nr_sectors == 0)
1206 cdrom_end_request(drive, 1);
1207
1208
1209
1210
1211
1212 if (rq->current_nr_sectors < (rq->bh->b_size >> SECTOR_BITS) &&
1213 (rq->sector % SECTORS_PER_FRAME) != 0) {
1214 printk("%s: cdrom_read_from_buffer: buffer botch (%ld)\n",
1215 drive->name, rq->sector);
1216 cdrom_end_request(drive, 0);
1217 return -1;
1218 }
1219
1220 return 0;
1221}
1222
1223
1224
1225
1226
1227
1228
1229static ide_startstop_t cdrom_start_read_continuation (ide_drive_t *drive)
1230{
1231 struct packet_command pc;
1232 struct request *rq = HWGROUP(drive)->rq;
1233 int nsect, sector, nframes, frame, nskip;
1234
1235
1236 nsect = rq->nr_sectors;
1237
1238
1239 sector = rq->sector;
1240
1241
1242
1243
1244
1245
1246
1247
1248 nskip = (sector % SECTORS_PER_FRAME);
1249 if (nskip > 0) {
1250
1251 if (rq->current_nr_sectors != (rq->bh->b_size >> SECTOR_BITS) &&
1252 (rq->sector % CD_FRAMESIZE != 0)) {
1253 printk ("%s: cdrom_start_read_continuation: buffer botch (%lu)\n",
1254 drive->name, rq->current_nr_sectors);
1255 cdrom_end_request(drive, 0);
1256 return ide_stopped;
1257 }
1258 sector -= nskip;
1259 nsect += nskip;
1260 rq->current_nr_sectors += nskip;
1261 }
1262
1263
1264
1265 nframes = (nsect + SECTORS_PER_FRAME-1) / SECTORS_PER_FRAME;
1266 frame = sector / SECTORS_PER_FRAME;
1267
1268
1269
1270 nframes = MIN (nframes, (CDROM_CONFIG_FLAGS (drive)->limit_nframes) ?
1271 (65534 / CD_FRAMESIZE) : 65535);
1272
1273
1274 memset (&pc.c, 0, sizeof (pc.c));
1275 pc.c[0] = GPCMD_READ_10;
1276 pc.c[7] = (nframes >> 8);
1277 pc.c[8] = (nframes & 0xff);
1278 put_unaligned(cpu_to_be32(frame), (unsigned int *) &pc.c[2]);
1279 pc.timeout = WAIT_CMD;
1280
1281
1282 return cdrom_transfer_packet_command(drive, &pc, &cdrom_read_intr);
1283}
1284
1285
1286#define IDECD_SEEK_THRESHOLD (1000)
1287#define IDECD_SEEK_TIMER (5 * WAIT_MIN_SLEEP)
1288#define IDECD_SEEK_TIMEOUT WAIT_CMD
1289
1290static ide_startstop_t cdrom_seek_intr (ide_drive_t *drive)
1291{
1292 struct cdrom_info *info = drive->driver_data;
1293 int stat;
1294 static int retry = 10;
1295 ide_startstop_t startstop;
1296
1297 if (cdrom_decode_status (&startstop, drive, 0, &stat))
1298 return startstop;
1299 CDROM_CONFIG_FLAGS(drive)->seeking = 1;
1300
1301 if (retry && time_after(jiffies, info->start_seek + IDECD_SEEK_TIMER)) {
1302 if (--retry == 0) {
1303
1304
1305
1306
1307#if 0
1308 printk("%s: disabled DSC seek overlap\n", drive->name);
1309#endif
1310 drive->dsc_overlap = 0;
1311 }
1312 }
1313 return ide_stopped;
1314}
1315
1316static ide_startstop_t cdrom_start_seek_continuation (ide_drive_t *drive)
1317{
1318 struct packet_command pc;
1319 struct request *rq = HWGROUP(drive)->rq;
1320 int sector, frame, nskip;
1321
1322 sector = rq->sector;
1323 nskip = (sector % SECTORS_PER_FRAME);
1324 if (nskip > 0)
1325 sector -= nskip;
1326 frame = sector / SECTORS_PER_FRAME;
1327
1328 memset (&pc.c, 0, sizeof (pc.c));
1329 pc.c[0] = GPCMD_SEEK;
1330 put_unaligned(cpu_to_be32(frame), (unsigned int *) &pc.c[2]);
1331
1332 pc.timeout = WAIT_CMD;
1333 return cdrom_transfer_packet_command(drive, &pc, &cdrom_seek_intr);
1334}
1335
1336static ide_startstop_t cdrom_start_seek (ide_drive_t *drive, unsigned int block)
1337{
1338 struct cdrom_info *info = drive->driver_data;
1339
1340 info->dma = 0;
1341 info->cmd = 0;
1342 info->start_seek = jiffies;
1343 return cdrom_start_packet_command(drive, 0, cdrom_start_seek_continuation);
1344}
1345
1346static inline int cdrom_merge_requests(struct request *rq, struct request *nxt)
1347{
1348 int ret = 1;
1349
1350
1351
1352
1353 if (rq->cmd == nxt->cmd && rq->rq_dev == nxt->rq_dev) {
1354 rq->nr_sectors += nxt->nr_sectors;
1355 rq->hard_nr_sectors += nxt->nr_sectors;
1356 rq->bhtail->b_reqnext = nxt->bh;
1357 rq->bhtail = nxt->bhtail;
1358 list_del(&nxt->queue);
1359 blkdev_release_request(nxt);
1360 ret = 0;
1361 }
1362
1363 return ret;
1364}
1365
1366
1367
1368
1369static void cdrom_attempt_remerge(ide_drive_t *drive, struct request *rq)
1370{
1371 struct list_head *entry;
1372 struct request *nxt;
1373 unsigned long flags;
1374
1375 spin_lock_irqsave(&io_request_lock, flags);
1376
1377 while (1) {
1378 entry = rq->queue.next;
1379 if (entry == &drive->queue.queue_head)
1380 break;
1381
1382 nxt = blkdev_entry_to_request(entry);
1383 if (rq->sector + rq->nr_sectors != nxt->sector)
1384 break;
1385 else if (rq->nr_sectors + nxt->nr_sectors > SECTORS_MAX)
1386 break;
1387
1388 if (cdrom_merge_requests(rq, nxt))
1389 break;
1390 }
1391
1392 spin_unlock_irqrestore(&io_request_lock, flags);
1393}
1394
1395
1396
1397static void restore_request (struct request *rq)
1398{
1399 if (rq->buffer != rq->bh->b_data) {
1400 int n = (rq->buffer - rq->bh->b_data) / SECTOR_SIZE;
1401 rq->buffer = rq->bh->b_data;
1402 rq->nr_sectors += n;
1403 rq->sector -= n;
1404 }
1405 rq->current_nr_sectors = rq->bh->b_size >> SECTOR_BITS;
1406 rq->hard_nr_sectors = rq->nr_sectors;
1407 rq->hard_sector = rq->sector;
1408}
1409
1410
1411
1412
1413static ide_startstop_t cdrom_start_read (ide_drive_t *drive, unsigned int block)
1414{
1415 struct cdrom_info *info = drive->driver_data;
1416 struct request *rq = HWGROUP(drive)->rq;
1417 int minor = MINOR(rq->rq_dev);
1418
1419
1420
1421 if (minor & PARTN_MASK) {
1422 rq->sector = block;
1423 minor &= ~PARTN_MASK;
1424 rq->rq_dev = MKDEV(MAJOR(rq->rq_dev), minor);
1425 }
1426
1427
1428
1429 restore_request(rq);
1430
1431
1432 if (cdrom_read_from_buffer(drive))
1433 return ide_stopped;
1434
1435 cdrom_attempt_remerge(drive, rq);
1436
1437
1438 info->nsectors_buffered = 0;
1439
1440
1441 if (drive->using_dma && (rq->sector % SECTORS_PER_FRAME == 0) &&
1442 (rq->nr_sectors % SECTORS_PER_FRAME == 0))
1443 info->dma = 1;
1444 else
1445 info->dma = 0;
1446
1447 info->cmd = READ;
1448
1449 return cdrom_start_packet_command(drive, 32768, cdrom_start_read_continuation);
1450}
1451
1452
1453
1454
1455
1456
1457static int cdrom_lockdoor(ide_drive_t *drive, int lockflag,
1458 struct request_sense *sense);
1459
1460
1461static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive)
1462{
1463 int ireason, len, stat, thislen;
1464 struct request *rq = HWGROUP(drive)->rq;
1465 struct packet_command *pc = (struct packet_command *)rq->buffer;
1466 ide_startstop_t startstop;
1467 u8 lowcyl = 0, highcyl = 0;
1468
1469
1470 if (cdrom_decode_status(&startstop, drive, 0, &stat))
1471 return startstop;
1472
1473
1474 ireason = HWIF(drive)->INB(IDE_IREASON_REG);
1475 lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1476 highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1477
1478 len = lowcyl + (256 * highcyl);
1479
1480
1481
1482 if ((stat & DRQ_STAT) == 0) {
1483
1484
1485 if (pc->c[0] == GPCMD_REQUEST_SENSE &&
1486 pc->buflen > 0 &&
1487 pc->buflen <= 5) {
1488 while (pc->buflen > 0) {
1489 *pc->buffer++ = 0;
1490 --pc->buflen;
1491 }
1492 }
1493
1494 if (pc->buflen == 0)
1495 cdrom_end_request(drive, 1);
1496 else {
1497
1498
1499
1500
1501
1502
1503
1504 pc->stat = 1;
1505 cdrom_end_request(drive, 1);
1506 }
1507 return ide_stopped;
1508 }
1509
1510
1511 thislen = pc->buflen;
1512 if (thislen > len) thislen = len;
1513
1514
1515 if ((ireason & 3) == 0) {
1516
1517 HWIF(drive)->atapi_output_bytes(drive, pc->buffer, thislen);
1518
1519
1520
1521 while (len > thislen) {
1522 int dum = 0;
1523 HWIF(drive)->atapi_output_bytes(drive, &dum, sizeof(dum));
1524 len -= sizeof(dum);
1525 }
1526
1527
1528 pc->buffer += thislen;
1529 pc->buflen -= thislen;
1530 }
1531
1532
1533 else if ((ireason & 3) == 2) {
1534
1535
1536 HWIF(drive)->atapi_input_bytes(drive, pc->buffer, thislen);
1537
1538
1539
1540 while (len > thislen) {
1541 int dum = 0;
1542 HWIF(drive)->atapi_input_bytes(drive, &dum, sizeof(dum));
1543 len -= sizeof(dum);
1544 }
1545
1546
1547 pc->buffer += thislen;
1548 pc->buflen -= thislen;
1549 } else {
1550 printk ("%s: cdrom_pc_intr: The drive "
1551 "appears confused (ireason = 0x%2x)\n",
1552 drive->name, ireason);
1553 pc->stat = 1;
1554 }
1555
1556
1557 ide_set_handler(drive, &cdrom_pc_intr, WAIT_CMD, cdrom_timer_expiry);
1558 return ide_started;
1559}
1560
1561
1562static ide_startstop_t cdrom_do_pc_continuation (ide_drive_t *drive)
1563{
1564 struct request *rq = HWGROUP(drive)->rq;
1565 struct packet_command *pc = (struct packet_command *)rq->buffer;
1566
1567 if (!pc->timeout)
1568 pc->timeout = WAIT_CMD;
1569
1570
1571 return cdrom_transfer_packet_command(drive, pc, &cdrom_pc_intr);
1572}
1573
1574
1575static ide_startstop_t cdrom_do_packet_command (ide_drive_t *drive)
1576{
1577 int len;
1578 struct request *rq = HWGROUP(drive)->rq;
1579 struct packet_command *pc = (struct packet_command *)rq->buffer;
1580 struct cdrom_info *info = drive->driver_data;
1581
1582 info->dma = 0;
1583 info->cmd = 0;
1584 pc->stat = 0;
1585 len = pc->buflen;
1586
1587
1588 return cdrom_start_packet_command(drive, len, cdrom_do_pc_continuation);
1589}
1590
1591
1592
1593
1594static
1595void cdrom_sleep (int time)
1596{
1597 int sleep = time;
1598
1599 do {
1600 set_current_state(TASK_INTERRUPTIBLE);
1601 sleep = schedule_timeout(sleep);
1602 } while (sleep);
1603}
1604
1605static
1606int cdrom_queue_packet_command(ide_drive_t *drive, struct packet_command *pc)
1607{
1608 struct request_sense sense;
1609 struct request req;
1610 int retries = 10;
1611
1612 if (pc->sense == NULL)
1613 pc->sense = &sense;
1614
1615
1616 do {
1617 ide_init_drive_cmd (&req);
1618 req.cmd = PACKET_COMMAND;
1619 req.buffer = (char *)pc;
1620 ide_do_drive_cmd(drive, &req, ide_wait);
1621
1622
1623 if (pc->stat != 0) {
1624
1625
1626
1627 struct request_sense *reqbuf = pc->sense;
1628
1629 if (reqbuf->sense_key == UNIT_ATTENTION)
1630 cdrom_saw_media_change(drive);
1631 else if (reqbuf->sense_key == NOT_READY &&
1632 reqbuf->asc == 4 && reqbuf->ascq != 4) {
1633
1634
1635
1636 cdrom_sleep(2 * HZ);
1637 } else {
1638
1639 retries = 0;
1640 }
1641 --retries;
1642 }
1643
1644
1645 } while (pc->stat != 0 && retries >= 0);
1646
1647
1648 return pc->stat ? -EIO : 0;
1649}
1650
1651
1652
1653
1654static inline int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason)
1655{
1656
1657
1658
1659
1660 ireason &= 3;
1661
1662 if (ireason == 2) {
1663
1664 printk("%s: cdrom_write_intr: wrong transfer direction!\n",
1665 drive->name);
1666
1667
1668
1669 while (len > 0) {
1670 int dum = 0;
1671 HWIF(drive)->atapi_output_bytes(drive, &dum, sizeof(dum));
1672 len -= sizeof(dum);
1673 }
1674 } else {
1675
1676 printk("%s: cdrom_write_intr: bad interrupt reason %d\n",
1677 drive->name, ireason);
1678 }
1679
1680 cdrom_end_request(drive, 0);
1681 return 1;
1682}
1683
1684static ide_startstop_t cdrom_write_intr(ide_drive_t *drive)
1685{
1686 int stat, ireason, len, sectors_to_transfer, uptodate;
1687 struct cdrom_info *info = drive->driver_data;
1688 int i, dma_error = 0, dma = info->dma;
1689 u8 lowcyl = 0, highcyl = 0;
1690 ide_startstop_t startstop;
1691
1692 struct request *rq = HWGROUP(drive)->rq;
1693
1694
1695 if (dma) {
1696 info->dma = 0;
1697 if ((dma_error = HWIF(drive)->ide_dma_end(drive))) {
1698 printk("ide-cd: write dma error\n");
1699 HWIF(drive)->ide_dma_off(drive);
1700 }
1701 }
1702
1703 if (cdrom_decode_status(&startstop, drive, 0, &stat)) {
1704 printk("ide-cd: write_intr decode_status bad\n");
1705 return startstop;
1706 }
1707
1708
1709
1710
1711 if (dma) {
1712 if (dma_error)
1713 return DRIVER(drive)->error(drive, "dma error", stat);
1714
1715 rq = HWGROUP(drive)->rq;
1716 for (i = rq->nr_sectors; i > 0;) {
1717 i -= rq->current_nr_sectors;
1718 ide_cdrom_end_request(drive, 1);
1719 }
1720 return ide_stopped;
1721 }
1722
1723
1724 ireason = HWIF(drive)->INB(IDE_IREASON_REG);
1725 lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1726 highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1727
1728 len = lowcyl + (256 * highcyl);
1729
1730
1731 if ((stat & DRQ_STAT) == 0) {
1732
1733
1734
1735 uptodate = 1;
1736 if (rq->current_nr_sectors > 0) {
1737 printk("%s: write_intr: data underrun (%ld blocks)\n",
1738 drive->name, rq->current_nr_sectors);
1739 uptodate = 0;
1740 }
1741 cdrom_end_request(drive, uptodate);
1742 return ide_stopped;
1743 }
1744
1745
1746 if (ireason & 3)
1747 if (cdrom_write_check_ireason(drive, len, ireason))
1748 return ide_stopped;
1749
1750 sectors_to_transfer = len / SECTOR_SIZE;
1751
1752
1753
1754
1755 while (sectors_to_transfer > 0) {
1756 int this_transfer;
1757
1758 if (!rq->current_nr_sectors) {
1759 printk("ide-cd: write_intr: oops\n");
1760 break;
1761 }
1762
1763
1764
1765
1766 this_transfer = MIN(sectors_to_transfer,rq->current_nr_sectors);
1767
1768 while (this_transfer > 0) {
1769 HWIF(drive)->atapi_output_bytes(drive, rq->buffer, SECTOR_SIZE);
1770 rq->buffer += SECTOR_SIZE;
1771 --rq->nr_sectors;
1772 --rq->current_nr_sectors;
1773 ++rq->sector;
1774 --this_transfer;
1775 --sectors_to_transfer;
1776 }
1777
1778
1779
1780
1781 if (rq->current_nr_sectors == 0 && rq->nr_sectors)
1782 cdrom_end_request(drive, 1);
1783 }
1784
1785
1786 ide_set_handler(drive, &cdrom_write_intr, 5 * WAIT_CMD, NULL);
1787 return ide_started;
1788}
1789
1790static ide_startstop_t cdrom_start_write_cont(ide_drive_t *drive)
1791{
1792 struct packet_command pc;
1793 struct request *rq = HWGROUP(drive)->rq;
1794 unsigned nframes, frame;
1795
1796 nframes = rq->nr_sectors >> 2;
1797 frame = rq->sector >> 2;
1798
1799 memset(&pc.c, 0, sizeof(pc.c));
1800
1801
1802
1803
1804 pc.c[0] = GPCMD_WRITE_10;
1805#if 0
1806 pc.c[1] = 1 << 3;
1807#endif
1808 pc.c[7] = (nframes >> 8) & 0xff;
1809 pc.c[8] = nframes & 0xff;
1810 put_unaligned(cpu_to_be32(frame), (unsigned int *)&pc.c[2]);
1811 pc.timeout = 2 * WAIT_CMD;
1812
1813 return cdrom_transfer_packet_command(drive, &pc, cdrom_write_intr);
1814}
1815
1816static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq)
1817{
1818 struct cdrom_info *info = drive->driver_data;
1819
1820
1821
1822
1823 if ((rq->nr_sectors & 3) || (rq->sector & 3)) {
1824 cdrom_end_request(drive, 0);
1825 return ide_stopped;
1826 }
1827
1828
1829
1830
1831
1832
1833
1834 cdrom_attempt_remerge(drive, rq);
1835
1836 info->nsectors_buffered = 0;
1837
1838
1839
1840 info->dma = drive->using_dma ? 1 : 0;
1841 info->cmd = WRITE;
1842
1843
1844 return cdrom_start_packet_command(drive, 32768, cdrom_start_write_cont);
1845}
1846
1847
1848
1849
1850static ide_startstop_t
1851ide_do_rw_cdrom (ide_drive_t *drive, struct request *rq, unsigned long block)
1852{
1853 ide_startstop_t action;
1854 struct cdrom_info *info = drive->driver_data;
1855
1856 switch (rq->cmd) {
1857 case WRITE:
1858 case READ: {
1859 if (CDROM_CONFIG_FLAGS(drive)->seeking) {
1860 int stat = HWIF(drive)->INB(IDE_STATUS_REG);
1861
1862 if ((stat & SEEK_STAT) != SEEK_STAT) {
1863 if (time_before(jiffies, info->start_seek + IDECD_SEEK_TIMEOUT)) {
1864 ide_stall_queue(drive, IDECD_SEEK_TIMER);
1865 return ide_stopped;
1866 }
1867 printk ("%s: DSC timeout\n", drive->name);
1868 }
1869 CDROM_CONFIG_FLAGS(drive)->seeking = 0;
1870 }
1871 if (IDE_LARGE_SEEK(info->last_block, block, IDECD_SEEK_THRESHOLD) && drive->dsc_overlap)
1872 action = cdrom_start_seek(drive, block);
1873 else {
1874 if (rq_data_dir(rq) == READ)
1875 action = cdrom_start_read(drive, block);
1876 else
1877 action = cdrom_start_write(drive, rq);
1878 }
1879 info->last_block = block;
1880 return action;
1881 }
1882
1883 case PACKET_COMMAND:
1884 case REQUEST_SENSE_COMMAND: {
1885 return cdrom_do_packet_command(drive);
1886 }
1887
1888 case RESET_DRIVE_COMMAND: {
1889 cdrom_end_request(drive, 1);
1890 return ide_do_reset(drive);
1891 }
1892
1893 default: {
1894 printk("ide-cd: bad cmd %d\n", rq->cmd);
1895 cdrom_end_request(drive, 0);
1896 return ide_stopped;
1897 }
1898 }
1899}
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913#if ! STANDARD_ATAPI
1914static inline
1915int bin2bcd (int x)
1916{
1917 return (x%10) | ((x/10) << 4);
1918}
1919
1920
1921static inline
1922int bcd2bin (int x)
1923{
1924 return (x >> 4) * 10 + (x & 0x0f);
1925}
1926
1927static
1928void msf_from_bcd (struct atapi_msf *msf)
1929{
1930 msf->minute = bcd2bin (msf->minute);
1931 msf->second = bcd2bin (msf->second);
1932 msf->frame = bcd2bin (msf->frame);
1933}
1934
1935#endif
1936
1937
1938static inline
1939void lba_to_msf (int lba, byte *m, byte *s, byte *f)
1940{
1941 lba += CD_MSF_OFFSET;
1942 lba &= 0xffffff;
1943 *m = lba / (CD_SECS * CD_FRAMES);
1944 lba %= (CD_SECS * CD_FRAMES);
1945 *s = lba / CD_FRAMES;
1946 *f = lba % CD_FRAMES;
1947}
1948
1949
1950static inline
1951int msf_to_lba (byte m, byte s, byte f)
1952{
1953 return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
1954}
1955
1956static int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense)
1957{
1958 struct packet_command pc;
1959 struct cdrom_info *info = drive->driver_data;
1960 struct cdrom_device_info *cdi = &info->devinfo;
1961
1962 memset(&pc, 0, sizeof(pc));
1963 pc.sense = sense;
1964
1965 pc.c[0] = GPCMD_TEST_UNIT_READY;
1966
1967#if ! STANDARD_ATAPI
1968
1969
1970
1971 pc.c[7] = cdi->sanyo_slot % 3;
1972#endif
1973
1974 return cdrom_queue_packet_command(drive, &pc);
1975}
1976
1977
1978
1979static int
1980cdrom_lockdoor(ide_drive_t *drive, int lockflag, struct request_sense *sense)
1981{
1982 struct request_sense my_sense;
1983 struct packet_command pc;
1984 int stat;
1985
1986 if (sense == NULL)
1987 sense = &my_sense;
1988
1989
1990 if (CDROM_CONFIG_FLAGS(drive)->no_doorlock) {
1991 stat = 0;
1992 } else {
1993 memset(&pc, 0, sizeof(pc));
1994 pc.sense = sense;
1995 pc.c[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
1996 pc.c[4] = lockflag ? 1 : 0;
1997 stat = cdrom_queue_packet_command(drive, &pc);
1998 }
1999
2000
2001
2002 if (stat != 0 &&
2003 sense->sense_key == ILLEGAL_REQUEST &&
2004 (sense->asc == 0x24 || sense->asc == 0x20)) {
2005 printk ("%s: door locking not supported\n",
2006 drive->name);
2007 CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
2008 stat = 0;
2009 }
2010
2011
2012 if (stat != 0 && sense->sense_key == NOT_READY && sense->asc == 0x3a)
2013 stat = 0;
2014
2015 if (stat == 0)
2016 CDROM_STATE_FLAGS(drive)->door_locked = lockflag;
2017
2018 return stat;
2019}
2020
2021
2022
2023
2024static int cdrom_eject(ide_drive_t *drive, int ejectflag,
2025 struct request_sense *sense)
2026{
2027 struct packet_command pc;
2028
2029 if (CDROM_CONFIG_FLAGS(drive)->no_eject && !ejectflag)
2030 return -EDRIVE_CANT_DO_THIS;
2031
2032
2033 if (CDROM_STATE_FLAGS(drive)->door_locked && ejectflag)
2034 return 0;
2035
2036 memset(&pc, 0, sizeof (pc));
2037 pc.sense = sense;
2038
2039 pc.c[0] = GPCMD_START_STOP_UNIT;
2040 pc.c[4] = 0x02 + (ejectflag != 0);
2041 return cdrom_queue_packet_command(drive, &pc);
2042}
2043
2044static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity,
2045 struct request_sense *sense)
2046{
2047 struct {
2048 __u32 lba;
2049 __u32 blocklen;
2050 } capbuf;
2051
2052 int stat;
2053 struct packet_command pc;
2054
2055 memset(&pc, 0, sizeof(pc));
2056 pc.sense = sense;
2057
2058 pc.c[0] = GPCMD_READ_CDVD_CAPACITY;
2059 pc.buffer = (char *)&capbuf;
2060 pc.buflen = sizeof(capbuf);
2061
2062 stat = cdrom_queue_packet_command(drive, &pc);
2063 if (stat == 0)
2064 *capacity = 1 + be32_to_cpu(capbuf.lba);
2065
2066 return stat;
2067}
2068
2069static int cdrom_read_tocentry(ide_drive_t *drive, int trackno, int msf_flag,
2070 int format, char *buf, int buflen,
2071 struct request_sense *sense)
2072{
2073 struct packet_command pc;
2074
2075 memset(&pc, 0, sizeof(pc));
2076 pc.sense = sense;
2077
2078 pc.buffer = buf;
2079 pc.buflen = buflen;
2080 pc.quiet = 1;
2081 pc.c[0] = GPCMD_READ_TOC_PMA_ATIP;
2082 pc.c[6] = trackno;
2083 pc.c[7] = (buflen >> 8);
2084 pc.c[8] = (buflen & 0xff);
2085 pc.c[9] = (format << 6);
2086
2087 if (msf_flag)
2088 pc.c[1] = 2;
2089
2090 return cdrom_queue_packet_command(drive, &pc);
2091}
2092
2093
2094
2095static int cdrom_read_toc(ide_drive_t *drive, struct request_sense *sense)
2096{
2097 int minor, stat, ntracks, i;
2098 kdev_t dev;
2099 struct cdrom_info *info = drive->driver_data;
2100 struct atapi_toc *toc = info->toc;
2101 struct {
2102 struct atapi_toc_header hdr;
2103 struct atapi_toc_entry ent;
2104 } ms_tmp;
2105
2106 if (toc == NULL) {
2107
2108 toc = (struct atapi_toc *) kmalloc (sizeof (struct atapi_toc),
2109 GFP_KERNEL);
2110 info->toc = toc;
2111 if (toc == NULL) {
2112 printk ("%s: No cdrom TOC buffer!\n", drive->name);
2113 return -ENOMEM;
2114 }
2115 }
2116
2117
2118
2119 (void) cdrom_check_status(drive, sense);
2120
2121 if (CDROM_STATE_FLAGS(drive)->toc_valid)
2122 return 0;
2123
2124
2125 stat = cdrom_read_tocentry(drive, 0, 1, 0, (char *) &toc->hdr,
2126 sizeof(struct atapi_toc_header), sense);
2127 if (stat) return stat;
2128
2129#if ! STANDARD_ATAPI
2130 if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd) {
2131 toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
2132 toc->hdr.last_track = bcd2bin(toc->hdr.last_track);
2133 }
2134#endif
2135
2136 ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
2137 if (ntracks <= 0)
2138 return -EIO;
2139 if (ntracks > MAX_TRACKS)
2140 ntracks = MAX_TRACKS;
2141
2142
2143 stat = cdrom_read_tocentry(drive, toc->hdr.first_track, 1, 0,
2144 (char *)&toc->hdr,
2145 sizeof(struct atapi_toc_header) +
2146 (ntracks + 1) *
2147 sizeof(struct atapi_toc_entry), sense);
2148
2149 if (stat && toc->hdr.first_track > 1) {
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159 ntracks = 0;
2160 stat = cdrom_read_tocentry(drive, CDROM_LEADOUT, 1, 0,
2161 (char *)&toc->hdr,
2162 sizeof(struct atapi_toc_header) +
2163 (ntracks + 1) *
2164 sizeof(struct atapi_toc_entry),
2165 sense);
2166 if (stat) {
2167 return stat;
2168 }
2169#if ! STANDARD_ATAPI
2170 if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd) {
2171 toc->hdr.first_track = bin2bcd(CDROM_LEADOUT);
2172 toc->hdr.last_track = bin2bcd(CDROM_LEADOUT);
2173 } else
2174#endif
2175 {
2176 toc->hdr.first_track = CDROM_LEADOUT;
2177 toc->hdr.last_track = CDROM_LEADOUT;
2178 }
2179 }
2180
2181 if (stat)
2182 return stat;
2183
2184 toc->hdr.toc_length = ntohs (toc->hdr.toc_length);
2185
2186#if ! STANDARD_ATAPI
2187 if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd) {
2188 toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
2189 toc->hdr.last_track = bcd2bin(toc->hdr.last_track);
2190 }
2191#endif
2192
2193 for (i=0; i<=ntracks; i++) {
2194#if ! STANDARD_ATAPI
2195 if (CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd) {
2196 if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd)
2197 toc->ent[i].track = bcd2bin(toc->ent[i].track);
2198 msf_from_bcd(&toc->ent[i].addr.msf);
2199 }
2200#endif
2201 toc->ent[i].addr.lba = msf_to_lba (toc->ent[i].addr.msf.minute,
2202 toc->ent[i].addr.msf.second,
2203 toc->ent[i].addr.msf.frame);
2204 }
2205
2206
2207 if (toc->hdr.first_track != CDROM_LEADOUT) {
2208
2209 stat = cdrom_read_tocentry(drive, 0, 1, 1, (char *)&ms_tmp,
2210 sizeof(ms_tmp), sense);
2211 if (stat) return stat;
2212 } else {
2213 ms_tmp.ent.addr.msf.minute = 0;
2214 ms_tmp.ent.addr.msf.second = 2;
2215 ms_tmp.ent.addr.msf.frame = 0;
2216 ms_tmp.hdr.first_track = ms_tmp.hdr.last_track = CDROM_LEADOUT;
2217 }
2218
2219#if ! STANDARD_ATAPI
2220 if (CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd)
2221 msf_from_bcd (&ms_tmp.ent.addr.msf);
2222#endif
2223
2224 toc->last_session_lba = msf_to_lba (ms_tmp.ent.addr.msf.minute,
2225 ms_tmp.ent.addr.msf.second,
2226 ms_tmp.ent.addr.msf.frame);
2227
2228 toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track);
2229
2230
2231 minor = (drive->select.b.unit) << PARTN_BITS;
2232 dev = MKDEV(HWIF(drive)->major, minor);
2233 stat = cdrom_get_last_written(dev, &toc->capacity);
2234 if (stat || !toc->capacity)
2235 stat = cdrom_read_capacity(drive, &toc->capacity, sense);
2236 if (stat)
2237 toc->capacity = 0x1fffff;
2238
2239 HWIF(drive)->gd->sizes[drive->select.b.unit << PARTN_BITS] = (toc->capacity * SECTORS_PER_FRAME) >> (BLOCK_SIZE_BITS - 9);
2240 drive->part[0].nr_sects = toc->capacity * SECTORS_PER_FRAME;
2241
2242
2243 CDROM_STATE_FLAGS(drive)->toc_valid = 1;
2244
2245 return 0;
2246}
2247
2248
2249static int cdrom_read_subchannel(ide_drive_t *drive, int format, char *buf,
2250 int buflen, struct request_sense *sense)
2251{
2252 struct packet_command pc;
2253
2254 memset(&pc, 0, sizeof(pc));
2255 pc.sense = sense;
2256
2257 pc.buffer = buf;
2258 pc.buflen = buflen;
2259 pc.c[0] = GPCMD_READ_SUBCHANNEL;
2260 pc.c[1] = 2;
2261 pc.c[2] = 0x40;
2262 pc.c[3] = format;
2263 pc.c[7] = (buflen >> 8);
2264 pc.c[8] = (buflen & 0xff);
2265 return cdrom_queue_packet_command(drive, &pc);
2266}
2267
2268
2269
2270static int cdrom_select_speed(ide_drive_t *drive, int speed,
2271 struct request_sense *sense)
2272{
2273 struct packet_command pc;
2274 memset(&pc, 0, sizeof(pc));
2275 pc.sense = sense;
2276
2277 if (speed == 0)
2278 speed = 0xffff;
2279 else
2280 speed *= 177;
2281
2282 pc.c[0] = GPCMD_SET_SPEED;
2283
2284 pc.c[2] = (speed >> 8) & 0xff;
2285
2286 pc.c[3] = speed & 0xff;
2287 if (CDROM_CONFIG_FLAGS(drive)->cd_r ||
2288 CDROM_CONFIG_FLAGS(drive)->cd_rw ||
2289 CDROM_CONFIG_FLAGS(drive)->dvd_r) {
2290
2291 pc.c[4] = (speed >> 8) & 0xff;
2292
2293 pc.c[5] = speed & 0xff;
2294 }
2295
2296 return cdrom_queue_packet_command(drive, &pc);
2297}
2298
2299static int cdrom_play_audio(ide_drive_t *drive, int lba_start, int lba_end)
2300{
2301 struct request_sense sense;
2302 struct packet_command pc;
2303
2304 memset(&pc, 0, sizeof (pc));
2305 pc.sense = &sense;
2306
2307 pc.c[0] = GPCMD_PLAY_AUDIO_MSF;
2308 lba_to_msf(lba_start, &pc.c[3], &pc.c[4], &pc.c[5]);
2309 lba_to_msf(lba_end-1, &pc.c[6], &pc.c[7], &pc.c[8]);
2310
2311 return cdrom_queue_packet_command(drive, &pc);
2312}
2313
2314static int cdrom_get_toc_entry(ide_drive_t *drive, int track,
2315 struct atapi_toc_entry **ent)
2316{
2317 struct cdrom_info *info = drive->driver_data;
2318 struct atapi_toc *toc = info->toc;
2319 int ntracks;
2320
2321
2322
2323
2324 if (!CDROM_STATE_FLAGS(drive)->toc_valid)
2325 return -EINVAL;
2326
2327
2328 ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
2329 if (toc->hdr.first_track == CDROM_LEADOUT) ntracks = 0;
2330 if (track == CDROM_LEADOUT)
2331 *ent = &toc->ent[ntracks];
2332 else if (track < toc->hdr.first_track ||
2333 track > toc->hdr.last_track)
2334 return -EINVAL;
2335 else
2336 *ent = &toc->ent[track - toc->hdr.first_track];
2337
2338 return 0;
2339}
2340
2341
2342static int ide_cdrom_packet(struct cdrom_device_info *cdi,
2343 struct cdrom_generic_command *cgc)
2344{
2345 struct packet_command pc;
2346 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2347
2348 if (cgc->timeout <= 0)
2349 cgc->timeout = WAIT_CMD;
2350
2351
2352
2353
2354 memset(&pc, 0, sizeof(pc));
2355 if (cgc->sense)
2356 memset(cgc->sense, 0, sizeof(struct request_sense));
2357 memcpy(pc.c, cgc->cmd, CDROM_PACKET_SIZE);
2358 pc.buffer = cgc->buffer;
2359 pc.buflen = cgc->buflen;
2360 pc.quiet = cgc->quiet;
2361 pc.timeout = cgc->timeout;
2362 pc.sense = cgc->sense;
2363 return cgc->stat = cdrom_queue_packet_command(drive, &pc);
2364}
2365
2366static
2367int ide_cdrom_dev_ioctl (struct cdrom_device_info *cdi,
2368 unsigned int cmd, unsigned long arg)
2369{
2370 struct cdrom_generic_command cgc;
2371 char buffer[16];
2372 int stat;
2373
2374 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
2375
2376
2377 switch (cmd) {
2378 case CDROMSETSPINDOWN: {
2379 char spindown;
2380
2381 if (copy_from_user(&spindown, (void *) arg, sizeof(char)))
2382 return -EFAULT;
2383
2384 if ((stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0)))
2385 return stat;
2386
2387 buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f);
2388
2389 return cdrom_mode_select(cdi, &cgc);
2390 }
2391
2392 case CDROMGETSPINDOWN: {
2393 char spindown;
2394
2395 if ((stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0)))
2396 return stat;
2397
2398 spindown = buffer[11] & 0x0f;
2399
2400 if (copy_to_user((void *) arg, &spindown, sizeof (char)))
2401 return -EFAULT;
2402
2403 return 0;
2404 }
2405
2406 default:
2407 return -EINVAL;
2408 }
2409
2410}
2411
2412static
2413int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi,
2414 unsigned int cmd, void *arg)
2415
2416{
2417 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2418 struct cdrom_info *info = drive->driver_data;
2419 int stat;
2420
2421 switch (cmd) {
2422
2423
2424
2425
2426 case CDROMPLAYTRKIND: {
2427 unsigned long lba_start, lba_end;
2428 struct cdrom_ti *ti = (struct cdrom_ti *)arg;
2429 struct atapi_toc_entry *first_toc, *last_toc;
2430
2431 stat = cdrom_get_toc_entry(drive, ti->cdti_trk0, &first_toc);
2432 if (stat)
2433 return stat;
2434
2435 stat = cdrom_get_toc_entry(drive, ti->cdti_trk1, &last_toc);
2436 if (stat)
2437 return stat;
2438
2439 if (ti->cdti_trk1 != CDROM_LEADOUT)
2440 ++last_toc;
2441 lba_start = first_toc->addr.lba;
2442 lba_end = last_toc->addr.lba;
2443
2444 if (lba_end <= lba_start)
2445 return -EINVAL;
2446
2447 return cdrom_play_audio(drive, lba_start, lba_end);
2448 }
2449
2450 case CDROMREADTOCHDR: {
2451 struct cdrom_tochdr *tochdr = (struct cdrom_tochdr *) arg;
2452 struct atapi_toc *toc;
2453
2454
2455 stat = cdrom_read_toc(drive, NULL);
2456 if (stat) return stat;
2457
2458 toc = info->toc;
2459 tochdr->cdth_trk0 = toc->hdr.first_track;
2460 tochdr->cdth_trk1 = toc->hdr.last_track;
2461
2462 return 0;
2463 }
2464
2465 case CDROMREADTOCENTRY: {
2466 struct cdrom_tocentry *tocentry = (struct cdrom_tocentry*) arg;
2467 struct atapi_toc_entry *toce;
2468
2469 stat = cdrom_get_toc_entry(drive, tocentry->cdte_track, &toce);
2470 if (stat) return stat;
2471
2472 tocentry->cdte_ctrl = toce->control;
2473 tocentry->cdte_adr = toce->adr;
2474 if (tocentry->cdte_format == CDROM_MSF) {
2475 lba_to_msf (toce->addr.lba,
2476 &tocentry->cdte_addr.msf.minute,
2477 &tocentry->cdte_addr.msf.second,
2478 &tocentry->cdte_addr.msf.frame);
2479 } else
2480 tocentry->cdte_addr.lba = toce->addr.lba;
2481
2482 return 0;
2483 }
2484
2485 default:
2486 return -EINVAL;
2487 }
2488}
2489
2490static
2491int ide_cdrom_reset (struct cdrom_device_info *cdi)
2492{
2493 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2494 struct request_sense sense;
2495 struct request req;
2496 int ret;
2497
2498 ide_init_drive_cmd (&req);
2499 req.cmd = RESET_DRIVE_COMMAND;
2500 ret = ide_do_drive_cmd(drive, &req, ide_wait);
2501
2502
2503
2504
2505
2506 if (CDROM_STATE_FLAGS(drive)->door_locked)
2507 (void) cdrom_lockdoor(drive, 1, &sense);
2508
2509 return ret;
2510}
2511
2512
2513static
2514int ide_cdrom_tray_move (struct cdrom_device_info *cdi, int position)
2515{
2516 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2517 struct request_sense sense;
2518
2519 if (position) {
2520 int stat = cdrom_lockdoor(drive, 0, &sense);
2521 if (stat) return stat;
2522 }
2523
2524 return cdrom_eject(drive, !position, &sense);
2525}
2526
2527static
2528int ide_cdrom_lock_door (struct cdrom_device_info *cdi, int lock)
2529{
2530 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2531 return cdrom_lockdoor(drive, lock, NULL);
2532}
2533
2534static
2535int ide_cdrom_select_speed (struct cdrom_device_info *cdi, int speed)
2536{
2537 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2538 struct request_sense sense;
2539 int stat;
2540
2541 if ((stat = cdrom_select_speed(drive, speed, &sense)) < 0)
2542 return stat;
2543
2544 cdi->speed = CDROM_STATE_FLAGS(drive)->current_speed;
2545 return 0;
2546}
2547
2548static
2549int ide_cdrom_drive_status (struct cdrom_device_info *cdi, int slot_nr)
2550{
2551 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2552
2553 if (slot_nr == CDSL_CURRENT) {
2554 struct request_sense sense;
2555 int stat = cdrom_check_status(drive, &sense);
2556 if (stat == 0 || sense.sense_key == UNIT_ATTENTION)
2557 return CDS_DISC_OK;
2558
2559 if (sense.sense_key == NOT_READY && sense.asc == 0x04 &&
2560 sense.ascq == 0x04)
2561 return CDS_DISC_OK;
2562
2563
2564
2565
2566
2567
2568
2569 if (sense.sense_key == NOT_READY) {
2570 if (sense.asc == 0x3a && sense.ascq == 1)
2571 return CDS_NO_DISC;
2572 else
2573 return CDS_TRAY_OPEN;
2574 }
2575
2576 return CDS_DRIVE_NOT_READY;
2577 }
2578 return -EINVAL;
2579}
2580
2581static
2582int ide_cdrom_get_last_session (struct cdrom_device_info *cdi,
2583 struct cdrom_multisession *ms_info)
2584{
2585 struct atapi_toc *toc;
2586 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2587 struct cdrom_info *info = drive->driver_data;
2588 struct request_sense sense;
2589 int ret;
2590
2591 if (!CDROM_STATE_FLAGS(drive)->toc_valid || info->toc == NULL)
2592 if ((ret = cdrom_read_toc(drive, &sense)))
2593 return ret;
2594
2595 toc = info->toc;
2596 ms_info->addr.lba = toc->last_session_lba;
2597 ms_info->xa_flag = toc->xa_flag;
2598
2599 return 0;
2600}
2601
2602static
2603int ide_cdrom_get_mcn (struct cdrom_device_info *cdi,
2604 struct cdrom_mcn *mcn_info)
2605{
2606 int stat;
2607 char mcnbuf[24];
2608 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2609
2610
2611 if ((stat = cdrom_read_subchannel(drive, 2, mcnbuf, sizeof (mcnbuf), NULL)))
2612 return stat;
2613
2614 memcpy (mcn_info->medium_catalog_number, mcnbuf+9,
2615 sizeof (mcn_info->medium_catalog_number)-1);
2616 mcn_info->medium_catalog_number[sizeof (mcn_info->medium_catalog_number)-1]
2617 = '\0';
2618
2619 return 0;
2620}
2621
2622
2623
2624
2625
2626
2627
2628static
2629int ide_cdrom_check_media_change_real (struct cdrom_device_info *cdi,
2630 int slot_nr)
2631{
2632 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2633 int retval;
2634
2635 if (slot_nr == CDSL_CURRENT) {
2636 (void) cdrom_check_status(drive, NULL);
2637 retval = CDROM_STATE_FLAGS(drive)->media_changed;
2638 CDROM_STATE_FLAGS(drive)->media_changed = 0;
2639 return retval;
2640 } else {
2641 return -EINVAL;
2642 }
2643}
2644
2645
2646static
2647int ide_cdrom_open_real (struct cdrom_device_info *cdi, int purpose)
2648{
2649 return 0;
2650}
2651
2652
2653
2654
2655
2656
2657static
2658void ide_cdrom_release_real (struct cdrom_device_info *cdi)
2659{
2660}
2661
2662
2663
2664
2665
2666
2667static struct cdrom_device_ops ide_cdrom_dops = {
2668 open: ide_cdrom_open_real,
2669 release: ide_cdrom_release_real,
2670 drive_status: ide_cdrom_drive_status,
2671 media_changed: ide_cdrom_check_media_change_real,
2672 tray_move: ide_cdrom_tray_move,
2673 lock_door: ide_cdrom_lock_door,
2674 select_speed: ide_cdrom_select_speed,
2675 get_last_session: ide_cdrom_get_last_session,
2676 get_mcn: ide_cdrom_get_mcn,
2677 reset: ide_cdrom_reset,
2678 audio_ioctl: ide_cdrom_audio_ioctl,
2679 dev_ioctl: ide_cdrom_dev_ioctl,
2680 capability: CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK |
2681 CDC_SELECT_SPEED | CDC_SELECT_DISC |
2682 CDC_MULTI_SESSION | CDC_MCN |
2683 CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET |
2684 CDC_IOCTLS | CDC_DRIVE_STATUS | CDC_CD_R |
2685 CDC_CD_RW | CDC_DVD | CDC_DVD_R| CDC_DVD_RAM |
2686 CDC_GENERIC_PACKET,
2687 generic_packet: ide_cdrom_packet,
2688};
2689
2690static int ide_cdrom_register (ide_drive_t *drive, int nslots)
2691{
2692 struct cdrom_info *info = drive->driver_data;
2693 struct cdrom_device_info *devinfo = &info->devinfo;
2694 int minor = (drive->select.b.unit) << PARTN_BITS;
2695
2696 devinfo->dev = MKDEV(HWIF(drive)->major, minor);
2697 devinfo->ops = &ide_cdrom_dops;
2698 devinfo->mask = 0;
2699 devinfo->speed = CDROM_STATE_FLAGS(drive)->current_speed;
2700 devinfo->capacity = nslots;
2701 devinfo->handle = (void *) drive;
2702 strcpy(devinfo->name, drive->name);
2703
2704
2705 if (!CDROM_CONFIG_FLAGS(drive)->cd_r)
2706 devinfo->mask |= CDC_CD_R;
2707 if (!CDROM_CONFIG_FLAGS(drive)->cd_rw)
2708 devinfo->mask |= CDC_CD_RW;
2709 if (!CDROM_CONFIG_FLAGS(drive)->dvd)
2710 devinfo->mask |= CDC_DVD;
2711 if (!CDROM_CONFIG_FLAGS(drive)->dvd_r)
2712 devinfo->mask |= CDC_DVD_R;
2713 if (!CDROM_CONFIG_FLAGS(drive)->dvd_ram)
2714 devinfo->mask |= CDC_DVD_RAM;
2715 if (!CDROM_CONFIG_FLAGS(drive)->is_changer)
2716 devinfo->mask |= CDC_SELECT_DISC;
2717 if (!CDROM_CONFIG_FLAGS(drive)->audio_play)
2718 devinfo->mask |= CDC_PLAY_AUDIO;
2719 if (!CDROM_CONFIG_FLAGS(drive)->close_tray)
2720 devinfo->mask |= CDC_CLOSE_TRAY;
2721
2722 devinfo->de = devfs_register(drive->de, "cd", DEVFS_FL_DEFAULT,
2723 HWIF(drive)->major, minor,
2724 S_IFBLK | S_IRUGO | S_IWUGO,
2725 ide_fops, NULL);
2726
2727 return register_cdrom(devinfo);
2728}
2729
2730static
2731int ide_cdrom_get_capabilities(ide_drive_t *drive, struct atapi_capabilities_page *cap)
2732{
2733 struct cdrom_info *info = drive->driver_data;
2734 struct cdrom_device_info *cdi = &info->devinfo;
2735 struct cdrom_generic_command cgc;
2736 int stat, attempts = 3, size = sizeof(*cap);
2737
2738
2739
2740
2741
2742 if (!(!strcmp(drive->id->model, "ATAPI CD ROM DRIVE 50X MAX") ||
2743 !strcmp(drive->id->model, "WPI CDS-32X")))
2744 size -= sizeof(cap->pad);
2745
2746
2747
2748
2749
2750
2751
2752 cdi->handle = (ide_drive_t *) drive;
2753 cdi->ops = &ide_cdrom_dops;
2754 init_cdrom_command(&cgc, cap, size, CGC_DATA_UNKNOWN);
2755 do {
2756 stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
2757 if (!stat)
2758 break;
2759 } while (--attempts);
2760 return stat;
2761}
2762
2763static
2764int ide_cdrom_probe_capabilities (ide_drive_t *drive)
2765{
2766 struct cdrom_info *info = drive->driver_data;
2767 struct cdrom_device_info *cdi = &info->devinfo;
2768 struct atapi_capabilities_page cap;
2769 int nslots = 1;
2770
2771 if (CDROM_CONFIG_FLAGS(drive)->nec260) {
2772 CDROM_CONFIG_FLAGS(drive)->no_eject = 0;
2773 CDROM_CONFIG_FLAGS(drive)->audio_play = 1;
2774 return nslots;
2775 }
2776
2777 if (ide_cdrom_get_capabilities(drive, &cap))
2778 return 0;
2779
2780 if (cap.lock == 0)
2781 CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
2782 if (cap.eject)
2783 CDROM_CONFIG_FLAGS(drive)->no_eject = 0;
2784 if (cap.cd_r_write)
2785 CDROM_CONFIG_FLAGS(drive)->cd_r = 1;
2786 if (cap.cd_rw_write)
2787 CDROM_CONFIG_FLAGS(drive)->cd_rw = 1;
2788 if (cap.test_write)
2789 CDROM_CONFIG_FLAGS(drive)->test_write = 1;
2790 if (cap.dvd_ram_read || cap.dvd_r_read || cap.dvd_rom)
2791 CDROM_CONFIG_FLAGS(drive)->dvd = 1;
2792 if (cap.dvd_ram_write)
2793 CDROM_CONFIG_FLAGS(drive)->dvd_ram = 1;
2794 if (cap.dvd_r_write)
2795 CDROM_CONFIG_FLAGS(drive)->dvd_r = 1;
2796 if (cap.audio_play)
2797 CDROM_CONFIG_FLAGS(drive)->audio_play = 1;
2798 if (cap.mechtype == mechtype_caddy || cap.mechtype == mechtype_popup)
2799 CDROM_CONFIG_FLAGS(drive)->close_tray = 0;
2800
2801
2802
2803
2804 if (strcmp(drive->id->model, "MATSHITADVD-ROM SR-8187") == 0 ||
2805 strcmp(drive->id->model, "MATSHITADVD-ROM SR-8186") == 0 ||
2806 strcmp(drive->id->model, "MATSHITADVD-ROM SR-8176") == 0 ||
2807 strcmp(drive->id->model, "MATSHITADVD-ROM SR-8174") == 0)
2808 CDROM_CONFIG_FLAGS(drive)->audio_play = 1;
2809
2810#if ! STANDARD_ATAPI
2811 if (cdi->sanyo_slot > 0) {
2812 CDROM_CONFIG_FLAGS(drive)->is_changer = 1;
2813 nslots = 3;
2814 }
2815
2816 else
2817#endif
2818 if (cap.mechtype == mechtype_individual_changer ||
2819 cap.mechtype == mechtype_cartridge_changer) {
2820 if ((nslots = cdrom_number_of_slots(cdi)) > 1) {
2821 CDROM_CONFIG_FLAGS(drive)->is_changer = 1;
2822 CDROM_CONFIG_FLAGS(drive)->supp_disc_present = 1;
2823 }
2824 }
2825
2826
2827 if (!drive->id->model[0] &&
2828 !strncmp(drive->id->fw_rev, "241N", 4)) {
2829 CDROM_STATE_FLAGS(drive)->current_speed =
2830 (((unsigned int)cap.curspeed) + (176/2)) / 176;
2831 CDROM_CONFIG_FLAGS(drive)->max_speed =
2832 (((unsigned int)cap.maxspeed) + (176/2)) / 176;
2833 } else {
2834 CDROM_STATE_FLAGS(drive)->current_speed =
2835 (ntohs(cap.curspeed) + (176/2)) / 176;
2836 CDROM_CONFIG_FLAGS(drive)->max_speed =
2837 (ntohs(cap.maxspeed) + (176/2)) / 176;
2838 }
2839
2840
2841
2842 printk(KERN_INFO "%s: ATAPI", drive->name);
2843 if (CDROM_CONFIG_FLAGS(drive)->max_speed)
2844 printk(" %dX", CDROM_CONFIG_FLAGS(drive)->max_speed);
2845 printk(" %s", CDROM_CONFIG_FLAGS(drive)->dvd ? "DVD-ROM" : "CD-ROM");
2846
2847 if (CDROM_CONFIG_FLAGS(drive)->dvd_r|CDROM_CONFIG_FLAGS(drive)->dvd_ram)
2848 printk(" DVD%s%s",
2849 (CDROM_CONFIG_FLAGS(drive)->dvd_r)? "-R" : "",
2850 (CDROM_CONFIG_FLAGS(drive)->dvd_ram)? "-RAM" : "");
2851
2852 if (CDROM_CONFIG_FLAGS(drive)->cd_r|CDROM_CONFIG_FLAGS(drive)->cd_rw)
2853 printk(" CD%s%s",
2854 (CDROM_CONFIG_FLAGS(drive)->cd_r)? "-R" : "",
2855 (CDROM_CONFIG_FLAGS(drive)->cd_rw)? "/RW" : "");
2856
2857 if (CDROM_CONFIG_FLAGS(drive)->is_changer)
2858 printk(" changer w/%d slots", nslots);
2859 else
2860 printk(" drive");
2861
2862 printk(", %dkB Cache", be16_to_cpu(cap.buffer_size));
2863
2864#ifdef CONFIG_BLK_DEV_IDEDMA
2865 if (drive->using_dma)
2866 (void) HWIF(drive)->ide_dma_verbose(drive);
2867#endif
2868 printk("\n");
2869
2870 return nslots;
2871}
2872
2873static void ide_cdrom_add_settings(ide_drive_t *drive)
2874{
2875 int major = HWIF(drive)->major;
2876 int minor = drive->select.b.unit << PARTN_BITS;
2877
2878 ide_add_setting(drive, "breada_readahead", SETTING_RW, BLKRAGET, BLKRASET, TYPE_INT, 0, 255, 1, 2, &read_ahead[major], NULL);
2879 ide_add_setting(drive, "file_readahead", SETTING_RW, BLKFRAGET, BLKFRASET, TYPE_INTA, 0, INT_MAX, 1, 1024, &max_readahead[major][minor], NULL);
2880 ide_add_setting(drive, "max_kb_per_request", SETTING_RW, BLKSECTGET, BLKSECTSET, TYPE_INTA, 1, 255, 1, 2, &max_sectors[major][minor], NULL);
2881 ide_add_setting(drive, "dsc_overlap", SETTING_RW, -1, -1, TYPE_BYTE, 0, 1, 1, 1, &drive->dsc_overlap, NULL);
2882}
2883
2884static
2885int ide_cdrom_setup (ide_drive_t *drive)
2886{
2887 struct cdrom_info *info = drive->driver_data;
2888 struct cdrom_device_info *cdi = &info->devinfo;
2889 int minor = drive->select.b.unit << PARTN_BITS;
2890 int nslots;
2891
2892
2893
2894
2895 set_device_ro(MKDEV(HWIF(drive)->major, minor), 1);
2896 set_blocksize(MKDEV(HWIF(drive)->major, minor), CD_FRAMESIZE);
2897
2898 drive->special.all = 0;
2899 drive->ready_stat = 0;
2900
2901 CDROM_STATE_FLAGS(drive)->media_changed = 1;
2902 CDROM_STATE_FLAGS(drive)->toc_valid = 0;
2903 CDROM_STATE_FLAGS(drive)->door_locked = 0;
2904
2905#if NO_DOOR_LOCKING
2906 CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
2907#else
2908 CDROM_CONFIG_FLAGS(drive)->no_doorlock = 0;
2909#endif
2910
2911 CDROM_CONFIG_FLAGS(drive)->drq_interrupt =
2912 ((drive->id->config & 0x0060) == 0x20);
2913
2914 CDROM_CONFIG_FLAGS(drive)->is_changer = 0;
2915 CDROM_CONFIG_FLAGS(drive)->cd_r = 0;
2916 CDROM_CONFIG_FLAGS(drive)->cd_rw = 0;
2917 CDROM_CONFIG_FLAGS(drive)->test_write = 0;
2918 CDROM_CONFIG_FLAGS(drive)->dvd = 0;
2919 CDROM_CONFIG_FLAGS(drive)->dvd_r = 0;
2920 CDROM_CONFIG_FLAGS(drive)->dvd_ram = 0;
2921 CDROM_CONFIG_FLAGS(drive)->no_eject = 1;
2922 CDROM_CONFIG_FLAGS(drive)->supp_disc_present = 0;
2923 CDROM_CONFIG_FLAGS(drive)->audio_play = 0;
2924 CDROM_CONFIG_FLAGS(drive)->close_tray = 1;
2925
2926
2927 CDROM_CONFIG_FLAGS(drive)->limit_nframes = 0;
2928
2929
2930 if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2430"))
2931 CDROM_CONFIG_FLAGS(drive)->limit_nframes = 1;
2932 else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2432"))
2933 CDROM_CONFIG_FLAGS(drive)->limit_nframes = 1;
2934
2935 else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-3231"))
2936 cdi->mask |= CDC_SELECT_SPEED;
2937
2938#if ! STANDARD_ATAPI
2939
2940
2941 cdi->sanyo_slot = 0;
2942
2943 CDROM_CONFIG_FLAGS(drive)->nec260 = 0;
2944 CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd = 0;
2945 CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd = 0;
2946 CDROM_CONFIG_FLAGS(drive)->playmsf_as_bcd = 0;
2947 CDROM_CONFIG_FLAGS(drive)->subchan_as_bcd = 0;
2948
2949 if (strcmp (drive->id->model, "V003S0DS") == 0 &&
2950 drive->id->fw_rev[4] == '1' &&
2951 drive->id->fw_rev[6] <= '2') {
2952
2953
2954 CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd = 1;
2955 CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd = 1;
2956 CDROM_CONFIG_FLAGS(drive)->playmsf_as_bcd = 1;
2957 CDROM_CONFIG_FLAGS(drive)->subchan_as_bcd = 1;
2958 }
2959 else if (strcmp (drive->id->model, "V006E0DS") == 0 &&
2960 drive->id->fw_rev[4] == '1' &&
2961 drive->id->fw_rev[6] <= '2') {
2962
2963 CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd = 1;
2964 }
2965
2966 else if (strcmp(drive->id->model,
2967 "NEC CD-ROM DRIVE:260") == 0 &&
2968 strncmp(drive->id->fw_rev, "1.01", 4) == 0) {
2969
2970
2971
2972 CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd = 1;
2973 CDROM_CONFIG_FLAGS(drive)->playmsf_as_bcd = 1;
2974 CDROM_CONFIG_FLAGS(drive)->subchan_as_bcd = 1;
2975 CDROM_CONFIG_FLAGS(drive)->nec260 = 1;
2976 }
2977 else if (strcmp(drive->id->model, "WEARNES CDD-120") == 0 &&
2978 strncmp(drive->id->fw_rev, "A1.1", 4) == 0) {
2979
2980 CDROM_CONFIG_FLAGS(drive)->playmsf_as_bcd = 1;
2981 CDROM_CONFIG_FLAGS(drive)->subchan_as_bcd = 1;
2982 }
2983
2984
2985 else if ((strcmp(drive->id->model, "CD-ROM CDR-C3 G") == 0) ||
2986 (strcmp(drive->id->model, "CD-ROM CDR-C3G") == 0) ||
2987 (strcmp(drive->id->model, "CD-ROM CDR_C36") == 0)) {
2988
2989 cdi->sanyo_slot = 3;
2990 }
2991#endif
2992
2993 info->toc = NULL;
2994 info->buffer = NULL;
2995 info->sector_buffered = 0;
2996 info->nsectors_buffered = 0;
2997 info->changer_info = NULL;
2998 info->last_block = 0;
2999 info->start_seek = 0;
3000
3001 nslots = ide_cdrom_probe_capabilities (drive);
3002
3003 if (CDROM_CONFIG_FLAGS(drive)->dvd_ram)
3004 set_device_ro(MKDEV(HWIF(drive)->major, minor), 0);
3005
3006#if 0
3007 drive->dsc_overlap = (HWIF(drive)->no_dsc) ? 0 : 1;
3008 if (HWIF(drive)->no_dsc) {
3009 printk(KERN_INFO "ide-cd: %s: disabling DSC overlap\n",
3010 drive->name);
3011 drive->dsc_overlap = 0;
3012 }
3013#endif
3014
3015 if (ide_cdrom_register(drive, nslots)) {
3016 printk ("%s: ide_cdrom_setup failed to register device with the cdrom driver.\n", drive->name);
3017 info->devinfo.handle = NULL;
3018 return 1;
3019 }
3020 ide_cdrom_add_settings(drive);
3021 return 0;
3022}
3023
3024
3025static
3026int ide_cdrom_ioctl (ide_drive_t *drive,
3027 struct inode *inode, struct file *file,
3028 unsigned int cmd, unsigned long arg)
3029{
3030 return cdrom_ioctl(inode, file, cmd, arg);
3031}
3032
3033static
3034int ide_cdrom_open (struct inode *ip, struct file *fp, ide_drive_t *drive)
3035{
3036 struct cdrom_info *info = drive->driver_data;
3037 int rc = -ENOMEM;
3038
3039 MOD_INC_USE_COUNT;
3040 if (info->buffer == NULL)
3041 info->buffer = (char *) kmalloc(SECTOR_BUFFER_SIZE, GFP_KERNEL);
3042 if ((info->buffer == NULL) || (rc = cdrom_open(ip, fp))) {
3043 drive->usage--;
3044 MOD_DEC_USE_COUNT;
3045 }
3046 return rc;
3047}
3048
3049static
3050void ide_cdrom_release (struct inode *inode, struct file *file,
3051 ide_drive_t *drive)
3052{
3053 cdrom_release (inode, file);
3054 MOD_DEC_USE_COUNT;
3055}
3056
3057static
3058int ide_cdrom_check_media_change (ide_drive_t *drive)
3059{
3060 return cdrom_media_changed(MKDEV (HWIF(drive)->major,
3061 (drive->select.b.unit) << PARTN_BITS));
3062}
3063
3064static
3065void ide_cdrom_revalidate (ide_drive_t *drive)
3066{
3067 struct cdrom_info *info = drive->driver_data;
3068 struct atapi_toc *toc;
3069 int minor = drive->select.b.unit << PARTN_BITS;
3070 struct request_sense sense;
3071
3072 cdrom_read_toc(drive, &sense);
3073
3074 if (!CDROM_STATE_FLAGS(drive)->toc_valid)
3075 return;
3076
3077 toc = info->toc;
3078
3079
3080 drive->part[0].nr_sects = toc->capacity * SECTORS_PER_FRAME;
3081 HWIF(drive)->gd->sizes[minor] = toc->capacity * BLOCKS_PER_FRAME;
3082
3083
3084
3085
3086
3087 blk_size[HWIF(drive)->major] = HWIF(drive)->gd->sizes;
3088 set_blocksize(MKDEV(HWIF(drive)->major, minor), CD_FRAMESIZE);
3089}
3090
3091static
3092unsigned long ide_cdrom_capacity (ide_drive_t *drive)
3093{
3094 unsigned long capacity;
3095
3096 if (cdrom_read_capacity(drive, &capacity, NULL))
3097 return 0;
3098
3099 return capacity * SECTORS_PER_FRAME;
3100}
3101
3102static
3103int ide_cdrom_cleanup(ide_drive_t *drive)
3104{
3105 struct cdrom_info *info = drive->driver_data;
3106 struct cdrom_device_info *devinfo = &info->devinfo;
3107
3108 if (ide_unregister_subdriver(drive)) {
3109 printk("%s: %s: failed to ide_unregister_subdriver\n",
3110 __FUNCTION__, drive->name);
3111 return 1;
3112 }
3113 if (info->buffer != NULL)
3114 kfree(info->buffer);
3115 if (info->toc != NULL)
3116 kfree(info->toc);
3117 if (info->changer_info != NULL)
3118 kfree(info->changer_info);
3119 if (devinfo->handle == drive && unregister_cdrom(devinfo))
3120 printk("%s: ide_cdrom_cleanup failed to unregister device from the cdrom driver.\n", drive->name);
3121 kfree(info);
3122 drive->driver_data = NULL;
3123 return 0;
3124}
3125
3126int ide_cdrom_init(void);
3127int ide_cdrom_attach (ide_drive_t *drive);
3128
3129static ide_driver_t ide_cdrom_driver = {
3130 name: "ide-cdrom",
3131 version: IDECD_VERSION,
3132 media: ide_cdrom,
3133 busy: 0,
3134 supports_dma: 1,
3135 supports_dsc_overlap: 1,
3136 cleanup: ide_cdrom_cleanup,
3137 standby: NULL,
3138 suspend: NULL,
3139 resume: NULL,
3140 flushcache: NULL,
3141 do_request: ide_do_rw_cdrom,
3142 end_request: ide_cdrom_end_request,
3143 sense: ide_cdrom_dump_status,
3144 error: ide_cdrom_error,
3145 abort: ide_cdrom_abort,
3146 ioctl: ide_cdrom_ioctl,
3147 open: ide_cdrom_open,
3148 release: ide_cdrom_release,
3149 media_change: ide_cdrom_check_media_change,
3150 revalidate: ide_cdrom_revalidate,
3151 pre_reset: NULL,
3152 capacity: ide_cdrom_capacity,
3153 special: NULL,
3154 proc: NULL,
3155 init: ide_cdrom_init,
3156 attach: ide_cdrom_attach,
3157 ata_prebuilder: NULL,
3158 atapi_prebuilder: NULL,
3159};
3160
3161static ide_module_t ide_cdrom_module = {
3162 IDE_DRIVER_MODULE,
3163 ide_cdrom_init,
3164 &ide_cdrom_driver,
3165 NULL
3166};
3167
3168
3169char *ignore = NULL;
3170
3171MODULE_PARM(ignore, "s");
3172MODULE_DESCRIPTION("ATAPI CD-ROM Driver");
3173
3174int ide_cdrom_attach (ide_drive_t *drive)
3175{
3176 struct cdrom_info *info;
3177 int failed = 0;
3178
3179 if (drive->scsi) {
3180 printk("ide-cd: passing drive %s to ide-scsi emulation.\n",
3181 drive->name);
3182 return 1;
3183 }
3184
3185 MOD_INC_USE_COUNT;
3186 info = (struct cdrom_info *) kmalloc (sizeof (struct cdrom_info), GFP_KERNEL);
3187 if (info == NULL) {
3188 printk("%s: Can't allocate a cdrom structure\n", drive->name);
3189 MOD_DEC_USE_COUNT;
3190 return 1;
3191 }
3192 if (ide_register_subdriver(drive,
3193 &ide_cdrom_driver, IDE_SUBDRIVER_VERSION)) {
3194 printk(KERN_ERR "ide-cd: %s: Failed to register the driver "
3195 "with ide.c\n", drive->name);
3196 kfree(info);
3197 MOD_DEC_USE_COUNT;
3198 return 1;
3199 }
3200 memset(info, 0, sizeof(struct cdrom_info));
3201 drive->driver_data = info;
3202 DRIVER(drive)->busy++;
3203 if (ide_cdrom_setup(drive)) {
3204 DRIVER(drive)->busy--;
3205 if (ide_cdrom_cleanup(drive))
3206 printk("%s: ide_cdrom_cleanup failed in "
3207 "ide_cdrom_init\n", drive->name);
3208 MOD_DEC_USE_COUNT;
3209 return 1;
3210 }
3211 DRIVER(drive)->busy--;
3212 failed--;
3213
3214 MOD_DEC_USE_COUNT;
3215 return 0;
3216}
3217
3218static void __exit ide_cdrom_exit(void)
3219{
3220 ide_drive_t *drive;
3221 int failed = 0;
3222
3223 while ((drive = ide_scan_devices(ide_cdrom, ide_cdrom_driver.name,
3224 &ide_cdrom_driver, failed)) != NULL)
3225 if (ide_cdrom_cleanup(drive)) {
3226 printk("%s: cleanup_module() called while still "
3227 "busy\n", drive->name);
3228 failed++;
3229 }
3230 ide_unregister_module(&ide_cdrom_module);
3231}
3232
3233int ide_cdrom_init(void)
3234{
3235#ifdef CLASSIC_BUILTINS_METHOD
3236 ide_drive_t *drive;
3237 struct cdrom_info *info;
3238 int failed = 0;
3239#endif
3240 MOD_INC_USE_COUNT;
3241#ifdef CLASSIC_BUILTINS_METHOD
3242 while ((drive = ide_scan_devices(ide_cdrom,
3243 ide_cdrom_driver.name, NULL, failed++)) != NULL) {
3244
3245 if (ignore != NULL) {
3246 if (strstr(ignore, drive->name)) {
3247 printk("ide-cd: ignoring drive %s\n",
3248 drive->name);
3249 continue;
3250 }
3251 }
3252 if (drive->scsi) {
3253 printk("ide-cd: passing drive %s to ide-scsi "
3254 "emulation.\n", drive->name);
3255 continue;
3256 }
3257 info = (struct cdrom_info *) kmalloc (sizeof (struct cdrom_info), GFP_KERNEL);
3258 if (info == NULL) {
3259 printk ("%s: Can't allocate a cdrom structure\n",
3260 drive->name);
3261 continue;
3262 }
3263 if (ide_register_subdriver(drive,
3264 &ide_cdrom_driver, IDE_SUBDRIVER_VERSION)) {
3265 printk("ide-cd: %s: Failed to register the driver with "
3266 "ide.c\n", drive->name);
3267 kfree(info);
3268 continue;
3269 }
3270 memset (info, 0, sizeof (struct cdrom_info));
3271 drive->driver_data = info;
3272 DRIVER(drive)->busy++;
3273 if (ide_cdrom_setup (drive)) {
3274 DRIVER(drive)->busy--;
3275 if (ide_cdrom_cleanup (drive))
3276 printk ("%s: ide_cdrom_cleanup failed in "
3277 "ide_cdrom_init\n", drive->name);
3278 continue;
3279 }
3280 DRIVER(drive)->busy--;
3281 failed--;
3282 }
3283#endif
3284 ide_register_module(&ide_cdrom_module);
3285 MOD_DEC_USE_COUNT;
3286 return 0;
3287}
3288
3289module_init(ide_cdrom_init);
3290module_exit(ide_cdrom_exit);
3291MODULE_LICENSE("GPL");
3292