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#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
246
247#define REVISION "Revision: 3.20"
248#define VERSION "Id: cdrom.c 3.20 2003/12/17"
249
250
251
252#define CD_NOTHING 0x0
253#define CD_WARNING 0x1
254#define CD_REG_UNREG 0x2
255#define CD_DO_IOCTL 0x4
256#define CD_OPEN 0x8
257#define CD_CLOSE 0x10
258#define CD_COUNT_TRACKS 0x20
259#define CD_CHANGER 0x40
260#define CD_DVD 0x80
261
262
263
264#define ERRLOGMASK CD_WARNING
265
266
267
268#include <linux/module.h>
269#include <linux/fs.h>
270#include <linux/buffer_head.h>
271#include <linux/major.h>
272#include <linux/types.h>
273#include <linux/errno.h>
274#include <linux/kernel.h>
275#include <linux/mm.h>
276#include <linux/slab.h>
277#include <linux/cdrom.h>
278#include <linux/sysctl.h>
279#include <linux/proc_fs.h>
280#include <linux/blkpg.h>
281#include <linux/init.h>
282#include <linux/fcntl.h>
283#include <linux/blkdev.h>
284#include <linux/times.h>
285
286#include <asm/uaccess.h>
287
288
289static int debug;
290
291static int keeplocked;
292
293static int autoclose=1;
294static int autoeject;
295static int lockdoor = 1;
296
297static int check_media_type;
298
299static int mrw_format_restart = 1;
300module_param(debug, bool, 0);
301module_param(autoclose, bool, 0);
302module_param(autoeject, bool, 0);
303module_param(lockdoor, bool, 0);
304module_param(check_media_type, bool, 0);
305module_param(mrw_format_restart, bool, 0);
306
307static DEFINE_MUTEX(cdrom_mutex);
308
309static const char *mrw_format_status[] = {
310 "not mrw",
311 "bgformat inactive",
312 "bgformat active",
313 "mrw complete",
314};
315
316static const char *mrw_address_space[] = { "DMA", "GAA" };
317
318#if (ERRLOGMASK!=CD_NOTHING)
319#define cdinfo(type, fmt, args...) \
320do { \
321 if ((ERRLOGMASK & type) || debug == 1) \
322 pr_info(fmt, ##args); \
323} while (0)
324#else
325#define cdinfo(type, fmt, args...) \
326do { \
327 if (0 && (ERRLOGMASK & type) || debug == 1) \
328 pr_info(fmt, ##args); \
329} while (0)
330#endif
331
332
333#define IOCTL_IN(arg, type, in) \
334 if (copy_from_user(&(in), (type __user *) (arg), sizeof (in))) \
335 return -EFAULT;
336
337#define IOCTL_OUT(arg, type, out) \
338 if (copy_to_user((type __user *) (arg), &(out), sizeof (out))) \
339 return -EFAULT;
340
341
342
343#define CDROM_CAN(type) (cdi->ops->capability & ~cdi->mask & (type))
344
345
346#define CHECKAUDIO if ((ret=check_for_audio_disc(cdi, cdo))) return ret
347
348
349
350
351
352#define CDROM_DEF_TIMEOUT (7 * HZ)
353
354
355static int open_for_data(struct cdrom_device_info * cdi);
356static int check_for_audio_disc(struct cdrom_device_info * cdi,
357 struct cdrom_device_ops * cdo);
358static void sanitize_format(union cdrom_addr *addr,
359 u_char * curr, u_char requested);
360static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
361 unsigned long arg);
362
363int cdrom_get_last_written(struct cdrom_device_info *, long *);
364static int cdrom_get_next_writable(struct cdrom_device_info *, long *);
365static void cdrom_count_tracks(struct cdrom_device_info *, tracktype*);
366
367static int cdrom_mrw_exit(struct cdrom_device_info *cdi);
368
369static int cdrom_get_disc_info(struct cdrom_device_info *cdi, disc_information *di);
370
371static void cdrom_sysctl_register(void);
372
373static LIST_HEAD(cdrom_list);
374
375static int cdrom_dummy_generic_packet(struct cdrom_device_info *cdi,
376 struct packet_command *cgc)
377{
378 if (cgc->sense) {
379 cgc->sense->sense_key = 0x05;
380 cgc->sense->asc = 0x20;
381 cgc->sense->ascq = 0x00;
382 }
383
384 cgc->stat = -EIO;
385 return -EIO;
386}
387
388
389
390
391
392
393#define ENSURE(call, bits) if (cdo->call == NULL) *change_capability &= ~(bits)
394
395int register_cdrom(struct cdrom_device_info *cdi)
396{
397 static char banner_printed;
398 struct cdrom_device_ops *cdo = cdi->ops;
399 int *change_capability = (int *)&cdo->capability;
400
401 cdinfo(CD_OPEN, "entering register_cdrom\n");
402
403 if (cdo->open == NULL || cdo->release == NULL)
404 return -EINVAL;
405 if (!banner_printed) {
406 pr_info("Uniform CD-ROM driver " REVISION "\n");
407 banner_printed = 1;
408 cdrom_sysctl_register();
409 }
410
411 ENSURE(drive_status, CDC_DRIVE_STATUS );
412 if (cdo->check_events == NULL && cdo->media_changed == NULL)
413 *change_capability = ~(CDC_MEDIA_CHANGED | CDC_SELECT_DISC);
414 ENSURE(tray_move, CDC_CLOSE_TRAY | CDC_OPEN_TRAY);
415 ENSURE(lock_door, CDC_LOCK);
416 ENSURE(select_speed, CDC_SELECT_SPEED);
417 ENSURE(get_last_session, CDC_MULTI_SESSION);
418 ENSURE(get_mcn, CDC_MCN);
419 ENSURE(reset, CDC_RESET);
420 ENSURE(generic_packet, CDC_GENERIC_PACKET);
421 cdi->mc_flags = 0;
422 cdo->n_minors = 0;
423 cdi->options = CDO_USE_FFLAGS;
424
425 if (autoclose==1 && CDROM_CAN(CDC_CLOSE_TRAY))
426 cdi->options |= (int) CDO_AUTO_CLOSE;
427 if (autoeject==1 && CDROM_CAN(CDC_OPEN_TRAY))
428 cdi->options |= (int) CDO_AUTO_EJECT;
429 if (lockdoor==1)
430 cdi->options |= (int) CDO_LOCK;
431 if (check_media_type==1)
432 cdi->options |= (int) CDO_CHECK_TYPE;
433
434 if (CDROM_CAN(CDC_MRW_W))
435 cdi->exit = cdrom_mrw_exit;
436
437 if (cdi->disk)
438 cdi->cdda_method = CDDA_BPC_FULL;
439 else
440 cdi->cdda_method = CDDA_OLD;
441
442 if (!cdo->generic_packet)
443 cdo->generic_packet = cdrom_dummy_generic_packet;
444
445 cdinfo(CD_REG_UNREG, "drive \"/dev/%s\" registered\n", cdi->name);
446 mutex_lock(&cdrom_mutex);
447 list_add(&cdi->list, &cdrom_list);
448 mutex_unlock(&cdrom_mutex);
449 return 0;
450}
451#undef ENSURE
452
453void unregister_cdrom(struct cdrom_device_info *cdi)
454{
455 cdinfo(CD_OPEN, "entering unregister_cdrom\n");
456
457 mutex_lock(&cdrom_mutex);
458 list_del(&cdi->list);
459 mutex_unlock(&cdrom_mutex);
460
461 if (cdi->exit)
462 cdi->exit(cdi);
463
464 cdi->ops->n_minors--;
465 cdinfo(CD_REG_UNREG, "drive \"/dev/%s\" unregistered\n", cdi->name);
466}
467
468int cdrom_get_media_event(struct cdrom_device_info *cdi,
469 struct media_event_desc *med)
470{
471 struct packet_command cgc;
472 unsigned char buffer[8];
473 struct event_header *eh = (struct event_header *) buffer;
474
475 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
476 cgc.cmd[0] = GPCMD_GET_EVENT_STATUS_NOTIFICATION;
477 cgc.cmd[1] = 1;
478 cgc.cmd[4] = 1 << 4;
479 cgc.cmd[8] = sizeof(buffer);
480 cgc.quiet = 1;
481
482 if (cdi->ops->generic_packet(cdi, &cgc))
483 return 1;
484
485 if (be16_to_cpu(eh->data_len) < sizeof(*med))
486 return 1;
487
488 if (eh->nea || eh->notification_class != 0x4)
489 return 1;
490
491 memcpy(med, &buffer[sizeof(*eh)], sizeof(*med));
492 return 0;
493}
494
495
496
497
498
499static int cdrom_mrw_probe_pc(struct cdrom_device_info *cdi)
500{
501 struct packet_command cgc;
502 char buffer[16];
503
504 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
505
506 cgc.timeout = HZ;
507 cgc.quiet = 1;
508
509 if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC, 0)) {
510 cdi->mrw_mode_page = MRW_MODE_PC;
511 return 0;
512 } else if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC_PRE1, 0)) {
513 cdi->mrw_mode_page = MRW_MODE_PC_PRE1;
514 return 0;
515 }
516
517 return 1;
518}
519
520static int cdrom_is_mrw(struct cdrom_device_info *cdi, int *write)
521{
522 struct packet_command cgc;
523 struct mrw_feature_desc *mfd;
524 unsigned char buffer[16];
525 int ret;
526
527 *write = 0;
528
529 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
530
531 cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
532 cgc.cmd[3] = CDF_MRW;
533 cgc.cmd[8] = sizeof(buffer);
534 cgc.quiet = 1;
535
536 if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
537 return ret;
538
539 mfd = (struct mrw_feature_desc *)&buffer[sizeof(struct feature_header)];
540 if (be16_to_cpu(mfd->feature_code) != CDF_MRW)
541 return 1;
542 *write = mfd->write;
543
544 if ((ret = cdrom_mrw_probe_pc(cdi))) {
545 *write = 0;
546 return ret;
547 }
548
549 return 0;
550}
551
552static int cdrom_mrw_bgformat(struct cdrom_device_info *cdi, int cont)
553{
554 struct packet_command cgc;
555 unsigned char buffer[12];
556 int ret;
557
558 pr_info("%sstarting format\n", cont ? "Re" : "");
559
560
561
562
563 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_WRITE);
564 cgc.cmd[0] = GPCMD_FORMAT_UNIT;
565 cgc.cmd[1] = (1 << 4) | 1;
566
567 cgc.timeout = 5 * 60 * HZ;
568
569
570
571
572 buffer[1] = 1 << 1;
573 buffer[3] = 8;
574
575
576
577
578 buffer[4] = 0xff;
579 buffer[5] = 0xff;
580 buffer[6] = 0xff;
581 buffer[7] = 0xff;
582
583 buffer[8] = 0x24 << 2;
584 buffer[11] = cont;
585
586 ret = cdi->ops->generic_packet(cdi, &cgc);
587 if (ret)
588 pr_info("bgformat failed\n");
589
590 return ret;
591}
592
593static int cdrom_mrw_bgformat_susp(struct cdrom_device_info *cdi, int immed)
594{
595 struct packet_command cgc;
596
597 init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
598 cgc.cmd[0] = GPCMD_CLOSE_TRACK;
599
600
601
602
603 cgc.cmd[1] = !!immed;
604 cgc.cmd[2] = 1 << 1;
605
606 cgc.timeout = 5 * 60 * HZ;
607
608 return cdi->ops->generic_packet(cdi, &cgc);
609}
610
611static int cdrom_flush_cache(struct cdrom_device_info *cdi)
612{
613 struct packet_command cgc;
614
615 init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
616 cgc.cmd[0] = GPCMD_FLUSH_CACHE;
617
618 cgc.timeout = 5 * 60 * HZ;
619
620 return cdi->ops->generic_packet(cdi, &cgc);
621}
622
623static int cdrom_mrw_exit(struct cdrom_device_info *cdi)
624{
625 disc_information di;
626 int ret;
627
628 ret = cdrom_get_disc_info(cdi, &di);
629 if (ret < 0 || ret < (int)offsetof(typeof(di),disc_type))
630 return 1;
631
632 ret = 0;
633 if (di.mrw_status == CDM_MRW_BGFORMAT_ACTIVE) {
634 pr_info("issuing MRW background format suspend\n");
635 ret = cdrom_mrw_bgformat_susp(cdi, 0);
636 }
637
638 if (!ret && cdi->media_written)
639 ret = cdrom_flush_cache(cdi);
640
641 return ret;
642}
643
644static int cdrom_mrw_set_lba_space(struct cdrom_device_info *cdi, int space)
645{
646 struct packet_command cgc;
647 struct mode_page_header *mph;
648 char buffer[16];
649 int ret, offset, size;
650
651 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
652
653 cgc.buffer = buffer;
654 cgc.buflen = sizeof(buffer);
655
656 if ((ret = cdrom_mode_sense(cdi, &cgc, cdi->mrw_mode_page, 0)))
657 return ret;
658
659 mph = (struct mode_page_header *) buffer;
660 offset = be16_to_cpu(mph->desc_length);
661 size = be16_to_cpu(mph->mode_data_length) + 2;
662
663 buffer[offset + 3] = space;
664 cgc.buflen = size;
665
666 if ((ret = cdrom_mode_select(cdi, &cgc)))
667 return ret;
668
669 pr_info("%s: mrw address space %s selected\n",
670 cdi->name, mrw_address_space[space]);
671 return 0;
672}
673
674static int cdrom_get_random_writable(struct cdrom_device_info *cdi,
675 struct rwrt_feature_desc *rfd)
676{
677 struct packet_command cgc;
678 char buffer[24];
679 int ret;
680
681 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
682
683 cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
684 cgc.cmd[3] = CDF_RWRT;
685 cgc.cmd[8] = sizeof(buffer);
686 cgc.quiet = 1;
687
688 if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
689 return ret;
690
691 memcpy(rfd, &buffer[sizeof(struct feature_header)], sizeof (*rfd));
692 return 0;
693}
694
695static int cdrom_has_defect_mgt(struct cdrom_device_info *cdi)
696{
697 struct packet_command cgc;
698 char buffer[16];
699 __be16 *feature_code;
700 int ret;
701
702 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
703
704 cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
705 cgc.cmd[3] = CDF_HWDM;
706 cgc.cmd[8] = sizeof(buffer);
707 cgc.quiet = 1;
708
709 if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
710 return ret;
711
712 feature_code = (__be16 *) &buffer[sizeof(struct feature_header)];
713 if (be16_to_cpu(*feature_code) == CDF_HWDM)
714 return 0;
715
716 return 1;
717}
718
719
720static int cdrom_is_random_writable(struct cdrom_device_info *cdi, int *write)
721{
722 struct rwrt_feature_desc rfd;
723 int ret;
724
725 *write = 0;
726
727 if ((ret = cdrom_get_random_writable(cdi, &rfd)))
728 return ret;
729
730 if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
731 *write = 1;
732
733 return 0;
734}
735
736static int cdrom_media_erasable(struct cdrom_device_info *cdi)
737{
738 disc_information di;
739 int ret;
740
741 ret = cdrom_get_disc_info(cdi, &di);
742 if (ret < 0 || ret < offsetof(typeof(di), n_first_track))
743 return -1;
744
745 return di.erasable;
746}
747
748
749
750
751static int cdrom_dvdram_open_write(struct cdrom_device_info *cdi)
752{
753 int ret = cdrom_media_erasable(cdi);
754
755
756
757
758
759 if (!ret)
760 return 1;
761
762 return 0;
763}
764
765static int cdrom_mrw_open_write(struct cdrom_device_info *cdi)
766{
767 disc_information di;
768 int ret;
769
770
771
772
773 if (cdrom_mrw_set_lba_space(cdi, MRW_LBA_DMA)) {
774 pr_err("failed setting lba address space\n");
775 return 1;
776 }
777
778 ret = cdrom_get_disc_info(cdi, &di);
779 if (ret < 0 || ret < offsetof(typeof(di),disc_type))
780 return 1;
781
782 if (!di.erasable)
783 return 1;
784
785
786
787
788
789
790
791
792 ret = 0;
793 pr_info("open: mrw_status '%s'\n", mrw_format_status[di.mrw_status]);
794 if (!di.mrw_status)
795 ret = 1;
796 else if (di.mrw_status == CDM_MRW_BGFORMAT_INACTIVE &&
797 mrw_format_restart)
798 ret = cdrom_mrw_bgformat(cdi, 1);
799
800 return ret;
801}
802
803static int mo_open_write(struct cdrom_device_info *cdi)
804{
805 struct packet_command cgc;
806 char buffer[255];
807 int ret;
808
809 init_cdrom_command(&cgc, &buffer, 4, CGC_DATA_READ);
810 cgc.quiet = 1;
811
812
813
814
815
816
817 ret = cdrom_mode_sense(cdi, &cgc, GPMODE_ALL_PAGES, 0);
818 if (ret)
819 ret = cdrom_mode_sense(cdi, &cgc, GPMODE_VENDOR_PAGE, 0);
820 if (ret) {
821 cgc.buflen = 255;
822 ret = cdrom_mode_sense(cdi, &cgc, GPMODE_ALL_PAGES, 0);
823 }
824
825
826 if (ret)
827 return 0;
828
829 return buffer[3] & 0x80;
830}
831
832static int cdrom_ram_open_write(struct cdrom_device_info *cdi)
833{
834 struct rwrt_feature_desc rfd;
835 int ret;
836
837 if ((ret = cdrom_has_defect_mgt(cdi)))
838 return ret;
839
840 if ((ret = cdrom_get_random_writable(cdi, &rfd)))
841 return ret;
842 else if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
843 ret = !rfd.curr;
844
845 cdinfo(CD_OPEN, "can open for random write\n");
846 return ret;
847}
848
849static void cdrom_mmc3_profile(struct cdrom_device_info *cdi)
850{
851 struct packet_command cgc;
852 char buffer[32];
853 int ret, mmc3_profile;
854
855 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
856
857 cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
858 cgc.cmd[1] = 0;
859 cgc.cmd[2] = cgc.cmd[3] = 0;
860 cgc.cmd[8] = sizeof(buffer);
861 cgc.quiet = 1;
862
863 if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
864 mmc3_profile = 0xffff;
865 else
866 mmc3_profile = (buffer[6] << 8) | buffer[7];
867
868 cdi->mmc3_profile = mmc3_profile;
869}
870
871static int cdrom_is_dvd_rw(struct cdrom_device_info *cdi)
872{
873 switch (cdi->mmc3_profile) {
874 case 0x12:
875 case 0x1A:
876 return 0;
877 default:
878 return 1;
879 }
880}
881
882
883
884
885static int cdrom_open_write(struct cdrom_device_info *cdi)
886{
887 int mrw, mrw_write, ram_write;
888 int ret = 1;
889
890 mrw = 0;
891 if (!cdrom_is_mrw(cdi, &mrw_write))
892 mrw = 1;
893
894 if (CDROM_CAN(CDC_MO_DRIVE))
895 ram_write = 1;
896 else
897 (void) cdrom_is_random_writable(cdi, &ram_write);
898
899 if (mrw)
900 cdi->mask &= ~CDC_MRW;
901 else
902 cdi->mask |= CDC_MRW;
903
904 if (mrw_write)
905 cdi->mask &= ~CDC_MRW_W;
906 else
907 cdi->mask |= CDC_MRW_W;
908
909 if (ram_write)
910 cdi->mask &= ~CDC_RAM;
911 else
912 cdi->mask |= CDC_RAM;
913
914 if (CDROM_CAN(CDC_MRW_W))
915 ret = cdrom_mrw_open_write(cdi);
916 else if (CDROM_CAN(CDC_DVD_RAM))
917 ret = cdrom_dvdram_open_write(cdi);
918 else if (CDROM_CAN(CDC_RAM) &&
919 !CDROM_CAN(CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_MRW|CDC_MO_DRIVE))
920 ret = cdrom_ram_open_write(cdi);
921 else if (CDROM_CAN(CDC_MO_DRIVE))
922 ret = mo_open_write(cdi);
923 else if (!cdrom_is_dvd_rw(cdi))
924 ret = 0;
925
926 return ret;
927}
928
929static void cdrom_dvd_rw_close_write(struct cdrom_device_info *cdi)
930{
931 struct packet_command cgc;
932
933 if (cdi->mmc3_profile != 0x1a) {
934 cdinfo(CD_CLOSE, "%s: No DVD+RW\n", cdi->name);
935 return;
936 }
937
938 if (!cdi->media_written) {
939 cdinfo(CD_CLOSE, "%s: DVD+RW media clean\n", cdi->name);
940 return;
941 }
942
943 pr_info("%s: dirty DVD+RW media, \"finalizing\"\n", cdi->name);
944
945 init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
946 cgc.cmd[0] = GPCMD_FLUSH_CACHE;
947 cgc.timeout = 30*HZ;
948 cdi->ops->generic_packet(cdi, &cgc);
949
950 init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
951 cgc.cmd[0] = GPCMD_CLOSE_TRACK;
952 cgc.timeout = 3000*HZ;
953 cgc.quiet = 1;
954 cdi->ops->generic_packet(cdi, &cgc);
955
956 init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
957 cgc.cmd[0] = GPCMD_CLOSE_TRACK;
958 cgc.cmd[2] = 2;
959 cgc.quiet = 1;
960 cgc.timeout = 3000*HZ;
961 cdi->ops->generic_packet(cdi, &cgc);
962
963 cdi->media_written = 0;
964}
965
966static int cdrom_close_write(struct cdrom_device_info *cdi)
967{
968#if 0
969 return cdrom_flush_cache(cdi);
970#else
971 return 0;
972#endif
973}
974
975
976
977
978
979
980
981
982
983int cdrom_open(struct cdrom_device_info *cdi, struct block_device *bdev, fmode_t mode)
984{
985 int ret;
986
987 cdinfo(CD_OPEN, "entering cdrom_open\n");
988
989
990 check_disk_change(bdev);
991
992
993
994 cdi->use_count++;
995 if ((mode & FMODE_NDELAY) && (cdi->options & CDO_USE_FFLAGS)) {
996 ret = cdi->ops->open(cdi, 1);
997 } else {
998 ret = open_for_data(cdi);
999 if (ret)
1000 goto err;
1001 cdrom_mmc3_profile(cdi);
1002 if (mode & FMODE_WRITE) {
1003 ret = -EROFS;
1004 if (cdrom_open_write(cdi))
1005 goto err_release;
1006 if (!CDROM_CAN(CDC_RAM))
1007 goto err_release;
1008 ret = 0;
1009 cdi->media_written = 0;
1010 }
1011 }
1012
1013 if (ret)
1014 goto err;
1015
1016 cdinfo(CD_OPEN, "Use count for \"/dev/%s\" now %d\n",
1017 cdi->name, cdi->use_count);
1018 return 0;
1019err_release:
1020 if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) {
1021 cdi->ops->lock_door(cdi, 0);
1022 cdinfo(CD_OPEN, "door unlocked.\n");
1023 }
1024 cdi->ops->release(cdi);
1025err:
1026 cdi->use_count--;
1027 return ret;
1028}
1029
1030static
1031int open_for_data(struct cdrom_device_info * cdi)
1032{
1033 int ret;
1034 struct cdrom_device_ops *cdo = cdi->ops;
1035 tracktype tracks;
1036 cdinfo(CD_OPEN, "entering open_for_data\n");
1037
1038
1039 if (cdo->drive_status != NULL) {
1040 ret = cdo->drive_status(cdi, CDSL_CURRENT);
1041 cdinfo(CD_OPEN, "drive_status=%d\n", ret);
1042 if (ret == CDS_TRAY_OPEN) {
1043 cdinfo(CD_OPEN, "the tray is open...\n");
1044
1045 if (CDROM_CAN(CDC_CLOSE_TRAY) &&
1046 cdi->options & CDO_AUTO_CLOSE) {
1047 cdinfo(CD_OPEN, "trying to close the tray.\n");
1048 ret=cdo->tray_move(cdi,0);
1049 if (ret) {
1050 cdinfo(CD_OPEN, "bummer. tried to close the tray but failed.\n");
1051
1052
1053
1054
1055
1056 ret=-ENOMEDIUM;
1057 goto clean_up_and_return;
1058 }
1059 } else {
1060 cdinfo(CD_OPEN, "bummer. this drive can't close the tray.\n");
1061 ret=-ENOMEDIUM;
1062 goto clean_up_and_return;
1063 }
1064
1065 ret = cdo->drive_status(cdi, CDSL_CURRENT);
1066 if ((ret == CDS_NO_DISC) || (ret==CDS_TRAY_OPEN)) {
1067 cdinfo(CD_OPEN, "bummer. the tray is still not closed.\n");
1068 cdinfo(CD_OPEN, "tray might not contain a medium.\n");
1069 ret=-ENOMEDIUM;
1070 goto clean_up_and_return;
1071 }
1072 cdinfo(CD_OPEN, "the tray is now closed.\n");
1073 }
1074
1075 ret = cdo->drive_status(cdi, CDSL_CURRENT);
1076 if (ret!=CDS_DISC_OK) {
1077 ret = -ENOMEDIUM;
1078 goto clean_up_and_return;
1079 }
1080 }
1081 cdrom_count_tracks(cdi, &tracks);
1082 if (tracks.error == CDS_NO_DISC) {
1083 cdinfo(CD_OPEN, "bummer. no disc.\n");
1084 ret=-ENOMEDIUM;
1085 goto clean_up_and_return;
1086 }
1087
1088
1089 if (tracks.data==0) {
1090 if (cdi->options & CDO_CHECK_TYPE) {
1091
1092
1093 cdinfo(CD_OPEN, "bummer. wrong media type.\n");
1094 cdinfo(CD_WARNING, "pid %d must open device O_NONBLOCK!\n",
1095 (unsigned int)task_pid_nr(current));
1096 ret=-EMEDIUMTYPE;
1097 goto clean_up_and_return;
1098 }
1099 else {
1100 cdinfo(CD_OPEN, "wrong media type, but CDO_CHECK_TYPE not set.\n");
1101 }
1102 }
1103
1104 cdinfo(CD_OPEN, "all seems well, opening the device.\n");
1105
1106
1107 ret = cdo->open(cdi, 0);
1108 cdinfo(CD_OPEN, "opening the device gave me %d.\n", ret);
1109
1110
1111
1112 if (ret) {
1113 cdinfo(CD_OPEN, "open device failed.\n");
1114 goto clean_up_and_return;
1115 }
1116 if (CDROM_CAN(CDC_LOCK) && (cdi->options & CDO_LOCK)) {
1117 cdo->lock_door(cdi, 1);
1118 cdinfo(CD_OPEN, "door locked.\n");
1119 }
1120 cdinfo(CD_OPEN, "device opened successfully.\n");
1121 return ret;
1122
1123
1124
1125
1126
1127
1128clean_up_and_return:
1129 cdinfo(CD_OPEN, "open failed.\n");
1130 if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) {
1131 cdo->lock_door(cdi, 0);
1132 cdinfo(CD_OPEN, "door unlocked.\n");
1133 }
1134 return ret;
1135}
1136
1137
1138
1139
1140static int check_for_audio_disc(struct cdrom_device_info * cdi,
1141 struct cdrom_device_ops * cdo)
1142{
1143 int ret;
1144 tracktype tracks;
1145 cdinfo(CD_OPEN, "entering check_for_audio_disc\n");
1146 if (!(cdi->options & CDO_CHECK_TYPE))
1147 return 0;
1148 if (cdo->drive_status != NULL) {
1149 ret = cdo->drive_status(cdi, CDSL_CURRENT);
1150 cdinfo(CD_OPEN, "drive_status=%d\n", ret);
1151 if (ret == CDS_TRAY_OPEN) {
1152 cdinfo(CD_OPEN, "the tray is open...\n");
1153
1154 if (CDROM_CAN(CDC_CLOSE_TRAY) &&
1155 cdi->options & CDO_AUTO_CLOSE) {
1156 cdinfo(CD_OPEN, "trying to close the tray.\n");
1157 ret=cdo->tray_move(cdi,0);
1158 if (ret) {
1159 cdinfo(CD_OPEN, "bummer. tried to close tray but failed.\n");
1160
1161
1162
1163
1164
1165 return -ENOMEDIUM;
1166 }
1167 } else {
1168 cdinfo(CD_OPEN, "bummer. this driver can't close the tray.\n");
1169 return -ENOMEDIUM;
1170 }
1171
1172 ret = cdo->drive_status(cdi, CDSL_CURRENT);
1173 if ((ret == CDS_NO_DISC) || (ret==CDS_TRAY_OPEN)) {
1174 cdinfo(CD_OPEN, "bummer. the tray is still not closed.\n");
1175 return -ENOMEDIUM;
1176 }
1177 if (ret!=CDS_DISC_OK) {
1178 cdinfo(CD_OPEN, "bummer. disc isn't ready.\n");
1179 return -EIO;
1180 }
1181 cdinfo(CD_OPEN, "the tray is now closed.\n");
1182 }
1183 }
1184 cdrom_count_tracks(cdi, &tracks);
1185 if (tracks.error)
1186 return(tracks.error);
1187
1188 if (tracks.audio==0)
1189 return -EMEDIUMTYPE;
1190
1191 return 0;
1192}
1193
1194void cdrom_release(struct cdrom_device_info *cdi, fmode_t mode)
1195{
1196 struct cdrom_device_ops *cdo = cdi->ops;
1197 int opened_for_data;
1198
1199 cdinfo(CD_CLOSE, "entering cdrom_release\n");
1200
1201 if (cdi->use_count > 0)
1202 cdi->use_count--;
1203
1204 if (cdi->use_count == 0) {
1205 cdinfo(CD_CLOSE, "Use count for \"/dev/%s\" now zero\n", cdi->name);
1206 cdrom_dvd_rw_close_write(cdi);
1207
1208 if ((cdo->capability & CDC_LOCK) && !keeplocked) {
1209 cdinfo(CD_CLOSE, "Unlocking door!\n");
1210 cdo->lock_door(cdi, 0);
1211 }
1212 }
1213
1214 opened_for_data = !(cdi->options & CDO_USE_FFLAGS) ||
1215 !(mode & FMODE_NDELAY);
1216
1217
1218
1219
1220 if (CDROM_CAN(CDC_RAM) && !cdi->use_count && cdi->for_data)
1221 cdrom_close_write(cdi);
1222
1223 cdo->release(cdi);
1224 if (cdi->use_count == 0) {
1225 if (opened_for_data &&
1226 cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY))
1227 cdo->tray_move(cdi, 1);
1228 }
1229}
1230
1231static int cdrom_read_mech_status(struct cdrom_device_info *cdi,
1232 struct cdrom_changer_info *buf)
1233{
1234 struct packet_command cgc;
1235 struct cdrom_device_ops *cdo = cdi->ops;
1236 int length;
1237
1238
1239
1240
1241
1242
1243 if (cdi->sanyo_slot) {
1244 buf->hdr.nslots = 3;
1245 buf->hdr.curslot = cdi->sanyo_slot == 3 ? 0 : cdi->sanyo_slot;
1246 for (length = 0; length < 3; length++) {
1247 buf->slots[length].disc_present = 1;
1248 buf->slots[length].change = 0;
1249 }
1250 return 0;
1251 }
1252
1253 length = sizeof(struct cdrom_mechstat_header) +
1254 cdi->capacity * sizeof(struct cdrom_slot);
1255
1256 init_cdrom_command(&cgc, buf, length, CGC_DATA_READ);
1257 cgc.cmd[0] = GPCMD_MECHANISM_STATUS;
1258 cgc.cmd[8] = (length >> 8) & 0xff;
1259 cgc.cmd[9] = length & 0xff;
1260 return cdo->generic_packet(cdi, &cgc);
1261}
1262
1263static int cdrom_slot_status(struct cdrom_device_info *cdi, int slot)
1264{
1265 struct cdrom_changer_info *info;
1266 int ret;
1267
1268 cdinfo(CD_CHANGER, "entering cdrom_slot_status()\n");
1269 if (cdi->sanyo_slot)
1270 return CDS_NO_INFO;
1271
1272 info = kmalloc(sizeof(*info), GFP_KERNEL);
1273 if (!info)
1274 return -ENOMEM;
1275
1276 if ((ret = cdrom_read_mech_status(cdi, info)))
1277 goto out_free;
1278
1279 if (info->slots[slot].disc_present)
1280 ret = CDS_DISC_OK;
1281 else
1282 ret = CDS_NO_DISC;
1283
1284out_free:
1285 kfree(info);
1286 return ret;
1287}
1288
1289
1290
1291
1292int cdrom_number_of_slots(struct cdrom_device_info *cdi)
1293{
1294 int status;
1295 int nslots = 1;
1296 struct cdrom_changer_info *info;
1297
1298 cdinfo(CD_CHANGER, "entering cdrom_number_of_slots()\n");
1299
1300 cdi->capacity = 0;
1301
1302 info = kmalloc(sizeof(*info), GFP_KERNEL);
1303 if (!info)
1304 return -ENOMEM;
1305
1306 if ((status = cdrom_read_mech_status(cdi, info)) == 0)
1307 nslots = info->hdr.nslots;
1308
1309 kfree(info);
1310 return nslots;
1311}
1312
1313
1314
1315static int cdrom_load_unload(struct cdrom_device_info *cdi, int slot)
1316{
1317 struct packet_command cgc;
1318
1319 cdinfo(CD_CHANGER, "entering cdrom_load_unload()\n");
1320 if (cdi->sanyo_slot && slot < 0)
1321 return 0;
1322
1323 init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
1324 cgc.cmd[0] = GPCMD_LOAD_UNLOAD;
1325 cgc.cmd[4] = 2 + (slot >= 0);
1326 cgc.cmd[8] = slot;
1327 cgc.timeout = 60 * HZ;
1328
1329
1330
1331
1332 if (cdi->sanyo_slot && -1 < slot) {
1333 cgc.cmd[0] = GPCMD_TEST_UNIT_READY;
1334 cgc.cmd[7] = slot;
1335 cgc.cmd[4] = cgc.cmd[8] = 0;
1336 cdi->sanyo_slot = slot ? slot : 3;
1337 }
1338
1339 return cdi->ops->generic_packet(cdi, &cgc);
1340}
1341
1342static int cdrom_select_disc(struct cdrom_device_info *cdi, int slot)
1343{
1344 struct cdrom_changer_info *info;
1345 int curslot;
1346 int ret;
1347
1348 cdinfo(CD_CHANGER, "entering cdrom_select_disc()\n");
1349 if (!CDROM_CAN(CDC_SELECT_DISC))
1350 return -EDRIVE_CANT_DO_THIS;
1351
1352 if (cdi->ops->check_events)
1353 cdi->ops->check_events(cdi, 0, slot);
1354 else
1355 cdi->ops->media_changed(cdi, slot);
1356
1357 if (slot == CDSL_NONE) {
1358
1359 cdi->mc_flags = 0x3;
1360 return cdrom_load_unload(cdi, -1);
1361 }
1362
1363 info = kmalloc(sizeof(*info), GFP_KERNEL);
1364 if (!info)
1365 return -ENOMEM;
1366
1367 if ((ret = cdrom_read_mech_status(cdi, info))) {
1368 kfree(info);
1369 return ret;
1370 }
1371
1372 curslot = info->hdr.curslot;
1373 kfree(info);
1374
1375 if (cdi->use_count > 1 || keeplocked) {
1376 if (slot == CDSL_CURRENT) {
1377 return curslot;
1378 } else {
1379 return -EBUSY;
1380 }
1381 }
1382
1383
1384
1385
1386
1387
1388 if (slot == CDSL_CURRENT)
1389 slot = curslot;
1390
1391
1392 cdi->mc_flags = 0x3;
1393 if ((ret = cdrom_load_unload(cdi, slot)))
1394 return ret;
1395
1396 return slot;
1397}
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413static void cdrom_update_events(struct cdrom_device_info *cdi,
1414 unsigned int clearing)
1415{
1416 unsigned int events;
1417
1418 events = cdi->ops->check_events(cdi, clearing, CDSL_CURRENT);
1419 cdi->vfs_events |= events;
1420 cdi->ioctl_events |= events;
1421}
1422
1423unsigned int cdrom_check_events(struct cdrom_device_info *cdi,
1424 unsigned int clearing)
1425{
1426 unsigned int events;
1427
1428 cdrom_update_events(cdi, clearing);
1429 events = cdi->vfs_events;
1430 cdi->vfs_events = 0;
1431 return events;
1432}
1433EXPORT_SYMBOL(cdrom_check_events);
1434
1435
1436
1437
1438
1439
1440
1441static
1442int media_changed(struct cdrom_device_info *cdi, int queue)
1443{
1444 unsigned int mask = (1 << (queue & 1));
1445 int ret = !!(cdi->mc_flags & mask);
1446 bool changed;
1447
1448 if (!CDROM_CAN(CDC_MEDIA_CHANGED))
1449 return ret;
1450
1451
1452 if (cdi->ops->check_events) {
1453 BUG_ON(!queue);
1454 cdrom_update_events(cdi, DISK_EVENT_MEDIA_CHANGE);
1455 changed = cdi->ioctl_events & DISK_EVENT_MEDIA_CHANGE;
1456 cdi->ioctl_events = 0;
1457 } else
1458 changed = cdi->ops->media_changed(cdi, CDSL_CURRENT);
1459
1460 if (changed) {
1461 cdi->mc_flags = 0x3;
1462 ret |= 1;
1463 cdi->media_written = 0;
1464 }
1465
1466 cdi->mc_flags &= ~mask;
1467 return ret;
1468}
1469
1470int cdrom_media_changed(struct cdrom_device_info *cdi)
1471{
1472
1473
1474
1475 if (cdi == NULL || cdi->ops->media_changed == NULL)
1476 return 0;
1477 if (!CDROM_CAN(CDC_MEDIA_CHANGED))
1478 return 0;
1479 return media_changed(cdi, 0);
1480}
1481
1482
1483static void cdrom_count_tracks(struct cdrom_device_info *cdi, tracktype* tracks)
1484{
1485 struct cdrom_tochdr header;
1486 struct cdrom_tocentry entry;
1487 int ret, i;
1488 tracks->data=0;
1489 tracks->audio=0;
1490 tracks->cdi=0;
1491 tracks->xa=0;
1492 tracks->error=0;
1493 cdinfo(CD_COUNT_TRACKS, "entering cdrom_count_tracks\n");
1494
1495 if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header))) {
1496 if (ret == -ENOMEDIUM)
1497 tracks->error = CDS_NO_DISC;
1498 else
1499 tracks->error = CDS_NO_INFO;
1500 return;
1501 }
1502
1503 entry.cdte_format = CDROM_MSF;
1504 for (i = header.cdth_trk0; i <= header.cdth_trk1; i++) {
1505 entry.cdte_track = i;
1506 if (cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &entry)) {
1507 tracks->error=CDS_NO_INFO;
1508 return;
1509 }
1510 if (entry.cdte_ctrl & CDROM_DATA_TRACK) {
1511 if (entry.cdte_format == 0x10)
1512 tracks->cdi++;
1513 else if (entry.cdte_format == 0x20)
1514 tracks->xa++;
1515 else
1516 tracks->data++;
1517 } else
1518 tracks->audio++;
1519 cdinfo(CD_COUNT_TRACKS, "track %d: format=%d, ctrl=%d\n",
1520 i, entry.cdte_format, entry.cdte_ctrl);
1521 }
1522 cdinfo(CD_COUNT_TRACKS, "disc has %d tracks: %d=audio %d=data %d=Cd-I %d=XA\n",
1523 header.cdth_trk1, tracks->audio, tracks->data,
1524 tracks->cdi, tracks->xa);
1525}
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543static
1544void sanitize_format(union cdrom_addr *addr,
1545 u_char * curr, u_char requested)
1546{
1547 if (*curr == requested)
1548 return;
1549 if (requested == CDROM_LBA) {
1550 addr->lba = (int) addr->msf.frame +
1551 75 * (addr->msf.second - 2 + 60 * addr->msf.minute);
1552 } else {
1553 int lba = addr->lba;
1554 addr->msf.frame = lba % 75;
1555 lba /= 75;
1556 lba += 2;
1557 addr->msf.second = lba % 60;
1558 addr->msf.minute = lba / 60;
1559 }
1560 *curr = requested;
1561}
1562
1563void init_cdrom_command(struct packet_command *cgc, void *buf, int len,
1564 int type)
1565{
1566 memset(cgc, 0, sizeof(struct packet_command));
1567 if (buf)
1568 memset(buf, 0, len);
1569 cgc->buffer = (char *) buf;
1570 cgc->buflen = len;
1571 cgc->data_direction = type;
1572 cgc->timeout = CDROM_DEF_TIMEOUT;
1573}
1574
1575
1576
1577#define copy_key(dest,src) memcpy((dest), (src), sizeof(dvd_key))
1578#define copy_chal(dest,src) memcpy((dest), (src), sizeof(dvd_challenge))
1579
1580static void setup_report_key(struct packet_command *cgc, unsigned agid, unsigned type)
1581{
1582 cgc->cmd[0] = GPCMD_REPORT_KEY;
1583 cgc->cmd[10] = type | (agid << 6);
1584 switch (type) {
1585 case 0: case 8: case 5: {
1586 cgc->buflen = 8;
1587 break;
1588 }
1589 case 1: {
1590 cgc->buflen = 16;
1591 break;
1592 }
1593 case 2: case 4: {
1594 cgc->buflen = 12;
1595 break;
1596 }
1597 }
1598 cgc->cmd[9] = cgc->buflen;
1599 cgc->data_direction = CGC_DATA_READ;
1600}
1601
1602static void setup_send_key(struct packet_command *cgc, unsigned agid, unsigned type)
1603{
1604 cgc->cmd[0] = GPCMD_SEND_KEY;
1605 cgc->cmd[10] = type | (agid << 6);
1606 switch (type) {
1607 case 1: {
1608 cgc->buflen = 16;
1609 break;
1610 }
1611 case 3: {
1612 cgc->buflen = 12;
1613 break;
1614 }
1615 case 6: {
1616 cgc->buflen = 8;
1617 break;
1618 }
1619 }
1620 cgc->cmd[9] = cgc->buflen;
1621 cgc->data_direction = CGC_DATA_WRITE;
1622}
1623
1624static int dvd_do_auth(struct cdrom_device_info *cdi, dvd_authinfo *ai)
1625{
1626 int ret;
1627 u_char buf[20];
1628 struct packet_command cgc;
1629 struct cdrom_device_ops *cdo = cdi->ops;
1630 rpc_state_t rpc_state;
1631
1632 memset(buf, 0, sizeof(buf));
1633 init_cdrom_command(&cgc, buf, 0, CGC_DATA_READ);
1634
1635 switch (ai->type) {
1636
1637 case DVD_LU_SEND_AGID:
1638 cdinfo(CD_DVD, "entering DVD_LU_SEND_AGID\n");
1639 cgc.quiet = 1;
1640 setup_report_key(&cgc, ai->lsa.agid, 0);
1641
1642 if ((ret = cdo->generic_packet(cdi, &cgc)))
1643 return ret;
1644
1645 ai->lsa.agid = buf[7] >> 6;
1646
1647 break;
1648
1649 case DVD_LU_SEND_KEY1:
1650 cdinfo(CD_DVD, "entering DVD_LU_SEND_KEY1\n");
1651 setup_report_key(&cgc, ai->lsk.agid, 2);
1652
1653 if ((ret = cdo->generic_packet(cdi, &cgc)))
1654 return ret;
1655
1656 copy_key(ai->lsk.key, &buf[4]);
1657
1658 break;
1659
1660 case DVD_LU_SEND_CHALLENGE:
1661 cdinfo(CD_DVD, "entering DVD_LU_SEND_CHALLENGE\n");
1662 setup_report_key(&cgc, ai->lsc.agid, 1);
1663
1664 if ((ret = cdo->generic_packet(cdi, &cgc)))
1665 return ret;
1666
1667 copy_chal(ai->lsc.chal, &buf[4]);
1668
1669 break;
1670
1671
1672 case DVD_LU_SEND_TITLE_KEY:
1673 cdinfo(CD_DVD, "entering DVD_LU_SEND_TITLE_KEY\n");
1674 cgc.quiet = 1;
1675 setup_report_key(&cgc, ai->lstk.agid, 4);
1676 cgc.cmd[5] = ai->lstk.lba;
1677 cgc.cmd[4] = ai->lstk.lba >> 8;
1678 cgc.cmd[3] = ai->lstk.lba >> 16;
1679 cgc.cmd[2] = ai->lstk.lba >> 24;
1680
1681 if ((ret = cdo->generic_packet(cdi, &cgc)))
1682 return ret;
1683
1684 ai->lstk.cpm = (buf[4] >> 7) & 1;
1685 ai->lstk.cp_sec = (buf[4] >> 6) & 1;
1686 ai->lstk.cgms = (buf[4] >> 4) & 3;
1687 copy_key(ai->lstk.title_key, &buf[5]);
1688
1689 break;
1690
1691 case DVD_LU_SEND_ASF:
1692 cdinfo(CD_DVD, "entering DVD_LU_SEND_ASF\n");
1693 setup_report_key(&cgc, ai->lsasf.agid, 5);
1694
1695 if ((ret = cdo->generic_packet(cdi, &cgc)))
1696 return ret;
1697
1698 ai->lsasf.asf = buf[7] & 1;
1699 break;
1700
1701
1702 case DVD_HOST_SEND_CHALLENGE:
1703 cdinfo(CD_DVD, "entering DVD_HOST_SEND_CHALLENGE\n");
1704 setup_send_key(&cgc, ai->hsc.agid, 1);
1705 buf[1] = 0xe;
1706 copy_chal(&buf[4], ai->hsc.chal);
1707
1708 if ((ret = cdo->generic_packet(cdi, &cgc)))
1709 return ret;
1710
1711 ai->type = DVD_LU_SEND_KEY1;
1712 break;
1713
1714 case DVD_HOST_SEND_KEY2:
1715 cdinfo(CD_DVD, "entering DVD_HOST_SEND_KEY2\n");
1716 setup_send_key(&cgc, ai->hsk.agid, 3);
1717 buf[1] = 0xa;
1718 copy_key(&buf[4], ai->hsk.key);
1719
1720 if ((ret = cdo->generic_packet(cdi, &cgc))) {
1721 ai->type = DVD_AUTH_FAILURE;
1722 return ret;
1723 }
1724 ai->type = DVD_AUTH_ESTABLISHED;
1725 break;
1726
1727
1728 case DVD_INVALIDATE_AGID:
1729 cgc.quiet = 1;
1730 cdinfo(CD_DVD, "entering DVD_INVALIDATE_AGID\n");
1731 setup_report_key(&cgc, ai->lsa.agid, 0x3f);
1732 if ((ret = cdo->generic_packet(cdi, &cgc)))
1733 return ret;
1734 break;
1735
1736
1737 case DVD_LU_SEND_RPC_STATE:
1738 cdinfo(CD_DVD, "entering DVD_LU_SEND_RPC_STATE\n");
1739 setup_report_key(&cgc, 0, 8);
1740 memset(&rpc_state, 0, sizeof(rpc_state_t));
1741 cgc.buffer = (char *) &rpc_state;
1742
1743 if ((ret = cdo->generic_packet(cdi, &cgc)))
1744 return ret;
1745
1746 ai->lrpcs.type = rpc_state.type_code;
1747 ai->lrpcs.vra = rpc_state.vra;
1748 ai->lrpcs.ucca = rpc_state.ucca;
1749 ai->lrpcs.region_mask = rpc_state.region_mask;
1750 ai->lrpcs.rpc_scheme = rpc_state.rpc_scheme;
1751 break;
1752
1753
1754 case DVD_HOST_SEND_RPC_STATE:
1755 cdinfo(CD_DVD, "entering DVD_HOST_SEND_RPC_STATE\n");
1756 setup_send_key(&cgc, 0, 6);
1757 buf[1] = 6;
1758 buf[4] = ai->hrpcs.pdrc;
1759
1760 if ((ret = cdo->generic_packet(cdi, &cgc)))
1761 return ret;
1762 break;
1763
1764 default:
1765 cdinfo(CD_WARNING, "Invalid DVD key ioctl (%d)\n", ai->type);
1766 return -ENOTTY;
1767 }
1768
1769 return 0;
1770}
1771
1772static int dvd_read_physical(struct cdrom_device_info *cdi, dvd_struct *s,
1773 struct packet_command *cgc)
1774{
1775 unsigned char buf[21], *base;
1776 struct dvd_layer *layer;
1777 struct cdrom_device_ops *cdo = cdi->ops;
1778 int ret, layer_num = s->physical.layer_num;
1779
1780 if (layer_num >= DVD_LAYERS)
1781 return -EINVAL;
1782
1783 init_cdrom_command(cgc, buf, sizeof(buf), CGC_DATA_READ);
1784 cgc->cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1785 cgc->cmd[6] = layer_num;
1786 cgc->cmd[7] = s->type;
1787 cgc->cmd[9] = cgc->buflen & 0xff;
1788
1789
1790
1791
1792 cgc->quiet = 1;
1793
1794 ret = cdo->generic_packet(cdi, cgc);
1795 if (ret)
1796 return ret;
1797
1798 base = &buf[4];
1799 layer = &s->physical.layer[layer_num];
1800
1801
1802
1803
1804
1805 memset(layer, 0, sizeof(*layer));
1806 layer->book_version = base[0] & 0xf;
1807 layer->book_type = base[0] >> 4;
1808 layer->min_rate = base[1] & 0xf;
1809 layer->disc_size = base[1] >> 4;
1810 layer->layer_type = base[2] & 0xf;
1811 layer->track_path = (base[2] >> 4) & 1;
1812 layer->nlayers = (base[2] >> 5) & 3;
1813 layer->track_density = base[3] & 0xf;
1814 layer->linear_density = base[3] >> 4;
1815 layer->start_sector = base[5] << 16 | base[6] << 8 | base[7];
1816 layer->end_sector = base[9] << 16 | base[10] << 8 | base[11];
1817 layer->end_sector_l0 = base[13] << 16 | base[14] << 8 | base[15];
1818 layer->bca = base[16] >> 7;
1819
1820 return 0;
1821}
1822
1823static int dvd_read_copyright(struct cdrom_device_info *cdi, dvd_struct *s,
1824 struct packet_command *cgc)
1825{
1826 int ret;
1827 u_char buf[8];
1828 struct cdrom_device_ops *cdo = cdi->ops;
1829
1830 init_cdrom_command(cgc, buf, sizeof(buf), CGC_DATA_READ);
1831 cgc->cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1832 cgc->cmd[6] = s->copyright.layer_num;
1833 cgc->cmd[7] = s->type;
1834 cgc->cmd[8] = cgc->buflen >> 8;
1835 cgc->cmd[9] = cgc->buflen & 0xff;
1836
1837 ret = cdo->generic_packet(cdi, cgc);
1838 if (ret)
1839 return ret;
1840
1841 s->copyright.cpst = buf[4];
1842 s->copyright.rmi = buf[5];
1843
1844 return 0;
1845}
1846
1847static int dvd_read_disckey(struct cdrom_device_info *cdi, dvd_struct *s,
1848 struct packet_command *cgc)
1849{
1850 int ret, size;
1851 u_char *buf;
1852 struct cdrom_device_ops *cdo = cdi->ops;
1853
1854 size = sizeof(s->disckey.value) + 4;
1855
1856 buf = kmalloc(size, GFP_KERNEL);
1857 if (!buf)
1858 return -ENOMEM;
1859
1860 init_cdrom_command(cgc, buf, size, CGC_DATA_READ);
1861 cgc->cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1862 cgc->cmd[7] = s->type;
1863 cgc->cmd[8] = size >> 8;
1864 cgc->cmd[9] = size & 0xff;
1865 cgc->cmd[10] = s->disckey.agid << 6;
1866
1867 ret = cdo->generic_packet(cdi, cgc);
1868 if (!ret)
1869 memcpy(s->disckey.value, &buf[4], sizeof(s->disckey.value));
1870
1871 kfree(buf);
1872 return ret;
1873}
1874
1875static int dvd_read_bca(struct cdrom_device_info *cdi, dvd_struct *s,
1876 struct packet_command *cgc)
1877{
1878 int ret, size = 4 + 188;
1879 u_char *buf;
1880 struct cdrom_device_ops *cdo = cdi->ops;
1881
1882 buf = kmalloc(size, GFP_KERNEL);
1883 if (!buf)
1884 return -ENOMEM;
1885
1886 init_cdrom_command(cgc, buf, size, CGC_DATA_READ);
1887 cgc->cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1888 cgc->cmd[7] = s->type;
1889 cgc->cmd[9] = cgc->buflen & 0xff;
1890
1891 ret = cdo->generic_packet(cdi, cgc);
1892 if (ret)
1893 goto out;
1894
1895 s->bca.len = buf[0] << 8 | buf[1];
1896 if (s->bca.len < 12 || s->bca.len > 188) {
1897 cdinfo(CD_WARNING, "Received invalid BCA length (%d)\n", s->bca.len);
1898 ret = -EIO;
1899 goto out;
1900 }
1901 memcpy(s->bca.value, &buf[4], s->bca.len);
1902 ret = 0;
1903out:
1904 kfree(buf);
1905 return ret;
1906}
1907
1908static int dvd_read_manufact(struct cdrom_device_info *cdi, dvd_struct *s,
1909 struct packet_command *cgc)
1910{
1911 int ret = 0, size;
1912 u_char *buf;
1913 struct cdrom_device_ops *cdo = cdi->ops;
1914
1915 size = sizeof(s->manufact.value) + 4;
1916
1917 buf = kmalloc(size, GFP_KERNEL);
1918 if (!buf)
1919 return -ENOMEM;
1920
1921 init_cdrom_command(cgc, buf, size, CGC_DATA_READ);
1922 cgc->cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1923 cgc->cmd[7] = s->type;
1924 cgc->cmd[8] = size >> 8;
1925 cgc->cmd[9] = size & 0xff;
1926
1927 ret = cdo->generic_packet(cdi, cgc);
1928 if (ret)
1929 goto out;
1930
1931 s->manufact.len = buf[0] << 8 | buf[1];
1932 if (s->manufact.len < 0) {
1933 cdinfo(CD_WARNING, "Received invalid manufacture info length"
1934 " (%d)\n", s->manufact.len);
1935 ret = -EIO;
1936 } else {
1937 if (s->manufact.len > 2048) {
1938 cdinfo(CD_WARNING, "Received invalid manufacture info "
1939 "length (%d): truncating to 2048\n",
1940 s->manufact.len);
1941 s->manufact.len = 2048;
1942 }
1943 memcpy(s->manufact.value, &buf[4], s->manufact.len);
1944 }
1945
1946out:
1947 kfree(buf);
1948 return ret;
1949}
1950
1951static int dvd_read_struct(struct cdrom_device_info *cdi, dvd_struct *s,
1952 struct packet_command *cgc)
1953{
1954 switch (s->type) {
1955 case DVD_STRUCT_PHYSICAL:
1956 return dvd_read_physical(cdi, s, cgc);
1957
1958 case DVD_STRUCT_COPYRIGHT:
1959 return dvd_read_copyright(cdi, s, cgc);
1960
1961 case DVD_STRUCT_DISCKEY:
1962 return dvd_read_disckey(cdi, s, cgc);
1963
1964 case DVD_STRUCT_BCA:
1965 return dvd_read_bca(cdi, s, cgc);
1966
1967 case DVD_STRUCT_MANUFACT:
1968 return dvd_read_manufact(cdi, s, cgc);
1969
1970 default:
1971 cdinfo(CD_WARNING, ": Invalid DVD structure read requested (%d)\n",
1972 s->type);
1973 return -EINVAL;
1974 }
1975}
1976
1977int cdrom_mode_sense(struct cdrom_device_info *cdi,
1978 struct packet_command *cgc,
1979 int page_code, int page_control)
1980{
1981 struct cdrom_device_ops *cdo = cdi->ops;
1982
1983 memset(cgc->cmd, 0, sizeof(cgc->cmd));
1984
1985 cgc->cmd[0] = GPCMD_MODE_SENSE_10;
1986 cgc->cmd[2] = page_code | (page_control << 6);
1987 cgc->cmd[7] = cgc->buflen >> 8;
1988 cgc->cmd[8] = cgc->buflen & 0xff;
1989 cgc->data_direction = CGC_DATA_READ;
1990 return cdo->generic_packet(cdi, cgc);
1991}
1992
1993int cdrom_mode_select(struct cdrom_device_info *cdi,
1994 struct packet_command *cgc)
1995{
1996 struct cdrom_device_ops *cdo = cdi->ops;
1997
1998 memset(cgc->cmd, 0, sizeof(cgc->cmd));
1999 memset(cgc->buffer, 0, 2);
2000 cgc->cmd[0] = GPCMD_MODE_SELECT_10;
2001 cgc->cmd[1] = 0x10;
2002 cgc->cmd[7] = cgc->buflen >> 8;
2003 cgc->cmd[8] = cgc->buflen & 0xff;
2004 cgc->data_direction = CGC_DATA_WRITE;
2005 return cdo->generic_packet(cdi, cgc);
2006}
2007
2008static int cdrom_read_subchannel(struct cdrom_device_info *cdi,
2009 struct cdrom_subchnl *subchnl, int mcn)
2010{
2011 struct cdrom_device_ops *cdo = cdi->ops;
2012 struct packet_command cgc;
2013 char buffer[32];
2014 int ret;
2015
2016 init_cdrom_command(&cgc, buffer, 16, CGC_DATA_READ);
2017 cgc.cmd[0] = GPCMD_READ_SUBCHANNEL;
2018 cgc.cmd[1] = 2;
2019 cgc.cmd[2] = 0x40;
2020 cgc.cmd[3] = mcn ? 2 : 1;
2021 cgc.cmd[8] = 16;
2022
2023 if ((ret = cdo->generic_packet(cdi, &cgc)))
2024 return ret;
2025
2026 subchnl->cdsc_audiostatus = cgc.buffer[1];
2027 subchnl->cdsc_format = CDROM_MSF;
2028 subchnl->cdsc_ctrl = cgc.buffer[5] & 0xf;
2029 subchnl->cdsc_trk = cgc.buffer[6];
2030 subchnl->cdsc_ind = cgc.buffer[7];
2031
2032 subchnl->cdsc_reladdr.msf.minute = cgc.buffer[13];
2033 subchnl->cdsc_reladdr.msf.second = cgc.buffer[14];
2034 subchnl->cdsc_reladdr.msf.frame = cgc.buffer[15];
2035 subchnl->cdsc_absaddr.msf.minute = cgc.buffer[9];
2036 subchnl->cdsc_absaddr.msf.second = cgc.buffer[10];
2037 subchnl->cdsc_absaddr.msf.frame = cgc.buffer[11];
2038
2039 return 0;
2040}
2041
2042
2043
2044
2045static int cdrom_read_cd(struct cdrom_device_info *cdi,
2046 struct packet_command *cgc, int lba,
2047 int blocksize, int nblocks)
2048{
2049 struct cdrom_device_ops *cdo = cdi->ops;
2050
2051 memset(&cgc->cmd, 0, sizeof(cgc->cmd));
2052 cgc->cmd[0] = GPCMD_READ_10;
2053 cgc->cmd[2] = (lba >> 24) & 0xff;
2054 cgc->cmd[3] = (lba >> 16) & 0xff;
2055 cgc->cmd[4] = (lba >> 8) & 0xff;
2056 cgc->cmd[5] = lba & 0xff;
2057 cgc->cmd[6] = (nblocks >> 16) & 0xff;
2058 cgc->cmd[7] = (nblocks >> 8) & 0xff;
2059 cgc->cmd[8] = nblocks & 0xff;
2060 cgc->buflen = blocksize * nblocks;
2061 return cdo->generic_packet(cdi, cgc);
2062}
2063
2064
2065static int cdrom_read_block(struct cdrom_device_info *cdi,
2066 struct packet_command *cgc,
2067 int lba, int nblocks, int format, int blksize)
2068{
2069 struct cdrom_device_ops *cdo = cdi->ops;
2070
2071 memset(&cgc->cmd, 0, sizeof(cgc->cmd));
2072 cgc->cmd[0] = GPCMD_READ_CD;
2073
2074 cgc->cmd[1] = format << 2;
2075
2076 cgc->cmd[2] = (lba >> 24) & 0xff;
2077 cgc->cmd[3] = (lba >> 16) & 0xff;
2078 cgc->cmd[4] = (lba >> 8) & 0xff;
2079 cgc->cmd[5] = lba & 0xff;
2080
2081 cgc->cmd[6] = (nblocks >> 16) & 0xff;
2082 cgc->cmd[7] = (nblocks >> 8) & 0xff;
2083 cgc->cmd[8] = nblocks & 0xff;
2084 cgc->buflen = blksize * nblocks;
2085
2086
2087 switch (blksize) {
2088 case CD_FRAMESIZE_RAW0 : cgc->cmd[9] = 0x58; break;
2089 case CD_FRAMESIZE_RAW1 : cgc->cmd[9] = 0x78; break;
2090 case CD_FRAMESIZE_RAW : cgc->cmd[9] = 0xf8; break;
2091 default : cgc->cmd[9] = 0x10;
2092 }
2093
2094 return cdo->generic_packet(cdi, cgc);
2095}
2096
2097static int cdrom_read_cdda_old(struct cdrom_device_info *cdi, __u8 __user *ubuf,
2098 int lba, int nframes)
2099{
2100 struct packet_command cgc;
2101 int ret = 0;
2102 int nr;
2103
2104 cdi->last_sense = 0;
2105
2106 memset(&cgc, 0, sizeof(cgc));
2107
2108
2109
2110
2111 nr = nframes;
2112 do {
2113 cgc.buffer = kmalloc(CD_FRAMESIZE_RAW * nr, GFP_KERNEL);
2114 if (cgc.buffer)
2115 break;
2116
2117 nr >>= 1;
2118 } while (nr);
2119
2120 if (!nr)
2121 return -ENOMEM;
2122
2123 if (!access_ok(VERIFY_WRITE, ubuf, nframes * CD_FRAMESIZE_RAW)) {
2124 ret = -EFAULT;
2125 goto out;
2126 }
2127
2128 cgc.data_direction = CGC_DATA_READ;
2129 while (nframes > 0) {
2130 if (nr > nframes)
2131 nr = nframes;
2132
2133 ret = cdrom_read_block(cdi, &cgc, lba, nr, 1, CD_FRAMESIZE_RAW);
2134 if (ret)
2135 break;
2136 if (__copy_to_user(ubuf, cgc.buffer, CD_FRAMESIZE_RAW * nr)) {
2137 ret = -EFAULT;
2138 break;
2139 }
2140 ubuf += CD_FRAMESIZE_RAW * nr;
2141 nframes -= nr;
2142 lba += nr;
2143 }
2144out:
2145 kfree(cgc.buffer);
2146 return ret;
2147}
2148
2149static int cdrom_read_cdda_bpc(struct cdrom_device_info *cdi, __u8 __user *ubuf,
2150 int lba, int nframes)
2151{
2152 struct request_queue *q = cdi->disk->queue;
2153 struct request *rq;
2154 struct bio *bio;
2155 unsigned int len;
2156 int nr, ret = 0;
2157
2158 if (!q)
2159 return -ENXIO;
2160
2161 cdi->last_sense = 0;
2162
2163 while (nframes) {
2164 nr = nframes;
2165 if (cdi->cdda_method == CDDA_BPC_SINGLE)
2166 nr = 1;
2167 if (nr * CD_FRAMESIZE_RAW > (queue_max_sectors(q) << 9))
2168 nr = (queue_max_sectors(q) << 9) / CD_FRAMESIZE_RAW;
2169
2170 len = nr * CD_FRAMESIZE_RAW;
2171
2172 rq = blk_get_request(q, READ, GFP_KERNEL);
2173 if (!rq) {
2174 ret = -ENOMEM;
2175 break;
2176 }
2177
2178 ret = blk_rq_map_user(q, rq, NULL, ubuf, len, GFP_KERNEL);
2179 if (ret) {
2180 blk_put_request(rq);
2181 break;
2182 }
2183
2184 rq->cmd[0] = GPCMD_READ_CD;
2185 rq->cmd[1] = 1 << 2;
2186 rq->cmd[2] = (lba >> 24) & 0xff;
2187 rq->cmd[3] = (lba >> 16) & 0xff;
2188 rq->cmd[4] = (lba >> 8) & 0xff;
2189 rq->cmd[5] = lba & 0xff;
2190 rq->cmd[6] = (nr >> 16) & 0xff;
2191 rq->cmd[7] = (nr >> 8) & 0xff;
2192 rq->cmd[8] = nr & 0xff;
2193 rq->cmd[9] = 0xf8;
2194
2195 rq->cmd_len = 12;
2196 rq->cmd_type = REQ_TYPE_BLOCK_PC;
2197 rq->timeout = 60 * HZ;
2198 bio = rq->bio;
2199
2200 if (blk_execute_rq(q, cdi->disk, rq, 0)) {
2201 struct request_sense *s = rq->sense;
2202 ret = -EIO;
2203 cdi->last_sense = s->sense_key;
2204 }
2205
2206 if (blk_rq_unmap_user(bio))
2207 ret = -EFAULT;
2208 blk_put_request(rq);
2209
2210 if (ret)
2211 break;
2212
2213 nframes -= nr;
2214 lba += nr;
2215 ubuf += len;
2216 }
2217
2218 return ret;
2219}
2220
2221static int cdrom_read_cdda(struct cdrom_device_info *cdi, __u8 __user *ubuf,
2222 int lba, int nframes)
2223{
2224 int ret;
2225
2226 if (cdi->cdda_method == CDDA_OLD)
2227 return cdrom_read_cdda_old(cdi, ubuf, lba, nframes);
2228
2229retry:
2230
2231
2232
2233 ret = cdrom_read_cdda_bpc(cdi, ubuf, lba, nframes);
2234 if (!ret || ret != -EIO)
2235 return ret;
2236
2237
2238
2239
2240
2241 if (cdi->cdda_method == CDDA_BPC_FULL && nframes > 1) {
2242 pr_info("dropping to single frame dma\n");
2243 cdi->cdda_method = CDDA_BPC_SINGLE;
2244 goto retry;
2245 }
2246
2247
2248
2249
2250
2251
2252 if (cdi->last_sense != 0x04 && cdi->last_sense != 0x0b)
2253 return ret;
2254
2255 pr_info("dropping to old style cdda (sense=%x)\n", cdi->last_sense);
2256 cdi->cdda_method = CDDA_OLD;
2257 return cdrom_read_cdda_old(cdi, ubuf, lba, nframes);
2258}
2259
2260static int cdrom_ioctl_multisession(struct cdrom_device_info *cdi,
2261 void __user *argp)
2262{
2263 struct cdrom_multisession ms_info;
2264 u8 requested_format;
2265 int ret;
2266
2267 cdinfo(CD_DO_IOCTL, "entering CDROMMULTISESSION\n");
2268
2269 if (!(cdi->ops->capability & CDC_MULTI_SESSION))
2270 return -ENOSYS;
2271
2272 if (copy_from_user(&ms_info, argp, sizeof(ms_info)))
2273 return -EFAULT;
2274
2275 requested_format = ms_info.addr_format;
2276 if (requested_format != CDROM_MSF && requested_format != CDROM_LBA)
2277 return -EINVAL;
2278 ms_info.addr_format = CDROM_LBA;
2279
2280 ret = cdi->ops->get_last_session(cdi, &ms_info);
2281 if (ret)
2282 return ret;
2283
2284 sanitize_format(&ms_info.addr, &ms_info.addr_format, requested_format);
2285
2286 if (copy_to_user(argp, &ms_info, sizeof(ms_info)))
2287 return -EFAULT;
2288
2289 cdinfo(CD_DO_IOCTL, "CDROMMULTISESSION successful\n");
2290 return 0;
2291}
2292
2293static int cdrom_ioctl_eject(struct cdrom_device_info *cdi)
2294{
2295 cdinfo(CD_DO_IOCTL, "entering CDROMEJECT\n");
2296
2297 if (!CDROM_CAN(CDC_OPEN_TRAY))
2298 return -ENOSYS;
2299 if (cdi->use_count != 1 || keeplocked)
2300 return -EBUSY;
2301 if (CDROM_CAN(CDC_LOCK)) {
2302 int ret = cdi->ops->lock_door(cdi, 0);
2303 if (ret)
2304 return ret;
2305 }
2306
2307 return cdi->ops->tray_move(cdi, 1);
2308}
2309
2310static int cdrom_ioctl_closetray(struct cdrom_device_info *cdi)
2311{
2312 cdinfo(CD_DO_IOCTL, "entering CDROMCLOSETRAY\n");
2313
2314 if (!CDROM_CAN(CDC_CLOSE_TRAY))
2315 return -ENOSYS;
2316 return cdi->ops->tray_move(cdi, 0);
2317}
2318
2319static int cdrom_ioctl_eject_sw(struct cdrom_device_info *cdi,
2320 unsigned long arg)
2321{
2322 cdinfo(CD_DO_IOCTL, "entering CDROMEJECT_SW\n");
2323
2324 if (!CDROM_CAN(CDC_OPEN_TRAY))
2325 return -ENOSYS;
2326 if (keeplocked)
2327 return -EBUSY;
2328
2329 cdi->options &= ~(CDO_AUTO_CLOSE | CDO_AUTO_EJECT);
2330 if (arg)
2331 cdi->options |= CDO_AUTO_CLOSE | CDO_AUTO_EJECT;
2332 return 0;
2333}
2334
2335static int cdrom_ioctl_media_changed(struct cdrom_device_info *cdi,
2336 unsigned long arg)
2337{
2338 struct cdrom_changer_info *info;
2339 int ret;
2340
2341 cdinfo(CD_DO_IOCTL, "entering CDROM_MEDIA_CHANGED\n");
2342
2343 if (!CDROM_CAN(CDC_MEDIA_CHANGED))
2344 return -ENOSYS;
2345
2346
2347 if (!CDROM_CAN(CDC_SELECT_DISC) || arg == CDSL_CURRENT)
2348 return media_changed(cdi, 1);
2349
2350 if ((unsigned int)arg >= cdi->capacity)
2351 return -EINVAL;
2352
2353 info = kmalloc(sizeof(*info), GFP_KERNEL);
2354 if (!info)
2355 return -ENOMEM;
2356
2357 ret = cdrom_read_mech_status(cdi, info);
2358 if (!ret)
2359 ret = info->slots[arg].change;
2360 kfree(info);
2361 return ret;
2362}
2363
2364static int cdrom_ioctl_set_options(struct cdrom_device_info *cdi,
2365 unsigned long arg)
2366{
2367 cdinfo(CD_DO_IOCTL, "entering CDROM_SET_OPTIONS\n");
2368
2369
2370
2371
2372
2373 switch (arg) {
2374 case CDO_USE_FFLAGS:
2375 case CDO_CHECK_TYPE:
2376 break;
2377 case CDO_LOCK:
2378 if (!CDROM_CAN(CDC_LOCK))
2379 return -ENOSYS;
2380 break;
2381 case 0:
2382 return cdi->options;
2383
2384 default:
2385 if (!CDROM_CAN(arg))
2386 return -ENOSYS;
2387 }
2388 cdi->options |= (int) arg;
2389 return cdi->options;
2390}
2391
2392static int cdrom_ioctl_clear_options(struct cdrom_device_info *cdi,
2393 unsigned long arg)
2394{
2395 cdinfo(CD_DO_IOCTL, "entering CDROM_CLEAR_OPTIONS\n");
2396
2397 cdi->options &= ~(int) arg;
2398 return cdi->options;
2399}
2400
2401static int cdrom_ioctl_select_speed(struct cdrom_device_info *cdi,
2402 unsigned long arg)
2403{
2404 cdinfo(CD_DO_IOCTL, "entering CDROM_SELECT_SPEED\n");
2405
2406 if (!CDROM_CAN(CDC_SELECT_SPEED))
2407 return -ENOSYS;
2408 return cdi->ops->select_speed(cdi, arg);
2409}
2410
2411static int cdrom_ioctl_select_disc(struct cdrom_device_info *cdi,
2412 unsigned long arg)
2413{
2414 cdinfo(CD_DO_IOCTL, "entering CDROM_SELECT_DISC\n");
2415
2416 if (!CDROM_CAN(CDC_SELECT_DISC))
2417 return -ENOSYS;
2418
2419 if (arg != CDSL_CURRENT && arg != CDSL_NONE) {
2420 if ((int)arg >= cdi->capacity)
2421 return -EINVAL;
2422 }
2423
2424
2425
2426
2427
2428
2429 if (cdi->ops->select_disc)
2430 return cdi->ops->select_disc(cdi, arg);
2431
2432 cdinfo(CD_CHANGER, "Using generic cdrom_select_disc()\n");
2433 return cdrom_select_disc(cdi, arg);
2434}
2435
2436static int cdrom_ioctl_reset(struct cdrom_device_info *cdi,
2437 struct block_device *bdev)
2438{
2439 cdinfo(CD_DO_IOCTL, "entering CDROM_RESET\n");
2440
2441 if (!capable(CAP_SYS_ADMIN))
2442 return -EACCES;
2443 if (!CDROM_CAN(CDC_RESET))
2444 return -ENOSYS;
2445 invalidate_bdev(bdev);
2446 return cdi->ops->reset(cdi);
2447}
2448
2449static int cdrom_ioctl_lock_door(struct cdrom_device_info *cdi,
2450 unsigned long arg)
2451{
2452 cdinfo(CD_DO_IOCTL, "%socking door.\n", arg ? "L" : "Unl");
2453
2454 if (!CDROM_CAN(CDC_LOCK))
2455 return -EDRIVE_CANT_DO_THIS;
2456
2457 keeplocked = arg ? 1 : 0;
2458
2459
2460
2461
2462
2463 if (cdi->use_count != 1 && !arg && !capable(CAP_SYS_ADMIN))
2464 return -EBUSY;
2465 return cdi->ops->lock_door(cdi, arg);
2466}
2467
2468static int cdrom_ioctl_debug(struct cdrom_device_info *cdi,
2469 unsigned long arg)
2470{
2471 cdinfo(CD_DO_IOCTL, "%sabling debug.\n", arg ? "En" : "Dis");
2472
2473 if (!capable(CAP_SYS_ADMIN))
2474 return -EACCES;
2475 debug = arg ? 1 : 0;
2476 return debug;
2477}
2478
2479static int cdrom_ioctl_get_capability(struct cdrom_device_info *cdi)
2480{
2481 cdinfo(CD_DO_IOCTL, "entering CDROM_GET_CAPABILITY\n");
2482 return (cdi->ops->capability & ~cdi->mask);
2483}
2484
2485
2486
2487
2488
2489
2490
2491static int cdrom_ioctl_get_mcn(struct cdrom_device_info *cdi,
2492 void __user *argp)
2493{
2494 struct cdrom_mcn mcn;
2495 int ret;
2496
2497 cdinfo(CD_DO_IOCTL, "entering CDROM_GET_MCN\n");
2498
2499 if (!(cdi->ops->capability & CDC_MCN))
2500 return -ENOSYS;
2501 ret = cdi->ops->get_mcn(cdi, &mcn);
2502 if (ret)
2503 return ret;
2504
2505 if (copy_to_user(argp, &mcn, sizeof(mcn)))
2506 return -EFAULT;
2507 cdinfo(CD_DO_IOCTL, "CDROM_GET_MCN successful\n");
2508 return 0;
2509}
2510
2511static int cdrom_ioctl_drive_status(struct cdrom_device_info *cdi,
2512 unsigned long arg)
2513{
2514 cdinfo(CD_DO_IOCTL, "entering CDROM_DRIVE_STATUS\n");
2515
2516 if (!(cdi->ops->capability & CDC_DRIVE_STATUS))
2517 return -ENOSYS;
2518 if (!CDROM_CAN(CDC_SELECT_DISC) ||
2519 (arg == CDSL_CURRENT || arg == CDSL_NONE))
2520 return cdi->ops->drive_status(cdi, CDSL_CURRENT);
2521 if (((int)arg >= cdi->capacity))
2522 return -EINVAL;
2523 return cdrom_slot_status(cdi, arg);
2524}
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543static int cdrom_ioctl_disc_status(struct cdrom_device_info *cdi)
2544{
2545 tracktype tracks;
2546
2547 cdinfo(CD_DO_IOCTL, "entering CDROM_DISC_STATUS\n");
2548
2549 cdrom_count_tracks(cdi, &tracks);
2550 if (tracks.error)
2551 return tracks.error;
2552
2553
2554 if (tracks.audio > 0) {
2555 if (!tracks.data && !tracks.cdi && !tracks.xa)
2556 return CDS_AUDIO;
2557 else
2558 return CDS_MIXED;
2559 }
2560
2561 if (tracks.cdi > 0)
2562 return CDS_XA_2_2;
2563 if (tracks.xa > 0)
2564 return CDS_XA_2_1;
2565 if (tracks.data > 0)
2566 return CDS_DATA_1;
2567
2568
2569 cdinfo(CD_WARNING,"This disc doesn't have any tracks I recognize!\n");
2570 return CDS_NO_INFO;
2571}
2572
2573static int cdrom_ioctl_changer_nslots(struct cdrom_device_info *cdi)
2574{
2575 cdinfo(CD_DO_IOCTL, "entering CDROM_CHANGER_NSLOTS\n");
2576 return cdi->capacity;
2577}
2578
2579static int cdrom_ioctl_get_subchnl(struct cdrom_device_info *cdi,
2580 void __user *argp)
2581{
2582 struct cdrom_subchnl q;
2583 u8 requested, back;
2584 int ret;
2585
2586
2587
2588 if (copy_from_user(&q, argp, sizeof(q)))
2589 return -EFAULT;
2590
2591 requested = q.cdsc_format;
2592 if (requested != CDROM_MSF && requested != CDROM_LBA)
2593 return -EINVAL;
2594 q.cdsc_format = CDROM_MSF;
2595
2596 ret = cdi->ops->audio_ioctl(cdi, CDROMSUBCHNL, &q);
2597 if (ret)
2598 return ret;
2599
2600 back = q.cdsc_format;
2601 sanitize_format(&q.cdsc_absaddr, &back, requested);
2602 sanitize_format(&q.cdsc_reladdr, &q.cdsc_format, requested);
2603
2604 if (copy_to_user(argp, &q, sizeof(q)))
2605 return -EFAULT;
2606
2607 return 0;
2608}
2609
2610static int cdrom_ioctl_read_tochdr(struct cdrom_device_info *cdi,
2611 void __user *argp)
2612{
2613 struct cdrom_tochdr header;
2614 int ret;
2615
2616
2617
2618 if (copy_from_user(&header, argp, sizeof(header)))
2619 return -EFAULT;
2620
2621 ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header);
2622 if (ret)
2623 return ret;
2624
2625 if (copy_to_user(argp, &header, sizeof(header)))
2626 return -EFAULT;
2627
2628 return 0;
2629}
2630
2631static int cdrom_ioctl_read_tocentry(struct cdrom_device_info *cdi,
2632 void __user *argp)
2633{
2634 struct cdrom_tocentry entry;
2635 u8 requested_format;
2636 int ret;
2637
2638
2639
2640 if (copy_from_user(&entry, argp, sizeof(entry)))
2641 return -EFAULT;
2642
2643 requested_format = entry.cdte_format;
2644 if (requested_format != CDROM_MSF && requested_format != CDROM_LBA)
2645 return -EINVAL;
2646
2647 entry.cdte_format = CDROM_MSF;
2648 ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &entry);
2649 if (ret)
2650 return ret;
2651 sanitize_format(&entry.cdte_addr, &entry.cdte_format, requested_format);
2652
2653 if (copy_to_user(argp, &entry, sizeof(entry)))
2654 return -EFAULT;
2655
2656 return 0;
2657}
2658
2659static int cdrom_ioctl_play_msf(struct cdrom_device_info *cdi,
2660 void __user *argp)
2661{
2662 struct cdrom_msf msf;
2663
2664 cdinfo(CD_DO_IOCTL, "entering CDROMPLAYMSF\n");
2665
2666 if (!CDROM_CAN(CDC_PLAY_AUDIO))
2667 return -ENOSYS;
2668 if (copy_from_user(&msf, argp, sizeof(msf)))
2669 return -EFAULT;
2670 return cdi->ops->audio_ioctl(cdi, CDROMPLAYMSF, &msf);
2671}
2672
2673static int cdrom_ioctl_play_trkind(struct cdrom_device_info *cdi,
2674 void __user *argp)
2675{
2676 struct cdrom_ti ti;
2677 int ret;
2678
2679 cdinfo(CD_DO_IOCTL, "entering CDROMPLAYTRKIND\n");
2680
2681 if (!CDROM_CAN(CDC_PLAY_AUDIO))
2682 return -ENOSYS;
2683 if (copy_from_user(&ti, argp, sizeof(ti)))
2684 return -EFAULT;
2685
2686 ret = check_for_audio_disc(cdi, cdi->ops);
2687 if (ret)
2688 return ret;
2689 return cdi->ops->audio_ioctl(cdi, CDROMPLAYTRKIND, &ti);
2690}
2691static int cdrom_ioctl_volctrl(struct cdrom_device_info *cdi,
2692 void __user *argp)
2693{
2694 struct cdrom_volctrl volume;
2695
2696 cdinfo(CD_DO_IOCTL, "entering CDROMVOLCTRL\n");
2697
2698 if (!CDROM_CAN(CDC_PLAY_AUDIO))
2699 return -ENOSYS;
2700 if (copy_from_user(&volume, argp, sizeof(volume)))
2701 return -EFAULT;
2702 return cdi->ops->audio_ioctl(cdi, CDROMVOLCTRL, &volume);
2703}
2704
2705static int cdrom_ioctl_volread(struct cdrom_device_info *cdi,
2706 void __user *argp)
2707{
2708 struct cdrom_volctrl volume;
2709 int ret;
2710
2711 cdinfo(CD_DO_IOCTL, "entering CDROMVOLREAD\n");
2712
2713 if (!CDROM_CAN(CDC_PLAY_AUDIO))
2714 return -ENOSYS;
2715
2716 ret = cdi->ops->audio_ioctl(cdi, CDROMVOLREAD, &volume);
2717 if (ret)
2718 return ret;
2719
2720 if (copy_to_user(argp, &volume, sizeof(volume)))
2721 return -EFAULT;
2722 return 0;
2723}
2724
2725static int cdrom_ioctl_audioctl(struct cdrom_device_info *cdi,
2726 unsigned int cmd)
2727{
2728 int ret;
2729
2730 cdinfo(CD_DO_IOCTL, "doing audio ioctl (start/stop/pause/resume)\n");
2731
2732 if (!CDROM_CAN(CDC_PLAY_AUDIO))
2733 return -ENOSYS;
2734 ret = check_for_audio_disc(cdi, cdi->ops);
2735 if (ret)
2736 return ret;
2737 return cdi->ops->audio_ioctl(cdi, cmd, NULL);
2738}
2739
2740
2741
2742
2743
2744
2745int cdrom_ioctl(struct cdrom_device_info *cdi, struct block_device *bdev,
2746 fmode_t mode, unsigned int cmd, unsigned long arg)
2747{
2748 void __user *argp = (void __user *)arg;
2749 int ret;
2750
2751
2752
2753
2754 ret = scsi_cmd_blk_ioctl(bdev, mode, cmd, argp);
2755 if (ret != -ENOTTY)
2756 return ret;
2757
2758 switch (cmd) {
2759 case CDROMMULTISESSION:
2760 return cdrom_ioctl_multisession(cdi, argp);
2761 case CDROMEJECT:
2762 return cdrom_ioctl_eject(cdi);
2763 case CDROMCLOSETRAY:
2764 return cdrom_ioctl_closetray(cdi);
2765 case CDROMEJECT_SW:
2766 return cdrom_ioctl_eject_sw(cdi, arg);
2767 case CDROM_MEDIA_CHANGED:
2768 return cdrom_ioctl_media_changed(cdi, arg);
2769 case CDROM_SET_OPTIONS:
2770 return cdrom_ioctl_set_options(cdi, arg);
2771 case CDROM_CLEAR_OPTIONS:
2772 return cdrom_ioctl_clear_options(cdi, arg);
2773 case CDROM_SELECT_SPEED:
2774 return cdrom_ioctl_select_speed(cdi, arg);
2775 case CDROM_SELECT_DISC:
2776 return cdrom_ioctl_select_disc(cdi, arg);
2777 case CDROMRESET:
2778 return cdrom_ioctl_reset(cdi, bdev);
2779 case CDROM_LOCKDOOR:
2780 return cdrom_ioctl_lock_door(cdi, arg);
2781 case CDROM_DEBUG:
2782 return cdrom_ioctl_debug(cdi, arg);
2783 case CDROM_GET_CAPABILITY:
2784 return cdrom_ioctl_get_capability(cdi);
2785 case CDROM_GET_MCN:
2786 return cdrom_ioctl_get_mcn(cdi, argp);
2787 case CDROM_DRIVE_STATUS:
2788 return cdrom_ioctl_drive_status(cdi, arg);
2789 case CDROM_DISC_STATUS:
2790 return cdrom_ioctl_disc_status(cdi);
2791 case CDROM_CHANGER_NSLOTS:
2792 return cdrom_ioctl_changer_nslots(cdi);
2793 }
2794
2795
2796
2797
2798
2799
2800
2801 if (CDROM_CAN(CDC_GENERIC_PACKET)) {
2802 ret = mmc_ioctl(cdi, cmd, arg);
2803 if (ret != -ENOTTY)
2804 return ret;
2805 }
2806
2807
2808
2809
2810
2811
2812 switch (cmd) {
2813 case CDROMSUBCHNL:
2814 return cdrom_ioctl_get_subchnl(cdi, argp);
2815 case CDROMREADTOCHDR:
2816 return cdrom_ioctl_read_tochdr(cdi, argp);
2817 case CDROMREADTOCENTRY:
2818 return cdrom_ioctl_read_tocentry(cdi, argp);
2819 case CDROMPLAYMSF:
2820 return cdrom_ioctl_play_msf(cdi, argp);
2821 case CDROMPLAYTRKIND:
2822 return cdrom_ioctl_play_trkind(cdi, argp);
2823 case CDROMVOLCTRL:
2824 return cdrom_ioctl_volctrl(cdi, argp);
2825 case CDROMVOLREAD:
2826 return cdrom_ioctl_volread(cdi, argp);
2827 case CDROMSTART:
2828 case CDROMSTOP:
2829 case CDROMPAUSE:
2830 case CDROMRESUME:
2831 return cdrom_ioctl_audioctl(cdi, cmd);
2832 }
2833
2834 return -ENOSYS;
2835}
2836
2837
2838
2839
2840
2841static int cdrom_switch_blocksize(struct cdrom_device_info *cdi, int size)
2842{
2843 struct cdrom_device_ops *cdo = cdi->ops;
2844 struct packet_command cgc;
2845 struct modesel_head mh;
2846
2847 memset(&mh, 0, sizeof(mh));
2848 mh.block_desc_length = 0x08;
2849 mh.block_length_med = (size >> 8) & 0xff;
2850 mh.block_length_lo = size & 0xff;
2851
2852 memset(&cgc, 0, sizeof(cgc));
2853 cgc.cmd[0] = 0x15;
2854 cgc.cmd[1] = 1 << 4;
2855 cgc.cmd[4] = 12;
2856 cgc.buflen = sizeof(mh);
2857 cgc.buffer = (char *) &mh;
2858 cgc.data_direction = CGC_DATA_WRITE;
2859 mh.block_desc_length = 0x08;
2860 mh.block_length_med = (size >> 8) & 0xff;
2861 mh.block_length_lo = size & 0xff;
2862
2863 return cdo->generic_packet(cdi, &cgc);
2864}
2865
2866static noinline int mmc_ioctl_cdrom_read_data(struct cdrom_device_info *cdi,
2867 void __user *arg,
2868 struct packet_command *cgc,
2869 int cmd)
2870{
2871 struct request_sense sense;
2872 struct cdrom_msf msf;
2873 int blocksize = 0, format = 0, lba;
2874 int ret;
2875
2876 switch (cmd) {
2877 case CDROMREADRAW:
2878 blocksize = CD_FRAMESIZE_RAW;
2879 break;
2880 case CDROMREADMODE1:
2881 blocksize = CD_FRAMESIZE;
2882 format = 2;
2883 break;
2884 case CDROMREADMODE2:
2885 blocksize = CD_FRAMESIZE_RAW0;
2886 break;
2887 }
2888 IOCTL_IN(arg, struct cdrom_msf, msf);
2889 lba = msf_to_lba(msf.cdmsf_min0, msf.cdmsf_sec0, msf.cdmsf_frame0);
2890
2891 if (lba < 0)
2892 return -EINVAL;
2893
2894 cgc->buffer = kmalloc(blocksize, GFP_KERNEL);
2895 if (cgc->buffer == NULL)
2896 return -ENOMEM;
2897
2898 memset(&sense, 0, sizeof(sense));
2899 cgc->sense = &sense;
2900 cgc->data_direction = CGC_DATA_READ;
2901 ret = cdrom_read_block(cdi, cgc, lba, 1, format, blocksize);
2902 if (ret && sense.sense_key == 0x05 &&
2903 sense.asc == 0x20 &&
2904 sense.ascq == 0x00) {
2905
2906
2907
2908
2909
2910 ret = cdrom_switch_blocksize(cdi, blocksize);
2911 if (ret)
2912 goto out;
2913 cgc->sense = NULL;
2914 ret = cdrom_read_cd(cdi, cgc, lba, blocksize, 1);
2915 ret |= cdrom_switch_blocksize(cdi, blocksize);
2916 }
2917 if (!ret && copy_to_user(arg, cgc->buffer, blocksize))
2918 ret = -EFAULT;
2919out:
2920 kfree(cgc->buffer);
2921 return ret;
2922}
2923
2924static noinline int mmc_ioctl_cdrom_read_audio(struct cdrom_device_info *cdi,
2925 void __user *arg)
2926{
2927 struct cdrom_read_audio ra;
2928 int lba;
2929
2930 IOCTL_IN(arg, struct cdrom_read_audio, ra);
2931
2932 if (ra.addr_format == CDROM_MSF)
2933 lba = msf_to_lba(ra.addr.msf.minute,
2934 ra.addr.msf.second,
2935 ra.addr.msf.frame);
2936 else if (ra.addr_format == CDROM_LBA)
2937 lba = ra.addr.lba;
2938 else
2939 return -EINVAL;
2940
2941
2942 if (lba < 0 || ra.nframes <= 0 || ra.nframes > CD_FRAMES)
2943 return -EINVAL;
2944
2945 return cdrom_read_cdda(cdi, ra.buf, lba, ra.nframes);
2946}
2947
2948static noinline int mmc_ioctl_cdrom_subchannel(struct cdrom_device_info *cdi,
2949 void __user *arg)
2950{
2951 int ret;
2952 struct cdrom_subchnl q;
2953 u_char requested, back;
2954 IOCTL_IN(arg, struct cdrom_subchnl, q);
2955 requested = q.cdsc_format;
2956 if (!((requested == CDROM_MSF) ||
2957 (requested == CDROM_LBA)))
2958 return -EINVAL;
2959 q.cdsc_format = CDROM_MSF;
2960 ret = cdrom_read_subchannel(cdi, &q, 0);
2961 if (ret)
2962 return ret;
2963 back = q.cdsc_format;
2964 sanitize_format(&q.cdsc_absaddr, &back, requested);
2965 sanitize_format(&q.cdsc_reladdr, &q.cdsc_format, requested);
2966 IOCTL_OUT(arg, struct cdrom_subchnl, q);
2967
2968 return 0;
2969}
2970
2971static noinline int mmc_ioctl_cdrom_play_msf(struct cdrom_device_info *cdi,
2972 void __user *arg,
2973 struct packet_command *cgc)
2974{
2975 struct cdrom_device_ops *cdo = cdi->ops;
2976 struct cdrom_msf msf;
2977 cdinfo(CD_DO_IOCTL, "entering CDROMPLAYMSF\n");
2978 IOCTL_IN(arg, struct cdrom_msf, msf);
2979 cgc->cmd[0] = GPCMD_PLAY_AUDIO_MSF;
2980 cgc->cmd[3] = msf.cdmsf_min0;
2981 cgc->cmd[4] = msf.cdmsf_sec0;
2982 cgc->cmd[5] = msf.cdmsf_frame0;
2983 cgc->cmd[6] = msf.cdmsf_min1;
2984 cgc->cmd[7] = msf.cdmsf_sec1;
2985 cgc->cmd[8] = msf.cdmsf_frame1;
2986 cgc->data_direction = CGC_DATA_NONE;
2987 return cdo->generic_packet(cdi, cgc);
2988}
2989
2990static noinline int mmc_ioctl_cdrom_play_blk(struct cdrom_device_info *cdi,
2991 void __user *arg,
2992 struct packet_command *cgc)
2993{
2994 struct cdrom_device_ops *cdo = cdi->ops;
2995 struct cdrom_blk blk;
2996 cdinfo(CD_DO_IOCTL, "entering CDROMPLAYBLK\n");
2997 IOCTL_IN(arg, struct cdrom_blk, blk);
2998 cgc->cmd[0] = GPCMD_PLAY_AUDIO_10;
2999 cgc->cmd[2] = (blk.from >> 24) & 0xff;
3000 cgc->cmd[3] = (blk.from >> 16) & 0xff;
3001 cgc->cmd[4] = (blk.from >> 8) & 0xff;
3002 cgc->cmd[5] = blk.from & 0xff;
3003 cgc->cmd[7] = (blk.len >> 8) & 0xff;
3004 cgc->cmd[8] = blk.len & 0xff;
3005 cgc->data_direction = CGC_DATA_NONE;
3006 return cdo->generic_packet(cdi, cgc);
3007}
3008
3009static noinline int mmc_ioctl_cdrom_volume(struct cdrom_device_info *cdi,
3010 void __user *arg,
3011 struct packet_command *cgc,
3012 unsigned int cmd)
3013{
3014 struct cdrom_volctrl volctrl;
3015 unsigned char buffer[32];
3016 char mask[sizeof(buffer)];
3017 unsigned short offset;
3018 int ret;
3019
3020 cdinfo(CD_DO_IOCTL, "entering CDROMVOLUME\n");
3021
3022 IOCTL_IN(arg, struct cdrom_volctrl, volctrl);
3023
3024 cgc->buffer = buffer;
3025 cgc->buflen = 24;
3026 ret = cdrom_mode_sense(cdi, cgc, GPMODE_AUDIO_CTL_PAGE, 0);
3027 if (ret)
3028 return ret;
3029
3030
3031
3032
3033
3034 offset = 8 + be16_to_cpu(*(__be16 *)(buffer + 6));
3035
3036 if (offset + 16 > sizeof(buffer))
3037 return -E2BIG;
3038
3039 if (offset + 16 > cgc->buflen) {
3040 cgc->buflen = offset + 16;
3041 ret = cdrom_mode_sense(cdi, cgc,
3042 GPMODE_AUDIO_CTL_PAGE, 0);
3043 if (ret)
3044 return ret;
3045 }
3046
3047
3048 if ((buffer[offset] & 0x3f) != GPMODE_AUDIO_CTL_PAGE ||
3049 buffer[offset + 1] < 14)
3050 return -EINVAL;
3051
3052
3053
3054 if (cmd == CDROMVOLREAD) {
3055 volctrl.channel0 = buffer[offset+9];
3056 volctrl.channel1 = buffer[offset+11];
3057 volctrl.channel2 = buffer[offset+13];
3058 volctrl.channel3 = buffer[offset+15];
3059 IOCTL_OUT(arg, struct cdrom_volctrl, volctrl);
3060 return 0;
3061 }
3062
3063
3064 cgc->buffer = mask;
3065 ret = cdrom_mode_sense(cdi, cgc, GPMODE_AUDIO_CTL_PAGE, 1);
3066 if (ret)
3067 return ret;
3068
3069 buffer[offset + 9] = volctrl.channel0 & mask[offset + 9];
3070 buffer[offset + 11] = volctrl.channel1 & mask[offset + 11];
3071 buffer[offset + 13] = volctrl.channel2 & mask[offset + 13];
3072 buffer[offset + 15] = volctrl.channel3 & mask[offset + 15];
3073
3074
3075 cgc->buffer = buffer + offset - 8;
3076 memset(cgc->buffer, 0, 8);
3077 return cdrom_mode_select(cdi, cgc);
3078}
3079
3080static noinline int mmc_ioctl_cdrom_start_stop(struct cdrom_device_info *cdi,
3081 struct packet_command *cgc,
3082 int cmd)
3083{
3084 struct cdrom_device_ops *cdo = cdi->ops;
3085 cdinfo(CD_DO_IOCTL, "entering CDROMSTART/CDROMSTOP\n");
3086 cgc->cmd[0] = GPCMD_START_STOP_UNIT;
3087 cgc->cmd[1] = 1;
3088 cgc->cmd[4] = (cmd == CDROMSTART) ? 1 : 0;
3089 cgc->data_direction = CGC_DATA_NONE;
3090 return cdo->generic_packet(cdi, cgc);
3091}
3092
3093static noinline int mmc_ioctl_cdrom_pause_resume(struct cdrom_device_info *cdi,
3094 struct packet_command *cgc,
3095 int cmd)
3096{
3097 struct cdrom_device_ops *cdo = cdi->ops;
3098 cdinfo(CD_DO_IOCTL, "entering CDROMPAUSE/CDROMRESUME\n");
3099 cgc->cmd[0] = GPCMD_PAUSE_RESUME;
3100 cgc->cmd[8] = (cmd == CDROMRESUME) ? 1 : 0;
3101 cgc->data_direction = CGC_DATA_NONE;
3102 return cdo->generic_packet(cdi, cgc);
3103}
3104
3105static noinline int mmc_ioctl_dvd_read_struct(struct cdrom_device_info *cdi,
3106 void __user *arg,
3107 struct packet_command *cgc)
3108{
3109 int ret;
3110 dvd_struct *s;
3111 int size = sizeof(dvd_struct);
3112
3113 if (!CDROM_CAN(CDC_DVD))
3114 return -ENOSYS;
3115
3116 s = kmalloc(size, GFP_KERNEL);
3117 if (!s)
3118 return -ENOMEM;
3119
3120 cdinfo(CD_DO_IOCTL, "entering DVD_READ_STRUCT\n");
3121 if (copy_from_user(s, arg, size)) {
3122 kfree(s);
3123 return -EFAULT;
3124 }
3125
3126 ret = dvd_read_struct(cdi, s, cgc);
3127 if (ret)
3128 goto out;
3129
3130 if (copy_to_user(arg, s, size))
3131 ret = -EFAULT;
3132out:
3133 kfree(s);
3134 return ret;
3135}
3136
3137static noinline int mmc_ioctl_dvd_auth(struct cdrom_device_info *cdi,
3138 void __user *arg)
3139{
3140 int ret;
3141 dvd_authinfo ai;
3142 if (!CDROM_CAN(CDC_DVD))
3143 return -ENOSYS;
3144 cdinfo(CD_DO_IOCTL, "entering DVD_AUTH\n");
3145 IOCTL_IN(arg, dvd_authinfo, ai);
3146 ret = dvd_do_auth(cdi, &ai);
3147 if (ret)
3148 return ret;
3149 IOCTL_OUT(arg, dvd_authinfo, ai);
3150 return 0;
3151}
3152
3153static noinline int mmc_ioctl_cdrom_next_writable(struct cdrom_device_info *cdi,
3154 void __user *arg)
3155{
3156 int ret;
3157 long next = 0;
3158 cdinfo(CD_DO_IOCTL, "entering CDROM_NEXT_WRITABLE\n");
3159 ret = cdrom_get_next_writable(cdi, &next);
3160 if (ret)
3161 return ret;
3162 IOCTL_OUT(arg, long, next);
3163 return 0;
3164}
3165
3166static noinline int mmc_ioctl_cdrom_last_written(struct cdrom_device_info *cdi,
3167 void __user *arg)
3168{
3169 int ret;
3170 long last = 0;
3171 cdinfo(CD_DO_IOCTL, "entering CDROM_LAST_WRITTEN\n");
3172 ret = cdrom_get_last_written(cdi, &last);
3173 if (ret)
3174 return ret;
3175 IOCTL_OUT(arg, long, last);
3176 return 0;
3177}
3178
3179static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
3180 unsigned long arg)
3181{
3182 struct packet_command cgc;
3183 void __user *userptr = (void __user *)arg;
3184
3185 memset(&cgc, 0, sizeof(cgc));
3186
3187
3188
3189 switch (cmd) {
3190 case CDROMREADRAW:
3191 case CDROMREADMODE1:
3192 case CDROMREADMODE2:
3193 return mmc_ioctl_cdrom_read_data(cdi, userptr, &cgc, cmd);
3194 case CDROMREADAUDIO:
3195 return mmc_ioctl_cdrom_read_audio(cdi, userptr);
3196 case CDROMSUBCHNL:
3197 return mmc_ioctl_cdrom_subchannel(cdi, userptr);
3198 case CDROMPLAYMSF:
3199 return mmc_ioctl_cdrom_play_msf(cdi, userptr, &cgc);
3200 case CDROMPLAYBLK:
3201 return mmc_ioctl_cdrom_play_blk(cdi, userptr, &cgc);
3202 case CDROMVOLCTRL:
3203 case CDROMVOLREAD:
3204 return mmc_ioctl_cdrom_volume(cdi, userptr, &cgc, cmd);
3205 case CDROMSTART:
3206 case CDROMSTOP:
3207 return mmc_ioctl_cdrom_start_stop(cdi, &cgc, cmd);
3208 case CDROMPAUSE:
3209 case CDROMRESUME:
3210 return mmc_ioctl_cdrom_pause_resume(cdi, &cgc, cmd);
3211 case DVD_READ_STRUCT:
3212 return mmc_ioctl_dvd_read_struct(cdi, userptr, &cgc);
3213 case DVD_AUTH:
3214 return mmc_ioctl_dvd_auth(cdi, userptr);
3215 case CDROM_NEXT_WRITABLE:
3216 return mmc_ioctl_cdrom_next_writable(cdi, userptr);
3217 case CDROM_LAST_WRITTEN:
3218 return mmc_ioctl_cdrom_last_written(cdi, userptr);
3219 }
3220
3221 return -ENOTTY;
3222}
3223
3224static int cdrom_get_track_info(struct cdrom_device_info *cdi, __u16 track, __u8 type,
3225 track_information *ti)
3226{
3227 struct cdrom_device_ops *cdo = cdi->ops;
3228 struct packet_command cgc;
3229 int ret, buflen;
3230
3231 init_cdrom_command(&cgc, ti, 8, CGC_DATA_READ);
3232 cgc.cmd[0] = GPCMD_READ_TRACK_RZONE_INFO;
3233 cgc.cmd[1] = type & 3;
3234 cgc.cmd[4] = (track & 0xff00) >> 8;
3235 cgc.cmd[5] = track & 0xff;
3236 cgc.cmd[8] = 8;
3237 cgc.quiet = 1;
3238
3239 if ((ret = cdo->generic_packet(cdi, &cgc)))
3240 return ret;
3241
3242 buflen = be16_to_cpu(ti->track_information_length) +
3243 sizeof(ti->track_information_length);
3244
3245 if (buflen > sizeof(track_information))
3246 buflen = sizeof(track_information);
3247
3248 cgc.cmd[8] = cgc.buflen = buflen;
3249 if ((ret = cdo->generic_packet(cdi, &cgc)))
3250 return ret;
3251
3252
3253 return buflen;
3254}
3255
3256
3257static int cdrom_get_disc_info(struct cdrom_device_info *cdi, disc_information *di)
3258{
3259 struct cdrom_device_ops *cdo = cdi->ops;
3260 struct packet_command cgc;
3261 int ret, buflen;
3262
3263
3264 init_cdrom_command(&cgc, di, sizeof(*di), CGC_DATA_READ);
3265 cgc.cmd[0] = GPCMD_READ_DISC_INFO;
3266 cgc.cmd[8] = cgc.buflen = 2;
3267 cgc.quiet = 1;
3268
3269 if ((ret = cdo->generic_packet(cdi, &cgc)))
3270 return ret;
3271
3272
3273
3274
3275 buflen = be16_to_cpu(di->disc_information_length) +
3276 sizeof(di->disc_information_length);
3277
3278 if (buflen > sizeof(disc_information))
3279 buflen = sizeof(disc_information);
3280
3281 cgc.cmd[8] = cgc.buflen = buflen;
3282 if ((ret = cdo->generic_packet(cdi, &cgc)))
3283 return ret;
3284
3285
3286 return buflen;
3287}
3288
3289
3290
3291int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written)
3292{
3293 struct cdrom_tocentry toc;
3294 disc_information di;
3295 track_information ti;
3296 __u32 last_track;
3297 int ret = -1, ti_size;
3298
3299 if (!CDROM_CAN(CDC_GENERIC_PACKET))
3300 goto use_toc;
3301
3302 ret = cdrom_get_disc_info(cdi, &di);
3303 if (ret < (int)(offsetof(typeof(di), last_track_lsb)
3304 + sizeof(di.last_track_lsb)))
3305 goto use_toc;
3306
3307
3308 last_track = (di.last_track_msb << 8) | di.last_track_lsb;
3309 ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
3310 if (ti_size < (int)offsetof(typeof(ti), track_start))
3311 goto use_toc;
3312
3313
3314 if (ti.blank) {
3315 if (last_track==1)
3316 goto use_toc;
3317 last_track--;
3318 ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
3319 }
3320
3321 if (ti_size < (int)(offsetof(typeof(ti), track_size)
3322 + sizeof(ti.track_size)))
3323 goto use_toc;
3324
3325
3326 if (ti.lra_v && ti_size >= (int)(offsetof(typeof(ti), last_rec_address)
3327 + sizeof(ti.last_rec_address))) {
3328 *last_written = be32_to_cpu(ti.last_rec_address);
3329 } else {
3330
3331 *last_written = be32_to_cpu(ti.track_start) +
3332 be32_to_cpu(ti.track_size);
3333 if (ti.free_blocks)
3334 *last_written -= (be32_to_cpu(ti.free_blocks) + 7);
3335 }
3336 return 0;
3337
3338
3339
3340
3341
3342use_toc:
3343 toc.cdte_format = CDROM_MSF;
3344 toc.cdte_track = CDROM_LEADOUT;
3345 if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &toc)))
3346 return ret;
3347 sanitize_format(&toc.cdte_addr, &toc.cdte_format, CDROM_LBA);
3348 *last_written = toc.cdte_addr.lba;
3349 return 0;
3350}
3351
3352
3353static int cdrom_get_next_writable(struct cdrom_device_info *cdi, long *next_writable)
3354{
3355 disc_information di;
3356 track_information ti;
3357 __u16 last_track;
3358 int ret, ti_size;
3359
3360 if (!CDROM_CAN(CDC_GENERIC_PACKET))
3361 goto use_last_written;
3362
3363 ret = cdrom_get_disc_info(cdi, &di);
3364 if (ret < 0 || ret < offsetof(typeof(di), last_track_lsb)
3365 + sizeof(di.last_track_lsb))
3366 goto use_last_written;
3367
3368
3369 last_track = (di.last_track_msb << 8) | di.last_track_lsb;
3370 ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
3371 if (ti_size < 0 || ti_size < offsetof(typeof(ti), track_start))
3372 goto use_last_written;
3373
3374
3375 if (ti.blank) {
3376 if (last_track == 1)
3377 goto use_last_written;
3378 last_track--;
3379 ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
3380 if (ti_size < 0)
3381 goto use_last_written;
3382 }
3383
3384
3385 if (ti.nwa_v && ti_size >= offsetof(typeof(ti), next_writable)
3386 + sizeof(ti.next_writable)) {
3387 *next_writable = be32_to_cpu(ti.next_writable);
3388 return 0;
3389 }
3390
3391use_last_written:
3392 if ((ret = cdrom_get_last_written(cdi, next_writable))) {
3393 *next_writable = 0;
3394 return ret;
3395 } else {
3396 *next_writable += 7;
3397 return 0;
3398 }
3399}
3400
3401EXPORT_SYMBOL(cdrom_get_last_written);
3402EXPORT_SYMBOL(register_cdrom);
3403EXPORT_SYMBOL(unregister_cdrom);
3404EXPORT_SYMBOL(cdrom_open);
3405EXPORT_SYMBOL(cdrom_release);
3406EXPORT_SYMBOL(cdrom_ioctl);
3407EXPORT_SYMBOL(cdrom_media_changed);
3408EXPORT_SYMBOL(cdrom_number_of_slots);
3409EXPORT_SYMBOL(cdrom_mode_select);
3410EXPORT_SYMBOL(cdrom_mode_sense);
3411EXPORT_SYMBOL(init_cdrom_command);
3412EXPORT_SYMBOL(cdrom_get_media_event);
3413
3414#ifdef CONFIG_SYSCTL
3415
3416#define CDROM_STR_SIZE 1000
3417
3418static struct cdrom_sysctl_settings {
3419 char info[CDROM_STR_SIZE];
3420 int autoclose;
3421 int autoeject;
3422 int debug;
3423 int lock;
3424 int check;
3425} cdrom_sysctl_settings;
3426
3427enum cdrom_print_option {
3428 CTL_NAME,
3429 CTL_SPEED,
3430 CTL_SLOTS,
3431 CTL_CAPABILITY
3432};
3433
3434static int cdrom_print_info(const char *header, int val, char *info,
3435 int *pos, enum cdrom_print_option option)
3436{
3437 const int max_size = sizeof(cdrom_sysctl_settings.info);
3438 struct cdrom_device_info *cdi;
3439 int ret;
3440
3441 ret = scnprintf(info + *pos, max_size - *pos, header);
3442 if (!ret)
3443 return 1;
3444
3445 *pos += ret;
3446
3447 list_for_each_entry(cdi, &cdrom_list, list) {
3448 switch (option) {
3449 case CTL_NAME:
3450 ret = scnprintf(info + *pos, max_size - *pos,
3451 "\t%s", cdi->name);
3452 break;
3453 case CTL_SPEED:
3454 ret = scnprintf(info + *pos, max_size - *pos,
3455 "\t%d", cdi->speed);
3456 break;
3457 case CTL_SLOTS:
3458 ret = scnprintf(info + *pos, max_size - *pos,
3459 "\t%d", cdi->capacity);
3460 break;
3461 case CTL_CAPABILITY:
3462 ret = scnprintf(info + *pos, max_size - *pos,
3463 "\t%d", CDROM_CAN(val) != 0);
3464 break;
3465 default:
3466 pr_info("invalid option%d\n", option);
3467 return 1;
3468 }
3469 if (!ret)
3470 return 1;
3471 *pos += ret;
3472 }
3473
3474 return 0;
3475}
3476
3477static int cdrom_sysctl_info(ctl_table *ctl, int write,
3478 void __user *buffer, size_t *lenp, loff_t *ppos)
3479{
3480 int pos;
3481 char *info = cdrom_sysctl_settings.info;
3482 const int max_size = sizeof(cdrom_sysctl_settings.info);
3483
3484 if (!*lenp || (*ppos && !write)) {
3485 *lenp = 0;
3486 return 0;
3487 }
3488
3489 mutex_lock(&cdrom_mutex);
3490
3491 pos = sprintf(info, "CD-ROM information, " VERSION "\n");
3492
3493 if (cdrom_print_info("\ndrive name:\t", 0, info, &pos, CTL_NAME))
3494 goto done;
3495 if (cdrom_print_info("\ndrive speed:\t", 0, info, &pos, CTL_SPEED))
3496 goto done;
3497 if (cdrom_print_info("\ndrive # of slots:", 0, info, &pos, CTL_SLOTS))
3498 goto done;
3499 if (cdrom_print_info("\nCan close tray:\t",
3500 CDC_CLOSE_TRAY, info, &pos, CTL_CAPABILITY))
3501 goto done;
3502 if (cdrom_print_info("\nCan open tray:\t",
3503 CDC_OPEN_TRAY, info, &pos, CTL_CAPABILITY))
3504 goto done;
3505 if (cdrom_print_info("\nCan lock tray:\t",
3506 CDC_LOCK, info, &pos, CTL_CAPABILITY))
3507 goto done;
3508 if (cdrom_print_info("\nCan change speed:",
3509 CDC_SELECT_SPEED, info, &pos, CTL_CAPABILITY))
3510 goto done;
3511 if (cdrom_print_info("\nCan select disk:",
3512 CDC_SELECT_DISC, info, &pos, CTL_CAPABILITY))
3513 goto done;
3514 if (cdrom_print_info("\nCan read multisession:",
3515 CDC_MULTI_SESSION, info, &pos, CTL_CAPABILITY))
3516 goto done;
3517 if (cdrom_print_info("\nCan read MCN:\t",
3518 CDC_MCN, info, &pos, CTL_CAPABILITY))
3519 goto done;
3520 if (cdrom_print_info("\nReports media changed:",
3521 CDC_MEDIA_CHANGED, info, &pos, CTL_CAPABILITY))
3522 goto done;
3523 if (cdrom_print_info("\nCan play audio:\t",
3524 CDC_PLAY_AUDIO, info, &pos, CTL_CAPABILITY))
3525 goto done;
3526 if (cdrom_print_info("\nCan write CD-R:\t",
3527 CDC_CD_R, info, &pos, CTL_CAPABILITY))
3528 goto done;
3529 if (cdrom_print_info("\nCan write CD-RW:",
3530 CDC_CD_RW, info, &pos, CTL_CAPABILITY))
3531 goto done;
3532 if (cdrom_print_info("\nCan read DVD:\t",
3533 CDC_DVD, info, &pos, CTL_CAPABILITY))
3534 goto done;
3535 if (cdrom_print_info("\nCan write DVD-R:",
3536 CDC_DVD_R, info, &pos, CTL_CAPABILITY))
3537 goto done;
3538 if (cdrom_print_info("\nCan write DVD-RAM:",
3539 CDC_DVD_RAM, info, &pos, CTL_CAPABILITY))
3540 goto done;
3541 if (cdrom_print_info("\nCan read MRW:\t",
3542 CDC_MRW, info, &pos, CTL_CAPABILITY))
3543 goto done;
3544 if (cdrom_print_info("\nCan write MRW:\t",
3545 CDC_MRW_W, info, &pos, CTL_CAPABILITY))
3546 goto done;
3547 if (cdrom_print_info("\nCan write RAM:\t",
3548 CDC_RAM, info, &pos, CTL_CAPABILITY))
3549 goto done;
3550 if (!scnprintf(info + pos, max_size - pos, "\n\n"))
3551 goto done;
3552doit:
3553 mutex_unlock(&cdrom_mutex);
3554 return proc_dostring(ctl, write, buffer, lenp, ppos);
3555done:
3556 pr_info("info buffer too small\n");
3557 goto doit;
3558}
3559
3560
3561
3562
3563
3564static void cdrom_update_settings(void)
3565{
3566 struct cdrom_device_info *cdi;
3567
3568 mutex_lock(&cdrom_mutex);
3569 list_for_each_entry(cdi, &cdrom_list, list) {
3570 if (autoclose && CDROM_CAN(CDC_CLOSE_TRAY))
3571 cdi->options |= CDO_AUTO_CLOSE;
3572 else if (!autoclose)
3573 cdi->options &= ~CDO_AUTO_CLOSE;
3574 if (autoeject && CDROM_CAN(CDC_OPEN_TRAY))
3575 cdi->options |= CDO_AUTO_EJECT;
3576 else if (!autoeject)
3577 cdi->options &= ~CDO_AUTO_EJECT;
3578 if (lockdoor && CDROM_CAN(CDC_LOCK))
3579 cdi->options |= CDO_LOCK;
3580 else if (!lockdoor)
3581 cdi->options &= ~CDO_LOCK;
3582 if (check_media_type)
3583 cdi->options |= CDO_CHECK_TYPE;
3584 else
3585 cdi->options &= ~CDO_CHECK_TYPE;
3586 }
3587 mutex_unlock(&cdrom_mutex);
3588}
3589
3590static int cdrom_sysctl_handler(ctl_table *ctl, int write,
3591 void __user *buffer, size_t *lenp, loff_t *ppos)
3592{
3593 int ret;
3594
3595 ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
3596
3597 if (write) {
3598
3599
3600 autoclose = !!cdrom_sysctl_settings.autoclose;
3601 autoeject = !!cdrom_sysctl_settings.autoeject;
3602 debug = !!cdrom_sysctl_settings.debug;
3603 lockdoor = !!cdrom_sysctl_settings.lock;
3604 check_media_type = !!cdrom_sysctl_settings.check;
3605
3606
3607
3608
3609 cdrom_update_settings();
3610 }
3611
3612 return ret;
3613}
3614
3615
3616static ctl_table cdrom_table[] = {
3617 {
3618 .procname = "info",
3619 .data = &cdrom_sysctl_settings.info,
3620 .maxlen = CDROM_STR_SIZE,
3621 .mode = 0444,
3622 .proc_handler = cdrom_sysctl_info,
3623 },
3624 {
3625 .procname = "autoclose",
3626 .data = &cdrom_sysctl_settings.autoclose,
3627 .maxlen = sizeof(int),
3628 .mode = 0644,
3629 .proc_handler = cdrom_sysctl_handler,
3630 },
3631 {
3632 .procname = "autoeject",
3633 .data = &cdrom_sysctl_settings.autoeject,
3634 .maxlen = sizeof(int),
3635 .mode = 0644,
3636 .proc_handler = cdrom_sysctl_handler,
3637 },
3638 {
3639 .procname = "debug",
3640 .data = &cdrom_sysctl_settings.debug,
3641 .maxlen = sizeof(int),
3642 .mode = 0644,
3643 .proc_handler = cdrom_sysctl_handler,
3644 },
3645 {
3646 .procname = "lock",
3647 .data = &cdrom_sysctl_settings.lock,
3648 .maxlen = sizeof(int),
3649 .mode = 0644,
3650 .proc_handler = cdrom_sysctl_handler,
3651 },
3652 {
3653 .procname = "check_media",
3654 .data = &cdrom_sysctl_settings.check,
3655 .maxlen = sizeof(int),
3656 .mode = 0644,
3657 .proc_handler = cdrom_sysctl_handler
3658 },
3659 { }
3660};
3661
3662static ctl_table cdrom_cdrom_table[] = {
3663 {
3664 .procname = "cdrom",
3665 .maxlen = 0,
3666 .mode = 0555,
3667 .child = cdrom_table,
3668 },
3669 { }
3670};
3671
3672
3673static ctl_table cdrom_root_table[] = {
3674 {
3675 .procname = "dev",
3676 .maxlen = 0,
3677 .mode = 0555,
3678 .child = cdrom_cdrom_table,
3679 },
3680 { }
3681};
3682static struct ctl_table_header *cdrom_sysctl_header;
3683
3684static void cdrom_sysctl_register(void)
3685{
3686 static int initialized;
3687
3688 if (initialized == 1)
3689 return;
3690
3691 cdrom_sysctl_header = register_sysctl_table(cdrom_root_table);
3692
3693
3694 cdrom_sysctl_settings.autoclose = autoclose;
3695 cdrom_sysctl_settings.autoeject = autoeject;
3696 cdrom_sysctl_settings.debug = debug;
3697 cdrom_sysctl_settings.lock = lockdoor;
3698 cdrom_sysctl_settings.check = check_media_type;
3699
3700 initialized = 1;
3701}
3702
3703static void cdrom_sysctl_unregister(void)
3704{
3705 if (cdrom_sysctl_header)
3706 unregister_sysctl_table(cdrom_sysctl_header);
3707}
3708
3709#else
3710
3711static void cdrom_sysctl_register(void)
3712{
3713}
3714
3715static void cdrom_sysctl_unregister(void)
3716{
3717}
3718
3719#endif
3720
3721static int __init cdrom_init(void)
3722{
3723 cdrom_sysctl_register();
3724
3725 return 0;
3726}
3727
3728static void __exit cdrom_exit(void)
3729{
3730 pr_info("Uniform CD-ROM driver unloaded\n");
3731 cdrom_sysctl_unregister();
3732}
3733
3734module_init(cdrom_init);
3735module_exit(cdrom_exit);
3736MODULE_LICENSE("GPL");
3737