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