1
2
3
4
5
6
7
8
9
10
11#ifndef _LINUX_CDROM_H
12#define _LINUX_CDROM_H
13
14#include <asm/byteorder.h>
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#define EDRIVE_CANT_DO_THIS EOPNOTSUPP
46
47
48
49
50
51
52#define CDROMPAUSE 0x5301
53#define CDROMRESUME 0x5302
54#define CDROMPLAYMSF 0x5303
55#define CDROMPLAYTRKIND 0x5304
56
57#define CDROMREADTOCHDR 0x5305
58
59#define CDROMREADTOCENTRY 0x5306
60
61#define CDROMSTOP 0x5307
62#define CDROMSTART 0x5308
63#define CDROMEJECT 0x5309
64#define CDROMVOLCTRL 0x530a
65
66#define CDROMSUBCHNL 0x530b
67
68#define CDROMREADMODE2 0x530c
69
70#define CDROMREADMODE1 0x530d
71
72#define CDROMREADAUDIO 0x530e
73#define CDROMEJECT_SW 0x530f
74#define CDROMMULTISESSION 0x5310
75
76
77#define CDROM_GET_MCN 0x5311
78
79#define CDROM_GET_UPC CDROM_GET_MCN
80
81#define CDROMRESET 0x5312
82#define CDROMVOLREAD 0x5313
83
84#define CDROMREADRAW 0x5314
85
86
87
88
89#define CDROMREADCOOKED 0x5315
90#define CDROMSEEK 0x5316
91
92
93
94
95
96#define CDROMPLAYBLK 0x5317
97
98
99
100
101#define CDROMREADALL 0x5318
102
103
104
105
106
107
108
109
110#define CDROMGETSPINDOWN 0x531d
111#define CDROMSETSPINDOWN 0x531e
112
113
114
115
116
117
118#define CDROMCLOSETRAY 0x5319
119#define CDROM_SET_OPTIONS 0x5320
120#define CDROM_CLEAR_OPTIONS 0x5321
121#define CDROM_SELECT_SPEED 0x5322
122#define CDROM_SELECT_DISC 0x5323
123#define CDROM_MEDIA_CHANGED 0x5325
124#define CDROM_DRIVE_STATUS 0x5326
125#define CDROM_DISC_STATUS 0x5327
126#define CDROM_CHANGER_NSLOTS 0x5328
127#define CDROM_LOCKDOOR 0x5329
128#define CDROM_DEBUG 0x5330
129#define CDROM_GET_CAPABILITY 0x5331
130
131
132
133
134
135
136#define CDROMAUDIOBUFSIZ 0x5382
137
138
139
140#define DVD_READ_STRUCT 0x5390
141#define DVD_WRITE_STRUCT 0x5391
142#define DVD_AUTH 0x5392
143
144#define CDROM_SEND_PACKET 0x5393
145#define CDROM_NEXT_WRITABLE 0x5394
146#define CDROM_LAST_WRITTEN 0x5395
147
148
149
150
151
152
153struct cdrom_msf0
154{
155 __u8 minute;
156 __u8 second;
157 __u8 frame;
158};
159
160
161union cdrom_addr
162{
163 struct cdrom_msf0 msf;
164 int lba;
165};
166
167
168struct cdrom_msf
169{
170 __u8 cdmsf_min0;
171 __u8 cdmsf_sec0;
172 __u8 cdmsf_frame0;
173 __u8 cdmsf_min1;
174 __u8 cdmsf_sec1;
175 __u8 cdmsf_frame1;
176};
177
178
179struct cdrom_ti
180{
181 __u8 cdti_trk0;
182 __u8 cdti_ind0;
183 __u8 cdti_trk1;
184 __u8 cdti_ind1;
185};
186
187
188struct cdrom_tochdr
189{
190 __u8 cdth_trk0;
191 __u8 cdth_trk1;
192};
193
194
195struct cdrom_volctrl
196{
197 __u8 channel0;
198 __u8 channel1;
199 __u8 channel2;
200 __u8 channel3;
201};
202
203
204struct cdrom_subchnl
205{
206 __u8 cdsc_format;
207 __u8 cdsc_audiostatus;
208 __u8 cdsc_adr: 4;
209 __u8 cdsc_ctrl: 4;
210 __u8 cdsc_trk;
211 __u8 cdsc_ind;
212 union cdrom_addr cdsc_absaddr;
213 union cdrom_addr cdsc_reladdr;
214};
215
216
217
218struct cdrom_tocentry
219{
220 __u8 cdte_track;
221 __u8 cdte_adr :4;
222 __u8 cdte_ctrl :4;
223 __u8 cdte_format;
224 union cdrom_addr cdte_addr;
225 __u8 cdte_datamode;
226};
227
228
229struct cdrom_read
230{
231 int cdread_lba;
232 char *cdread_bufaddr;
233 int cdread_buflen;
234};
235
236
237struct cdrom_read_audio
238{
239 union cdrom_addr addr;
240 __u8 addr_format;
241 int nframes;
242 __u8 __user *buf;
243};
244
245
246struct cdrom_multisession
247{
248 union cdrom_addr addr;
249
250
251 __u8 xa_flag;
252 __u8 addr_format;
253};
254
255
256
257
258
259
260struct cdrom_mcn
261{
262 __u8 medium_catalog_number[14];
263};
264
265
266struct cdrom_blk
267{
268 unsigned from;
269 unsigned short len;
270};
271
272#define CDROM_PACKET_SIZE 12
273
274#define CGC_DATA_UNKNOWN 0
275#define CGC_DATA_WRITE 1
276#define CGC_DATA_READ 2
277#define CGC_DATA_NONE 3
278
279
280struct cdrom_generic_command
281{
282 unsigned char cmd[CDROM_PACKET_SIZE];
283 unsigned char __user *buffer;
284 unsigned int buflen;
285 int stat;
286 struct request_sense __user *sense;
287 unsigned char data_direction;
288 int quiet;
289 int timeout;
290 void __user *reserved[1];
291};
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328#define CD_MINS 74
329#define CD_SECS 60
330#define CD_FRAMES 75
331#define CD_SYNC_SIZE 12
332#define CD_MSF_OFFSET 150
333#define CD_CHUNK_SIZE 24
334#define CD_NUM_OF_CHUNKS 98
335#define CD_FRAMESIZE_SUB 96
336#define CD_HEAD_SIZE 4
337#define CD_SUBHEAD_SIZE 8
338#define CD_EDC_SIZE 4
339#define CD_ZERO_SIZE 8
340#define CD_ECC_SIZE 276
341#define CD_FRAMESIZE 2048
342#define CD_FRAMESIZE_RAW 2352
343#define CD_FRAMESIZE_RAWER 2646
344
345#define CD_FRAMESIZE_RAW1 (CD_FRAMESIZE_RAW-CD_SYNC_SIZE)
346#define CD_FRAMESIZE_RAW0 (CD_FRAMESIZE_RAW-CD_SYNC_SIZE-CD_HEAD_SIZE)
347
348#define CD_XA_HEAD (CD_HEAD_SIZE+CD_SUBHEAD_SIZE)
349#define CD_XA_TAIL (CD_EDC_SIZE+CD_ECC_SIZE)
350#define CD_XA_SYNC_HEAD (CD_SYNC_SIZE+CD_XA_HEAD)
351
352
353#define CDROM_LBA 0x01
354#define CDROM_MSF 0x02
355
356
357#define CDROM_DATA_TRACK 0x04
358
359
360#define CDROM_LEADOUT 0xAA
361
362
363#define CDROM_AUDIO_INVALID 0x00
364#define CDROM_AUDIO_PLAY 0x11
365#define CDROM_AUDIO_PAUSED 0x12
366#define CDROM_AUDIO_COMPLETED 0x13
367#define CDROM_AUDIO_ERROR 0x14
368#define CDROM_AUDIO_NO_STATUS 0x15
369
370
371#define CDC_CLOSE_TRAY 0x1
372#define CDC_OPEN_TRAY 0x2
373#define CDC_LOCK 0x4
374#define CDC_SELECT_SPEED 0x8
375#define CDC_SELECT_DISC 0x10
376#define CDC_MULTI_SESSION 0x20
377#define CDC_MCN 0x40
378#define CDC_MEDIA_CHANGED 0x80
379#define CDC_PLAY_AUDIO 0x100
380#define CDC_RESET 0x200
381#define CDC_DRIVE_STATUS 0x800
382#define CDC_GENERIC_PACKET 0x1000
383#define CDC_CD_R 0x2000
384#define CDC_CD_RW 0x4000
385#define CDC_DVD 0x8000
386#define CDC_DVD_R 0x10000
387#define CDC_DVD_RAM 0x20000
388#define CDC_MO_DRIVE 0x40000
389#define CDC_MRW 0x80000
390#define CDC_MRW_W 0x100000
391#define CDC_RAM 0x200000
392
393
394#define CDS_NO_INFO 0
395#define CDS_NO_DISC 1
396#define CDS_TRAY_OPEN 2
397#define CDS_DRIVE_NOT_READY 3
398#define CDS_DISC_OK 4
399
400
401
402#define CDS_AUDIO 100
403#define CDS_DATA_1 101
404#define CDS_DATA_2 102
405#define CDS_XA_2_1 103
406#define CDS_XA_2_2 104
407#define CDS_MIXED 105
408
409
410#define CDO_AUTO_CLOSE 0x1
411#define CDO_AUTO_EJECT 0x2
412#define CDO_USE_FFLAGS 0x4
413#define CDO_LOCK 0x8
414#define CDO_CHECK_TYPE 0x10
415
416
417#define CDSL_NONE (INT_MAX-1)
418#define CDSL_CURRENT INT_MAX
419
420
421
422
423
424
425#define CD_PART_MAX 64
426#define CD_PART_MASK (CD_PART_MAX - 1)
427
428
429
430
431
432
433
434#define GPCMD_BLANK 0xa1
435#define GPCMD_CLOSE_TRACK 0x5b
436#define GPCMD_FLUSH_CACHE 0x35
437#define GPCMD_FORMAT_UNIT 0x04
438#define GPCMD_GET_CONFIGURATION 0x46
439#define GPCMD_GET_EVENT_STATUS_NOTIFICATION 0x4a
440#define GPCMD_GET_PERFORMANCE 0xac
441#define GPCMD_INQUIRY 0x12
442#define GPCMD_LOAD_UNLOAD 0xa6
443#define GPCMD_MECHANISM_STATUS 0xbd
444#define GPCMD_MODE_SELECT_10 0x55
445#define GPCMD_MODE_SENSE_10 0x5a
446#define GPCMD_PAUSE_RESUME 0x4b
447#define GPCMD_PLAY_AUDIO_10 0x45
448#define GPCMD_PLAY_AUDIO_MSF 0x47
449#define GPCMD_PLAY_AUDIO_TI 0x48
450#define GPCMD_PLAY_CD 0xbc
451#define GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
452#define GPCMD_READ_10 0x28
453#define GPCMD_READ_12 0xa8
454#define GPCMD_READ_BUFFER 0x3c
455#define GPCMD_READ_BUFFER_CAPACITY 0x5c
456#define GPCMD_READ_CDVD_CAPACITY 0x25
457#define GPCMD_READ_CD 0xbe
458#define GPCMD_READ_CD_MSF 0xb9
459#define GPCMD_READ_DISC_INFO 0x51
460#define GPCMD_READ_DVD_STRUCTURE 0xad
461#define GPCMD_READ_FORMAT_CAPACITIES 0x23
462#define GPCMD_READ_HEADER 0x44
463#define GPCMD_READ_TRACK_RZONE_INFO 0x52
464#define GPCMD_READ_SUBCHANNEL 0x42
465#define GPCMD_READ_TOC_PMA_ATIP 0x43
466#define GPCMD_REPAIR_RZONE_TRACK 0x58
467#define GPCMD_REPORT_KEY 0xa4
468#define GPCMD_REQUEST_SENSE 0x03
469#define GPCMD_RESERVE_RZONE_TRACK 0x53
470#define GPCMD_SEND_CUE_SHEET 0x5d
471#define GPCMD_SCAN 0xba
472#define GPCMD_SEEK 0x2b
473#define GPCMD_SEND_DVD_STRUCTURE 0xbf
474#define GPCMD_SEND_EVENT 0xa2
475#define GPCMD_SEND_KEY 0xa3
476#define GPCMD_SEND_OPC 0x54
477#define GPCMD_SET_READ_AHEAD 0xa7
478#define GPCMD_SET_STREAMING 0xb6
479#define GPCMD_START_STOP_UNIT 0x1b
480#define GPCMD_STOP_PLAY_SCAN 0x4e
481#define GPCMD_TEST_UNIT_READY 0x00
482#define GPCMD_VERIFY_10 0x2f
483#define GPCMD_WRITE_10 0x2a
484#define GPCMD_WRITE_12 0xaa
485#define GPCMD_WRITE_AND_VERIFY_10 0x2e
486#define GPCMD_WRITE_BUFFER 0x3b
487
488
489
490
491#define GPCMD_SET_SPEED 0xbb
492
493
494#define GPCMD_PLAYAUDIO_TI 0x48
495
496
497
498
499#define GPCMD_GET_MEDIA_STATUS 0xda
500
501
502#define GPMODE_VENDOR_PAGE 0x00
503#define GPMODE_R_W_ERROR_PAGE 0x01
504#define GPMODE_WRITE_PARMS_PAGE 0x05
505#define GPMODE_WCACHING_PAGE 0x08
506#define GPMODE_AUDIO_CTL_PAGE 0x0e
507#define GPMODE_POWER_PAGE 0x1a
508#define GPMODE_FAULT_FAIL_PAGE 0x1c
509#define GPMODE_TO_PROTECT_PAGE 0x1d
510#define GPMODE_CAPABILITIES_PAGE 0x2a
511#define GPMODE_ALL_PAGES 0x3f
512
513
514#define GPMODE_CDROM_PAGE 0x0d
515
516
517
518
519#define DVD_STRUCT_PHYSICAL 0x00
520#define DVD_STRUCT_COPYRIGHT 0x01
521#define DVD_STRUCT_DISCKEY 0x02
522#define DVD_STRUCT_BCA 0x03
523#define DVD_STRUCT_MANUFACT 0x04
524
525struct dvd_layer {
526 __u8 book_version : 4;
527 __u8 book_type : 4;
528 __u8 min_rate : 4;
529 __u8 disc_size : 4;
530 __u8 layer_type : 4;
531 __u8 track_path : 1;
532 __u8 nlayers : 2;
533 __u8 track_density : 4;
534 __u8 linear_density : 4;
535 __u8 bca : 1;
536 __u32 start_sector;
537 __u32 end_sector;
538 __u32 end_sector_l0;
539};
540
541#define DVD_LAYERS 4
542
543struct dvd_physical {
544 __u8 type;
545 __u8 layer_num;
546 struct dvd_layer layer[DVD_LAYERS];
547};
548
549struct dvd_copyright {
550 __u8 type;
551
552 __u8 layer_num;
553 __u8 cpst;
554 __u8 rmi;
555};
556
557struct dvd_disckey {
558 __u8 type;
559
560 unsigned agid : 2;
561 __u8 value[2048];
562};
563
564struct dvd_bca {
565 __u8 type;
566
567 int len;
568 __u8 value[188];
569};
570
571struct dvd_manufact {
572 __u8 type;
573
574 __u8 layer_num;
575 int len;
576 __u8 value[2048];
577};
578
579typedef union {
580 __u8 type;
581
582 struct dvd_physical physical;
583 struct dvd_copyright copyright;
584 struct dvd_disckey disckey;
585 struct dvd_bca bca;
586 struct dvd_manufact manufact;
587} dvd_struct;
588
589
590
591
592
593
594#define DVD_LU_SEND_AGID 0
595#define DVD_HOST_SEND_CHALLENGE 1
596#define DVD_LU_SEND_KEY1 2
597#define DVD_LU_SEND_CHALLENGE 3
598#define DVD_HOST_SEND_KEY2 4
599
600
601#define DVD_AUTH_ESTABLISHED 5
602#define DVD_AUTH_FAILURE 6
603
604
605#define DVD_LU_SEND_TITLE_KEY 7
606#define DVD_LU_SEND_ASF 8
607#define DVD_INVALIDATE_AGID 9
608#define DVD_LU_SEND_RPC_STATE 10
609#define DVD_HOST_SEND_RPC_STATE 11
610
611
612typedef __u8 dvd_key[5];
613typedef __u8 dvd_challenge[10];
614
615struct dvd_lu_send_agid {
616 __u8 type;
617 unsigned agid : 2;
618};
619
620struct dvd_host_send_challenge {
621 __u8 type;
622 unsigned agid : 2;
623
624 dvd_challenge chal;
625};
626
627struct dvd_send_key {
628 __u8 type;
629 unsigned agid : 2;
630
631 dvd_key key;
632};
633
634struct dvd_lu_send_challenge {
635 __u8 type;
636 unsigned agid : 2;
637
638 dvd_challenge chal;
639};
640
641#define DVD_CPM_NO_COPYRIGHT 0
642#define DVD_CPM_COPYRIGHTED 1
643
644#define DVD_CP_SEC_NONE 0
645#define DVD_CP_SEC_EXIST 1
646
647#define DVD_CGMS_UNRESTRICTED 0
648#define DVD_CGMS_SINGLE 2
649#define DVD_CGMS_RESTRICTED 3
650
651struct dvd_lu_send_title_key {
652 __u8 type;
653 unsigned agid : 2;
654
655 dvd_key title_key;
656 int lba;
657 unsigned cpm : 1;
658 unsigned cp_sec : 1;
659 unsigned cgms : 2;
660};
661
662struct dvd_lu_send_asf {
663 __u8 type;
664 unsigned agid : 2;
665
666 unsigned asf : 1;
667};
668
669struct dvd_host_send_rpcstate {
670 __u8 type;
671 __u8 pdrc;
672};
673
674struct dvd_lu_send_rpcstate {
675 __u8 type : 2;
676 __u8 vra : 3;
677 __u8 ucca : 3;
678 __u8 region_mask;
679 __u8 rpc_scheme;
680};
681
682typedef union {
683 __u8 type;
684
685 struct dvd_lu_send_agid lsa;
686 struct dvd_host_send_challenge hsc;
687 struct dvd_send_key lsk;
688 struct dvd_lu_send_challenge lsc;
689 struct dvd_send_key hsk;
690 struct dvd_lu_send_title_key lstk;
691 struct dvd_lu_send_asf lsasf;
692 struct dvd_host_send_rpcstate hrpcs;
693 struct dvd_lu_send_rpcstate lrpcs;
694} dvd_authinfo;
695
696struct request_sense {
697#if defined(__BIG_ENDIAN_BITFIELD)
698 __u8 valid : 1;
699 __u8 error_code : 7;
700#elif defined(__LITTLE_ENDIAN_BITFIELD)
701 __u8 error_code : 7;
702 __u8 valid : 1;
703#endif
704 __u8 segment_number;
705#if defined(__BIG_ENDIAN_BITFIELD)
706 __u8 reserved1 : 2;
707 __u8 ili : 1;
708 __u8 reserved2 : 1;
709 __u8 sense_key : 4;
710#elif defined(__LITTLE_ENDIAN_BITFIELD)
711 __u8 sense_key : 4;
712 __u8 reserved2 : 1;
713 __u8 ili : 1;
714 __u8 reserved1 : 2;
715#endif
716 __u8 information[4];
717 __u8 add_sense_len;
718 __u8 command_info[4];
719 __u8 asc;
720 __u8 ascq;
721 __u8 fruc;
722 __u8 sks[3];
723 __u8 asb[46];
724};
725
726
727
728
729#define CDF_RWRT 0x0020
730#define CDF_HWDM 0x0024
731#define CDF_MRW 0x0028
732
733
734
735
736#define CDM_MRW_NOTMRW 0
737#define CDM_MRW_BGFORMAT_INACTIVE 1
738#define CDM_MRW_BGFORMAT_ACTIVE 2
739#define CDM_MRW_BGFORMAT_COMPLETE 3
740
741
742
743
744#define MRW_LBA_DMA 0
745#define MRW_LBA_GAA 1
746
747
748
749
750
751#define MRW_MODE_PC_PRE1 0x2c
752#define MRW_MODE_PC 0x03
753
754struct mrw_feature_desc {
755 __be16 feature_code;
756#if defined(__BIG_ENDIAN_BITFIELD)
757 __u8 reserved1 : 2;
758 __u8 feature_version : 4;
759 __u8 persistent : 1;
760 __u8 curr : 1;
761#elif defined(__LITTLE_ENDIAN_BITFIELD)
762 __u8 curr : 1;
763 __u8 persistent : 1;
764 __u8 feature_version : 4;
765 __u8 reserved1 : 2;
766#endif
767 __u8 add_len;
768#if defined(__BIG_ENDIAN_BITFIELD)
769 __u8 reserved2 : 7;
770 __u8 write : 1;
771#elif defined(__LITTLE_ENDIAN_BITFIELD)
772 __u8 write : 1;
773 __u8 reserved2 : 7;
774#endif
775 __u8 reserved3;
776 __u8 reserved4;
777 __u8 reserved5;
778};
779
780
781struct rwrt_feature_desc {
782 __be16 feature_code;
783#if defined(__BIG_ENDIAN_BITFIELD)
784 __u8 reserved1 : 2;
785 __u8 feature_version : 4;
786 __u8 persistent : 1;
787 __u8 curr : 1;
788#elif defined(__LITTLE_ENDIAN_BITFIELD)
789 __u8 curr : 1;
790 __u8 persistent : 1;
791 __u8 feature_version : 4;
792 __u8 reserved1 : 2;
793#endif
794 __u8 add_len;
795 __u32 last_lba;
796 __u32 block_size;
797 __u16 blocking;
798#if defined(__BIG_ENDIAN_BITFIELD)
799 __u8 reserved2 : 7;
800 __u8 page_present : 1;
801#elif defined(__LITTLE_ENDIAN_BITFIELD)
802 __u8 page_present : 1;
803 __u8 reserved2 : 7;
804#endif
805 __u8 reserved3;
806};
807
808typedef struct {
809 __be16 disc_information_length;
810#if defined(__BIG_ENDIAN_BITFIELD)
811 __u8 reserved1 : 3;
812 __u8 erasable : 1;
813 __u8 border_status : 2;
814 __u8 disc_status : 2;
815#elif defined(__LITTLE_ENDIAN_BITFIELD)
816 __u8 disc_status : 2;
817 __u8 border_status : 2;
818 __u8 erasable : 1;
819 __u8 reserved1 : 3;
820#else
821#error "Please fix <asm/byteorder.h>"
822#endif
823 __u8 n_first_track;
824 __u8 n_sessions_lsb;
825 __u8 first_track_lsb;
826 __u8 last_track_lsb;
827#if defined(__BIG_ENDIAN_BITFIELD)
828 __u8 did_v : 1;
829 __u8 dbc_v : 1;
830 __u8 uru : 1;
831 __u8 reserved2 : 2;
832 __u8 dbit : 1;
833 __u8 mrw_status : 2;
834#elif defined(__LITTLE_ENDIAN_BITFIELD)
835 __u8 mrw_status : 2;
836 __u8 dbit : 1;
837 __u8 reserved2 : 2;
838 __u8 uru : 1;
839 __u8 dbc_v : 1;
840 __u8 did_v : 1;
841#endif
842 __u8 disc_type;
843 __u8 n_sessions_msb;
844 __u8 first_track_msb;
845 __u8 last_track_msb;
846 __u32 disc_id;
847 __u32 lead_in;
848 __u32 lead_out;
849 __u8 disc_bar_code[8];
850 __u8 reserved3;
851 __u8 n_opc;
852} disc_information;
853
854typedef struct {
855 __be16 track_information_length;
856 __u8 track_lsb;
857 __u8 session_lsb;
858 __u8 reserved1;
859#if defined(__BIG_ENDIAN_BITFIELD)
860 __u8 reserved2 : 2;
861 __u8 damage : 1;
862 __u8 copy : 1;
863 __u8 track_mode : 4;
864 __u8 rt : 1;
865 __u8 blank : 1;
866 __u8 packet : 1;
867 __u8 fp : 1;
868 __u8 data_mode : 4;
869 __u8 reserved3 : 6;
870 __u8 lra_v : 1;
871 __u8 nwa_v : 1;
872#elif defined(__LITTLE_ENDIAN_BITFIELD)
873 __u8 track_mode : 4;
874 __u8 copy : 1;
875 __u8 damage : 1;
876 __u8 reserved2 : 2;
877 __u8 data_mode : 4;
878 __u8 fp : 1;
879 __u8 packet : 1;
880 __u8 blank : 1;
881 __u8 rt : 1;
882 __u8 nwa_v : 1;
883 __u8 lra_v : 1;
884 __u8 reserved3 : 6;
885#endif
886 __be32 track_start;
887 __be32 next_writable;
888 __be32 free_blocks;
889 __be32 fixed_packet_size;
890 __be32 track_size;
891 __be32 last_rec_address;
892} track_information;
893
894struct feature_header {
895 __u32 data_len;
896 __u8 reserved1;
897 __u8 reserved2;
898 __u16 curr_profile;
899};
900
901struct mode_page_header {
902 __be16 mode_data_length;
903 __u8 medium_type;
904 __u8 reserved1;
905 __u8 reserved2;
906 __u8 reserved3;
907 __be16 desc_length;
908};
909
910#ifdef __KERNEL__
911#include <linux/fs.h>
912#include <linux/device.h>
913#include <linux/list.h>
914
915struct packet_command
916{
917 unsigned char cmd[CDROM_PACKET_SIZE];
918 unsigned char *buffer;
919 unsigned int buflen;
920 int stat;
921 struct request_sense *sense;
922 unsigned char data_direction;
923 int quiet;
924 int timeout;
925 void *reserved[1];
926};
927
928
929
930
931#define CDDA_OLD 0
932#define CDDA_BPC_SINGLE 1
933#define CDDA_BPC_FULL 2
934
935
936struct cdrom_device_info {
937 struct cdrom_device_ops *ops;
938 struct list_head list;
939 struct gendisk *disk;
940 void *handle;
941
942 int mask;
943 int speed;
944 int capacity;
945
946 unsigned int options : 30;
947 unsigned mc_flags : 2;
948 int use_count;
949 char name[20];
950
951 __u8 sanyo_slot : 2;
952 __u8 reserved : 6;
953 int cdda_method;
954 __u8 last_sense;
955 __u8 media_written;
956 unsigned short mmc3_profile;
957 int for_data;
958 int (*exit)(struct cdrom_device_info *);
959 int mrw_mode_page;
960};
961
962struct cdrom_device_ops {
963
964 int (*open) (struct cdrom_device_info *, int);
965 void (*release) (struct cdrom_device_info *);
966 int (*drive_status) (struct cdrom_device_info *, int);
967 int (*media_changed) (struct cdrom_device_info *, int);
968 int (*tray_move) (struct cdrom_device_info *, int);
969 int (*lock_door) (struct cdrom_device_info *, int);
970 int (*select_speed) (struct cdrom_device_info *, int);
971 int (*select_disc) (struct cdrom_device_info *, int);
972 int (*get_last_session) (struct cdrom_device_info *,
973 struct cdrom_multisession *);
974 int (*get_mcn) (struct cdrom_device_info *,
975 struct cdrom_mcn *);
976
977 int (*reset) (struct cdrom_device_info *);
978
979 int (*audio_ioctl) (struct cdrom_device_info *,unsigned int, void *);
980
981
982 const int capability;
983 int n_minors;
984
985 int (*generic_packet) (struct cdrom_device_info *,
986 struct packet_command *);
987};
988
989
990extern int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip,
991 struct file *fp);
992extern int cdrom_release(struct cdrom_device_info *cdi, struct file *fp);
993extern int cdrom_ioctl(struct file *file, struct cdrom_device_info *cdi,
994 struct inode *ip, unsigned int cmd, unsigned long arg);
995extern int cdrom_media_changed(struct cdrom_device_info *);
996
997extern int register_cdrom(struct cdrom_device_info *cdi);
998extern void unregister_cdrom(struct cdrom_device_info *cdi);
999
1000typedef struct {
1001 int data;
1002 int audio;
1003 int cdi;
1004 int xa;
1005 long error;
1006} tracktype;
1007
1008extern int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written);
1009extern int cdrom_number_of_slots(struct cdrom_device_info *cdi);
1010extern int cdrom_mode_select(struct cdrom_device_info *cdi,
1011 struct packet_command *cgc);
1012extern int cdrom_mode_sense(struct cdrom_device_info *cdi,
1013 struct packet_command *cgc,
1014 int page_code, int page_control);
1015extern void init_cdrom_command(struct packet_command *cgc,
1016 void *buffer, int len, int type);
1017
1018
1019#define CDROM_MAX_SLOTS 256
1020
1021struct cdrom_mechstat_header {
1022#if defined(__BIG_ENDIAN_BITFIELD)
1023 __u8 fault : 1;
1024 __u8 changer_state : 2;
1025 __u8 curslot : 5;
1026 __u8 mech_state : 3;
1027 __u8 door_open : 1;
1028 __u8 reserved1 : 4;
1029#elif defined(__LITTLE_ENDIAN_BITFIELD)
1030 __u8 curslot : 5;
1031 __u8 changer_state : 2;
1032 __u8 fault : 1;
1033 __u8 reserved1 : 4;
1034 __u8 door_open : 1;
1035 __u8 mech_state : 3;
1036#endif
1037 __u8 curlba[3];
1038 __u8 nslots;
1039 __u16 slot_tablelen;
1040};
1041
1042struct cdrom_slot {
1043#if defined(__BIG_ENDIAN_BITFIELD)
1044 __u8 disc_present : 1;
1045 __u8 reserved1 : 6;
1046 __u8 change : 1;
1047#elif defined(__LITTLE_ENDIAN_BITFIELD)
1048 __u8 change : 1;
1049 __u8 reserved1 : 6;
1050 __u8 disc_present : 1;
1051#endif
1052 __u8 reserved2[3];
1053};
1054
1055struct cdrom_changer_info {
1056 struct cdrom_mechstat_header hdr;
1057 struct cdrom_slot slots[CDROM_MAX_SLOTS];
1058};
1059
1060typedef enum {
1061 mechtype_caddy = 0,
1062 mechtype_tray = 1,
1063 mechtype_popup = 2,
1064 mechtype_individual_changer = 4,
1065 mechtype_cartridge_changer = 5
1066} mechtype_t;
1067
1068typedef struct {
1069#if defined(__BIG_ENDIAN_BITFIELD)
1070 __u8 ps : 1;
1071 __u8 reserved1 : 1;
1072 __u8 page_code : 6;
1073 __u8 page_length;
1074 __u8 reserved2 : 1;
1075 __u8 bufe : 1;
1076 __u8 ls_v : 1;
1077 __u8 test_write : 1;
1078 __u8 write_type : 4;
1079 __u8 multi_session : 2;
1080 __u8 fp : 1;
1081 __u8 copy : 1;
1082 __u8 track_mode : 4;
1083 __u8 reserved3 : 4;
1084 __u8 data_block_type : 4;
1085#elif defined(__LITTLE_ENDIAN_BITFIELD)
1086 __u8 page_code : 6;
1087 __u8 reserved1 : 1;
1088 __u8 ps : 1;
1089 __u8 page_length;
1090 __u8 write_type : 4;
1091 __u8 test_write : 1;
1092 __u8 ls_v : 1;
1093 __u8 bufe : 1;
1094 __u8 reserved2 : 1;
1095 __u8 track_mode : 4;
1096 __u8 copy : 1;
1097 __u8 fp : 1;
1098 __u8 multi_session : 2;
1099 __u8 data_block_type : 4;
1100 __u8 reserved3 : 4;
1101#endif
1102 __u8 link_size;
1103 __u8 reserved4;
1104#if defined(__BIG_ENDIAN_BITFIELD)
1105 __u8 reserved5 : 2;
1106 __u8 app_code : 6;
1107#elif defined(__LITTLE_ENDIAN_BITFIELD)
1108 __u8 app_code : 6;
1109 __u8 reserved5 : 2;
1110#endif
1111 __u8 session_format;
1112 __u8 reserved6;
1113 __be32 packet_size;
1114 __u16 audio_pause;
1115 __u8 mcn[16];
1116 __u8 isrc[16];
1117 __u8 subhdr0;
1118 __u8 subhdr1;
1119 __u8 subhdr2;
1120 __u8 subhdr3;
1121} __attribute__((packed)) write_param_page;
1122
1123struct modesel_head
1124{
1125 __u8 reserved1;
1126 __u8 medium;
1127 __u8 reserved2;
1128 __u8 block_desc_length;
1129 __u8 density;
1130 __u8 number_of_blocks_hi;
1131 __u8 number_of_blocks_med;
1132 __u8 number_of_blocks_lo;
1133 __u8 reserved3;
1134 __u8 block_length_hi;
1135 __u8 block_length_med;
1136 __u8 block_length_lo;
1137};
1138
1139typedef struct {
1140 __u16 report_key_length;
1141 __u8 reserved1;
1142 __u8 reserved2;
1143#if defined(__BIG_ENDIAN_BITFIELD)
1144 __u8 type_code : 2;
1145 __u8 vra : 3;
1146 __u8 ucca : 3;
1147#elif defined(__LITTLE_ENDIAN_BITFIELD)
1148 __u8 ucca : 3;
1149 __u8 vra : 3;
1150 __u8 type_code : 2;
1151#endif
1152 __u8 region_mask;
1153 __u8 rpc_scheme;
1154 __u8 reserved3;
1155} rpc_state_t;
1156
1157struct event_header {
1158 __be16 data_len;
1159#if defined(__BIG_ENDIAN_BITFIELD)
1160 __u8 nea : 1;
1161 __u8 reserved1 : 4;
1162 __u8 notification_class : 3;
1163#elif defined(__LITTLE_ENDIAN_BITFIELD)
1164 __u8 notification_class : 3;
1165 __u8 reserved1 : 4;
1166 __u8 nea : 1;
1167#endif
1168 __u8 supp_event_class;
1169};
1170
1171struct media_event_desc {
1172#if defined(__BIG_ENDIAN_BITFIELD)
1173 __u8 reserved1 : 4;
1174 __u8 media_event_code : 4;
1175 __u8 reserved2 : 6;
1176 __u8 media_present : 1;
1177 __u8 door_open : 1;
1178#elif defined(__LITTLE_ENDIAN_BITFIELD)
1179 __u8 media_event_code : 4;
1180 __u8 reserved1 : 4;
1181 __u8 door_open : 1;
1182 __u8 media_present : 1;
1183 __u8 reserved2 : 6;
1184#endif
1185 __u8 start_slot;
1186 __u8 end_slot;
1187};
1188
1189extern int cdrom_get_media_event(struct cdrom_device_info *cdi, struct media_event_desc *med);
1190
1191static inline void lba_to_msf(int lba, u8 *m, u8 *s, u8 *f)
1192{
1193 lba += CD_MSF_OFFSET;
1194 lba &= 0xffffff;
1195 *m = lba / (CD_SECS * CD_FRAMES);
1196 lba %= (CD_SECS * CD_FRAMES);
1197 *s = lba / CD_FRAMES;
1198 *f = lba % CD_FRAMES;
1199}
1200
1201static inline int msf_to_lba(u8 m, u8 s, u8 f)
1202{
1203 return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
1204}
1205#endif
1206
1207#endif
1208