patch-2.1.70 linux/include/linux/cdrom.h

Next file: linux/include/linux/cdu31a.h
Previous file: linux/include/linux/blk.h
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.69/linux/include/linux/cdrom.h linux/include/linux/cdrom.h
@@ -1,108 +1,140 @@
 /*
  * -- <linux/cdrom.h>
- * general (not only SCSI) header library for linux CDROM drivers
- * (C) 1992         David Giller rafetmad@oxy.edu
- *     1994, 1995   Eberhard Moenkeberg emoenke@gwdg.de
- *
+ * General header file for linux CD-ROM drivers 
+ * Copyright (C) 1992         David Giller, rafetmad@oxy.edu
+ *               1994, 1995   Eberhard Moenkeberg, emoenke@gwdg.de
+ *               1996         David van Leeuwen, david@tm.tno.nl
+ *               1997         Erik Andersen, andersee@debian.org
  */
-
+ 
 #ifndef	_LINUX_CDROM_H
 #define	_LINUX_CDROM_H
 
+/*******************************************************
+ * As of Linux 2.1.x, all Linux CD-ROM application programs will use this 
+ * (and only this) include file.  It is my hope to provide Linux with
+ * a uniform interface between software accessing CD-ROMs and the various 
+ * device drivers that actually talk to the drives.  There may still be
+ * 23 different kinds of strange CD-ROM drives, but at least there will 
+ * now be one, and only one, Linux CD-ROM interface.
+ *
+ * Additionally, as of Linux 2.1.x, all Linux application programs 
+ * should use the O_NONBLOCK option when opening a CD-ROM device 
+ * for subsequent ioctl commands.  This allows for neat system errors 
+ * like "No medium found" or "Wrong medium type" upon attempting to 
+ * mount or play an empty slot, mount an audio disc, or play a data disc.
+ * Generally, changing an application program to support O_NONBLOCK
+ * is as easy as the following:
+ *       -    drive = open("/dev/cdrom", O_RDONLY);
+ *       +    drive = open("/dev/cdrom", O_RDONLY | O_NONBLOCK);
+ * It is worth the small change.
+ *
+ *  Patches for many common CD programs (provided by David A. van Leeuwen)
+ *  can be found at:  ftp://ftp.gwdg.de/pub/linux/cdrom/drivers/cm206/
+ * 
+ *******************************************************/
+
+/* When a driver supports a certain function, but the cdrom drive we are 
+ * using doesn't, we will return the error EDRIVE_CANT_DO_THIS.  We will 
+ * borrow the "Operation not supported" error from the network folks to 
+ * accomplish this.  Maybe someday we will get a more targeted error code, 
+ * but this will do for now... */
+#define EDRIVE_CANT_DO_THIS  EOPNOTSUPP
+
+/*******************************************************
+ * The CD-ROM IOCTL commands  -- these should be supported by 
+ * all the various cdrom drivers.  For the CD-ROM ioctls, we 
+ * will commandeer byte 0x53, or 'S'.
+ *******************************************************/
+#define CDROMPAUSE		0x5301 /* Pause Audio Operation */ 
+#define CDROMRESUME		0x5302 /* Resume paused Audio Operation */
+#define CDROMPLAYMSF		0x5303 /* Play Audio MSF (struct cdrom_msf) */
+#define CDROMPLAYTRKIND		0x5304 /* Play Audio Track/index 
+                                           (struct cdrom_ti) */
+#define CDROMREADTOCHDR		0x5305 /* Read TOC header 
+                                           (struct cdrom_tochdr) */
+#define CDROMREADTOCENTRY	0x5306 /* Read TOC entry 
+                                           (struct cdrom_tocentry) */
+#define CDROMSTOP		0x5307 /* Stop the cdrom drive */
+#define CDROMSTART		0x5308 /* Start the cdrom drive */
+#define CDROMEJECT		0x5309 /* Ejects the cdrom media */
+#define CDROMVOLCTRL		0x530a /* Control output volume 
+                                           (struct cdrom_volctrl) */
+#define CDROMSUBCHNL		0x530b /* Read subchannel data 
+                                           (struct cdrom_subchnl) */
+#define CDROMREADMODE2		0x530c /* Read CDROM mode 2 data (2336 Bytes) 
+                                           (struct cdrom_read) */
+#define CDROMREADMODE1		0x530d /* Read CDROM mode 1 data (2048 Bytes)
+                                           (struct cdrom_read) */
+#define CDROMREADAUDIO		0x530e /* (struct cdrom_read_audio) */
+#define CDROMEJECT_SW		0x530f /* enable(1)/disable(0) auto-ejecting */
+#define CDROMMULTISESSION	0x5310 /* Obtain the start-of-last-session 
+                                           address of multi session disks 
+                                           (struct cdrom_multisession) */
+#define CDROM_GET_MCN		0x5311 /* Obtain the "Universal Product Code" 
+                                           if available (struct cdrom_mcn) */
+#define CDROM_GET_UPC		CDROM_GET_MCN  /* This one is depricated, 
+                                          but here anyway for compatability */
+#define CDROMRESET		0x5312 /* hard-reset the drive */
+#define CDROMVOLREAD		0x5313 /* Get the drive's volume setting 
+                                          (struct cdrom_volctrl) */
+#define CDROMREADRAW		0x5314	/* read data in raw mode (2352 Bytes)
+                                           (struct cdrom_read) */
+/* 
+ * These ioctls are used only used in aztcd.c and optcd.c
+ */
+#define CDROMREADCOOKED		0x5315	/* read data in cooked mode */
+#define CDROMSEEK		0x5316  /* seek msf address */
+  
 /*
- * some fix numbers
+ * This ioctl is only used by the scsi-cd driver.  
+   It is for playing audio in logical block addressing mode.
  */
-#define CD_MINS             74 /* max. minutes per CD, not really a limit */
-#define CD_SECS             60 /* seconds per minute */
-#define CD_FRAMES           75 /* frames per second */
-
-#define CD_SYNC_SIZE        12 /* 12 sync bytes per raw data frame, not transfered by the drive */
-#define CD_HEAD_SIZE         4 /* header (address) bytes per raw data frame */
-#define CD_SUBHEAD_SIZE      8 /* subheader bytes per raw XA data frame */
-#define CD_XA_HEAD        (CD_HEAD_SIZE+CD_SUBHEAD_SIZE) /* "before data" part of raw XA frame */
-#define CD_XA_SYNC_HEAD   (CD_SYNC_SIZE+CD_XA_HEAD)/* sync bytes + header of XA frame */
-
-#define CD_FRAMESIZE      2048 /* bytes per frame, "cooked" mode */
-#define CD_FRAMESIZE_RAW  2352 /* bytes per frame, "raw" mode */
-/* most drives don't deliver everything: */
-#define CD_FRAMESIZE_RAW1 (CD_FRAMESIZE_RAW-CD_SYNC_SIZE) /* 2340 */
-#define CD_FRAMESIZE_RAW0 (CD_FRAMESIZE_RAW-CD_SYNC_SIZE-CD_HEAD_SIZE) /* 2336 */
-/* Optics drive also has a 'read all' mode: */
-#define CD_FRAMESIZE_RAWER 2646 /* bytes per frame */
-
-#define CD_EDC_SIZE         4 /* bytes EDC per most raw data frame types */
-#define CD_ZERO_SIZE        8 /* bytes zero per yellow book mode 1 frame */
-#define CD_ECC_SIZE       276 /* bytes ECC per most raw data frame types */
-#define CD_XA_TAIL        (CD_EDC_SIZE+CD_ECC_SIZE) /* "after data" part of raw XA frame */
+#define CDROMPLAYBLK		0x5317	/* (struct cdrom_blk) */
 
-#define CD_FRAMESIZE_SUB    96 /* subchannel data "frame" size */
-#define CD_MSF_OFFSET      150 /* MSF numbering offset of first frame */
+/* 
+ * These ioctls are used only used in optcd.c
+ */
+#define CDROMREADALL		0x5318	/* read all 2646 bytes */
+#define CDROMCLOSETRAY		0x5319	/* pendant of CDROMEJECT */
 
-#define CD_CHUNK_SIZE       24 /* lowest-level "data bytes piece" */
-#define CD_NUM_OF_CHUNKS    98 /* chunks per frame */
+/* 
+ * These ioctls are implemented through the uniform CD-ROM driver
+ * They _will_ be adopted by all CD-ROM drivers, when all the CD-ROM
+ * drivers are eventually ported to the uniform CD-ROM driver interface.
+ */
+#define CDROM_SET_OPTIONS	0x5320  /* Set behavior options */
+#define CDROM_CLEAR_OPTIONS	0x5321  /* Clear behavior options */
+#define CDROM_SELECT_SPEED	0x5322  /* Set the CD-ROM speed */
+#define CDROM_SELECT_DISC	0x5323  /* Select disc (for juke-boxes) */
+#define CDROM_MEDIA_CHANGED	0x5325  /* Check is media changed  */
+#define CDROM_DRIVE_STATUS	0x5326  /* Get tray position, etc. */
+#define CDROM_DISC_STATUS	0x5327  /* Get disc type, etc. */
+#define CDROM_CHANGER_NSLOTS    0x5328  /* Get number of slots */
 
-#define CD_FRAMESIZE_XA CD_FRAMESIZE_RAW1 /* obsolete name */
-#define CD_BLOCK_OFFSET    CD_MSF_OFFSET /* obsolete name */
+/* This ioctl is only used by sbpcd at the moment */
+#define CDROMAUDIOBUFSIZ        0x5382	/* set the audio buffer size */
 
-/*
- * the raw frame layout:
- *
- * - audio (red):                  | audio_sample_bytes |
- *                                 |        2352        |
- *
- * - data (yellow, mode1):         | sync - head - data - EDC - zero - ECC |
- *                                 |  12  -   4  - 2048 -  4  -   8  - 276 |
- *
- * - data (yellow, mode2):         | sync - head - data |
- *                                 |  12  -   4  - 2336 |
- *
- * - XA data (green, mode2 form1): | sync - head - sub - data - EDC - ECC |
- *                                 |  12  -   4  -  8  - 2048 -  4  - 276 |
- *
- * - XA data (green, mode2 form2): | sync - head - sub - data - EDC |
- *                                 |  12  -   4  -  8  - 2324 -  4  |
- *
- * Sector types (format) - Forces the CD-ROM to read the specified sector type,
- *                         attempt to read any other format ends with an error
- *
- * format       sector type             user data size (bytes)
- * -----------------------------------------------------------------------------
- *   1     CD DA (Red Book)             2352    (CD_FRAMESIZE_RAW)
- *   2     Mode1 Form1 (Yellow Book)    2048    (CD_FRAMESIZE)
- *   3     Mode1 Form2 (Yellow Book)    2336    (CD_FRAMESIZE_RAW0)
- *   4     Mode2 Form1 (Green Book)     2048    (CD_FRAMESIZE)
- *   5     Mode2 Form2 (Green Book)     2328    (2324+4 spare bytes)
- *
- *
- * Data Selection Field (pc.c[9]) - This value controls the actual number
- *                                  of bytes transferred from the CD-ROM
- *
- * bit      7       6        5        4        3       2        1        0
- * ----------------------------------------------------------------------------
- *     |  Sync  |   Sub  | Header |  User  | EDC & | Error |  Block  | reserved
- *     |        | Header |        |  Data  |  ECC  | Flags |  Error  |
- *     \-------------------------------------------/\---------------/
- *                           |                              |
- *                           V                              V
- *                   stored on CD (2532)    generated during error correction
- *
- * The maximal number of bytes returned by CD-ROM is 2646 (CD_FRAMESIZE_RAWER),
- * when pc.c[9] = 0xfa.
- *
- */
- 
-
-/*
+/*******************************************************
  * CDROM IOCTL structures
- */
+ *******************************************************/
 
-struct cdrom_blk 
+/* Address in MSF format */
+struct cdrom_msf0		
 {
-	unsigned from;
-	unsigned short len;
+	u_char	minute;
+	u_char	second;
+	u_char	frame;
 };
 
+/* Address in either MSF or logical format */
+union cdrom_addr		
+{
+	struct cdrom_msf0	msf;
+	int			lba;
+};
 
+/* This struct is used by the CDROMPLAYMSF ioctl */ 
 struct cdrom_msf 
 {
 	u_char	cdmsf_min0;	/* start minute */
@@ -113,6 +145,7 @@
 	u_char	cdmsf_frame1;	/* end frame */
 };
 
+/* This struct is used by the CDROMPLAYTRKIND ioctl */
 struct cdrom_ti 
 {
 	u_char	cdti_trk0;	/* start track */
@@ -121,51 +154,23 @@
 	u_char	cdti_ind1;	/* end index */
 };
 
+/* This struct is used by the CDROMREADTOCHDR ioctl */
 struct cdrom_tochdr 	
 {
 	u_char	cdth_trk0;	/* start track */
 	u_char	cdth_trk1;	/* end track */
 };
 
-struct cdrom_msf0		/* address in MSF format */
-{
-	u_char	minute;
-	u_char	second;
-	u_char	frame;
-};
-
-union cdrom_addr		/* address in either MSF or logical format */
-{
-	struct cdrom_msf0	msf;
-	int			lba;
-};
-
-struct cdrom_tocentry 
+/* This struct is used by the CDROMVOLCTRL and CDROMVOLREAD ioctls */
+struct cdrom_volctrl
 {
-	u_char	cdte_track;
-	u_char	cdte_adr	:4;
-	u_char	cdte_ctrl	:4;
-	u_char	cdte_format;
-	union cdrom_addr cdte_addr;
-	u_char	cdte_datamode;
+	u_char	channel0;
+	u_char	channel1;
+	u_char	channel2;
+	u_char	channel3;
 };
 
-/*
- * CD-ROM address types (cdrom_tocentry.cdte_format)
- */
-#define	CDROM_LBA 0x01 /* "logical block": first frame is #0 */
-#define	CDROM_MSF 0x02 /* "minute-second-frame": binary, not bcd here! */
-
-/*
- * bit to tell whether track is data or audio (cdrom_tocentry.cdte_ctrl)
- */
-#define	CDROM_DATA_TRACK	0x04
-
-/*
- * The leadout track is always 0xAA, regardless of # of tracks on disc
- */
-#define	CDROM_LEADOUT	0xAA
-
+/* This struct is used by the CDROMSUBCHNL ioctl */
 struct cdrom_subchnl 
 {
 	u_char	cdsc_format;
@@ -178,28 +183,19 @@
 	union cdrom_addr cdsc_reladdr;
 };
 
-struct cdrom_mcn {
-  u_char medium_catalog_number[14]; /* 13 ASCII digits, null-terminated */
-};
-
-/*
- * audio states (from SCSI-2, but seen with other drives, too)
- */
-#define	CDROM_AUDIO_INVALID	0x00	/* audio status not supported */
-#define	CDROM_AUDIO_PLAY	0x11	/* audio play operation in progress */
-#define	CDROM_AUDIO_PAUSED	0x12	/* audio play operation paused */
-#define	CDROM_AUDIO_COMPLETED	0x13	/* audio play successfully completed */
-#define	CDROM_AUDIO_ERROR	0x14	/* audio play stopped due to error */
-#define	CDROM_AUDIO_NO_STATUS	0x15	/* no current audio status to return */
 
-struct cdrom_volctrl
+/* This struct is used by the CDROMREADTOCENTRY ioctl */
+struct cdrom_tocentry 
 {
-	u_char	channel0;
-	u_char	channel1;
-	u_char	channel2;
-	u_char	channel3;
+	u_char	cdte_track;
+	u_char	cdte_adr	:4;
+	u_char	cdte_ctrl	:4;
+	u_char	cdte_format;
+	union cdrom_addr cdte_addr;
+	u_char	cdte_datamode;
 };
 
+/* This struct is used by the CDROMREADMODE1, and CDROMREADMODE2 ioctls */
 struct cdrom_read      
 {
 	int	cdread_lba;
@@ -207,269 +203,217 @@
 	int	cdread_buflen;
 };
 
-/*
- * extensions for transferring audio frames
- * currently used by sbpcd.c, cdu31a.c, ide-cd.c
- */
+/* This struct is used by the CDROMREADAUDIO ioctl */
 struct cdrom_read_audio
 {
 	union cdrom_addr addr; /* frame address */
-	u_char addr_format; /* CDROM_LBA or CDROM_MSF */
-	int nframes; /* number of 2352-byte-frames to read at once, limited by the drivers */
-	u_char *buf; /* frame buffer (size: nframes*2352 bytes) */
+	u_char addr_format;    /* CDROM_LBA or CDROM_MSF */
+	int nframes;           /* number of 2352-byte-frames to read at once */
+	u_char *buf;           /* frame buffer (size: nframes*2352 bytes) */
 };
 
-/*
- * this has to be the "arg" of the CDROMMULTISESSION ioctl
- * for obtaining multi session info.
- * The returned "addr" is valid only if "xa_flag" is true.
- */
+/* This struct is used with the CDROMMULTISESSION ioctl */
 struct cdrom_multisession
 {
-	union cdrom_addr addr; /* frame address: start-of-last-session (not the new "frame 16"!)*/
-	u_char xa_flag; /* 1: "is XA disk" */
-	u_char addr_format; /* CDROM_LBA or CDROM_MSF */
+	union cdrom_addr addr; /* frame address: start-of-last-session 
+	                           (not the new "frame 16"!).  Only valid
+	                           if the "xa_flag" is true. */
+	u_char xa_flag;        /* 1: "is XA disk" */
+	u_char addr_format;    /* CDROM_LBA or CDROM_MSF */
 };
 
-#ifdef FIVETWELVE
-#define	CDROM_MODE1_SIZE	512
-#else
-#define	CDROM_MODE1_SIZE	2048
-#endif FIVETWELVE
-#define	CDROM_MODE2_SIZE	2336
-
-/*
- * CD-ROM IOCTL commands
- * For IOCTL calls, we will commandeer byte 0x53, or 'S'.
- */
-
-#define CDROMPAUSE		0x5301
-#define CDROMRESUME		0x5302
-#define CDROMPLAYMSF		0x5303	/* (struct cdrom_msf) */
-#define CDROMPLAYTRKIND		0x5304	/* (struct cdrom_ti) */
-
-#define CDROMREADTOCHDR		0x5305	/* (struct cdrom_tochdr) */
-#define CDROMREADTOCENTRY	0x5306	/* (struct cdrom_tocentry) */
-
-#define CDROMSTOP		0x5307	/* stop the drive motor	*/
-#define CDROMSTART		0x5308	/* turn the motor on */
-
-#define CDROMEJECT		0x5309	/* eject CD-ROM media */
-
-#define CDROMVOLCTRL		0x530a	/* (struct cdrom_volctrl) */
-
-#define CDROMSUBCHNL		0x530b	/* (struct cdrom_subchnl) */
-
-#define CDROMREADMODE2		0x530c	/* (struct cdrom_read) */
-                                          /* read type-2 data */
+/* This struct is used with the CDROM_GET_MCN ioctl.  
+ * Very few audio discs actually have Universal Product Code information, 
+ * which should just be the Medium Catalog Number on the box.  Also note 
+ * that the way the codeis written on CD is _not_ uniform across all discs!
+ */  
+struct cdrom_mcn 
+{
+  u_char medium_catalog_number[14]; /* 13 ASCII digits, null-terminated */
+};
 
-#define CDROMREADMODE1		0x530d	/* (struct cdrom_read) */
-                                          /* read type-1 data */
+/* This is used by the CDROMPLAYBLK ioctl */
+struct cdrom_blk 
+{
+	unsigned from;
+	unsigned short len;
+};
 
-#define CDROMREADAUDIO		0x530e	/* (struct cdrom_read_audio) */
 
 /*
- * enable (1) / disable (0) auto-ejecting
- */
-#define CDROMEJECT_SW		0x530f	/* arg: 0 or 1 */
- 
-/*
- * obtain the start-of-last-session address of multi session disks
- */
-#define CDROMMULTISESSION	0x5310	/* (struct cdrom_multisession) */
+ * A CD-ROM physical sector size is 2048, 2052, 2056, 2324, 2332, 2336, 
+ * 2340, or 2352 bytes long.  
 
-/*
- * obtain the "universal product code" number
- * (only some data disks have it coded)
+*         Sector types of the standard CD-ROM data formats:
+ *
+ * format   sector type               user data size (bytes)
+ * -----------------------------------------------------------------------------
+ *   1     (Red Book)    CD-DA          2352    (CD_FRAMESIZE_RAW)
+ *   2     (Yellow Book) Mode1 Form1    2048    (CD_FRAMESIZE)
+ *   3     (Yellow Book) Mode1 Form2    2336    (CD_FRAMESIZE_RAW0)
+ *   4     (Green Book)  Mode2 Form1    2048    (CD_FRAMESIZE)
+ *   5     (Green Book)  Mode2 Form2    2328    (2324+4 spare bytes)
+ *
+ *
+ *       The layout of the standard CD-ROM data formats:
+ * -----------------------------------------------------------------------------
+ * - audio (red):                  | audio_sample_bytes |
+ *                                 |        2352        |
+ *
+ * - data (yellow, mode1):         | sync - head - data - EDC - zero - ECC |
+ *                                 |  12  -   4  - 2048 -  4  -   8  - 276 |
+ *
+ * - data (yellow, mode2):         | sync - head - data |
+ *                                 |  12  -   4  - 2336 |
+ *
+ * - XA data (green, mode2 form1): | sync - head - sub - data - EDC - ECC |
+ *                                 |  12  -   4  -  8  - 2048 -  4  - 276 |
+ *
+ * - XA data (green, mode2 form2): | sync - head - sub - data - Spare |
+ *                                 |  12  -   4  -  8  - 2324 -  4    |
+ *
  */
-#define CDROM_GET_UPC		0x5311	/* 8 bytes returned */
 
-#define CDROMRESET		0x5312	/* hard-reset the drive */
-#define CDROMVOLREAD		0x5313	/* let the drive tell its volume setting */
-					/* (struct cdrom_volctrl) */
+/* Some generally useful CD-ROM information -- mostly based on the above */
+#define CD_MINS              74 /* max. minutes per CD, not really a limit */
+#define CD_SECS              60 /* seconds per minute */
+#define CD_FRAMES            75 /* frames per second */
+#define CD_SYNC_SIZE         12 /* 12 sync bytes per raw data frame */
+#define CD_MSF_OFFSET       150 /* MSF numbering offset of first frame */
+#define CD_CHUNK_SIZE        24 /* lowest-level "data bytes piece" */
+#define CD_NUM_OF_CHUNKS     98 /* chunks per frame */
+#define CD_FRAMESIZE_SUB     96 /* subchannel data "frame" size */
+#define CD_HEAD_SIZE          4 /* header (address) bytes per raw data frame */
+#define CD_SUBHEAD_SIZE       8 /* subheader bytes per raw XA data frame */
+#define CD_EDC_SIZE           4 /* bytes EDC per most raw data frame types */
+#define CD_ZERO_SIZE          8 /* bytes zero per yellow book mode 1 frame */
+#define CD_ECC_SIZE         276 /* bytes ECC per most raw data frame types */
+#define CD_FRAMESIZE       2048 /* bytes per frame, "cooked" mode */
+#define CD_FRAMESIZE_RAW   2352 /* bytes per frame, "raw" mode */
+#define CD_FRAMESIZE_RAWER 2646 /* The maximum possible returned bytes */ 
+/* most drives don't deliver everything: */
+#define CD_FRAMESIZE_RAW1 (CD_FRAMESIZE_RAW-CD_SYNC_SIZE) /*2340*/
+#define CD_FRAMESIZE_RAW0 (CD_FRAMESIZE_RAW-CD_SYNC_SIZE-CD_HEAD_SIZE) /*2336*/
 
-/* 
- * these ioctls are used in aztcd.c and optcd.c
- */
-#define CDROMREADRAW		0x5314	/* read data in raw mode */
-#define CDROMREADCOOKED		0x5315	/* read data in cooked mode */
-#define CDROMSEEK		0x5316  /* seek msf address */
-  
-/*
- * for playing audio in logical block addressing mode
- */
-#define CDROMPLAYBLK		0x5317	/* (struct cdrom_blk) */
+#define CD_XA_HEAD        (CD_HEAD_SIZE+CD_SUBHEAD_SIZE) /* "before data" part of raw XA frame */
+#define CD_XA_TAIL        (CD_EDC_SIZE+CD_ECC_SIZE) /* "after data" part of raw XA frame */
+#define CD_XA_SYNC_HEAD   (CD_SYNC_SIZE+CD_XA_HEAD) /* sync bytes + header of XA frame */
 
-/* 
- * these ioctls are used in optcd.c
- */
-#define CDROMREADALL		0x5318	/* read all 2646 bytes */
-#define CDROMCLOSETRAY		0x5319	/* pendant of CDROMEJECT */
+/* CD-ROM address types (cdrom_tocentry.cdte_format) */
+#define	CDROM_LBA 0x01 /* "logical block": first frame is #0 */
+#define	CDROM_MSF 0x02 /* "minute-second-frame": binary, not bcd here! */
 
+/* bit to tell whether track is data or audio (cdrom_tocentry.cdte_ctrl) */
+#define	CDROM_DATA_TRACK	0x04
 
-/*
- * CD-ROM-specific SCSI command opcodes
- */
+/* The leadout track is always 0xAA, regardless of # of tracks on disc */
+#define	CDROM_LEADOUT		0xAA
 
-/*
- * Group 2 (10-byte).  All of these are called 'optional' by SCSI-II.
- */
+/* audio states (from SCSI-2, but seen with other drives, too) */
+#define	CDROM_AUDIO_INVALID	0x00	/* audio status not supported */
+#define	CDROM_AUDIO_PLAY	0x11	/* audio play operation in progress */
+#define	CDROM_AUDIO_PAUSED	0x12	/* audio play operation paused */
+#define	CDROM_AUDIO_COMPLETED	0x13	/* audio play successfully completed */
+#define	CDROM_AUDIO_ERROR	0x14	/* audio play stopped due to error */
+#define	CDROM_AUDIO_NO_STATUS	0x15	/* no current audio status to return */
+
+/* CD-ROM-specific SCSI command opcodes */
 #define SCMD_READ_TOC		0x43	/* read table of contents */
 #define SCMD_PLAYAUDIO_MSF	0x47	/* play data at time offset */
 #define SCMD_PLAYAUDIO_TI	0x48	/* play data at track/index */
 #define SCMD_PAUSE_RESUME	0x4B	/* pause/resume audio */
 #define SCMD_READ_SUBCHANNEL	0x42	/* read SC info on playing disc */
 #define SCMD_PLAYAUDIO10	0x45	/* play data at logical block */
-#define SCMD_READ_HEADER	0x44	/* read TOC header */
-
-/*
- * Group 5
- */
-#define SCMD_PLAYAUDIO12	0xA5 	/* play data at logical block */
-#define SCMD_PLAYTRACK_REL12	0xA9	/* play track at relative offset */
-
-/*
- * Group 6 Commands
- */
-#define SCMD_CD_PLAYBACK_CONTROL 0xC9	/* Sony vendor-specific audio */
-#define SCMD_CD_PLAYBACK_STATUS 0xC4	/* control opcodes */
-
-/*
- * CD-ROM capacity structure.
- */
-struct scsi_capacity 
-{
-	u_long	capacity;
-	u_long	lbasize;
-};
-
-/*
- * CD-ROM MODE_SENSE/MODE_SELECT parameters
- */
-#define ERR_RECOVERY_PARMS	0x01
-#define DISCO_RECO_PARMS	0x02
-#define FORMAT_PARMS		0x03
-#define GEOMETRY_PARMS		0x04
-#define CERTIFICATION_PARMS	0x06
-#define CACHE_PARMS		0x38
-
-/*
- * standard mode-select header prepended to all mode-select commands
- */
-struct ccs_modesel_head 
-{
-	u_char	_r1;	/* reserved */
-	u_char	medium;	/* device-specific medium type */
-	u_char 	_r2;	/* reserved */
-	u_char	block_desc_length; /* block descriptor length */
-	u_char	density; /* device-specific density code */
-	u_char	number_blocks_hi; /* number of blocks in this block desc */
-	u_char	number_blocks_med;
-	u_char	number_blocks_lo;
-	u_char	_r3;
-	u_char	block_length_hi; /* block length for blocks in this desc */
-	u_char	block_length_med;
-	u_char	block_length_lo;
-};
-
-/*
- * error recovery parameters
- */
-struct ccs_err_recovery 
-{
-	u_char	_r1 : 2;	/* reserved */
-	u_char	page_code : 6;	/* page code */
-	u_char	page_length;	/* page length */
-	u_char	awre	: 1;	/* auto write realloc enabled */
-	u_char	arre	: 1;	/* auto read realloc enabled */
-	u_char	tb	: 1;	/* transfer block */
-	u_char 	rc	: 1;	/* read continuous */
-	u_char	eec	: 1;	/* enable early correction */
-	u_char	per	: 1;	/* post error */
-	u_char	dte	: 1;	/* disable transfer on error */
-	u_char	dcr	: 1;	/* disable correction */
-	u_char	retry_count;	/* error retry count */
-	u_char	correction_span; /* largest recov. to be attempted, bits */
-	u_char	head_offset_count; /* head offset (2's C) for each retry */
-	u_char	strobe_offset_count; /* data strobe */
-	u_char	recovery_time_limit; /* time limit on recovery attempts	*/
-};
-
-/*
- * disco/reco parameters
- */
-struct ccs_disco_reco 
-{
-	u_char	_r1	: 2;	/* reserved */
-	u_char	page_code : 6;	/* page code */
-	u_char	page_length;	/* page length */
-	u_char	buffer_full_ratio; /* write buffer reconnect threshold */
-	u_char	buffer_empty_ratio; /* read */
-	u_short	bus_inactivity_limit; /* limit on bus inactivity time */
-	u_short	disconnect_time_limit; /* minimum disconnect time */
-	u_short	connect_time_limit; /* minimum connect time */
-	u_short	_r2;		/* reserved */
-};
-
-/*
- * drive geometry parameters
- */
-struct ccs_geometry 
-{
-	u_char	_r1	: 2;	/* reserved */
-	u_char	page_code : 6;	/* page code */
-	u_char	page_length;	/* page length */
-	u_char	cyl_ub;		/* #cyls */
-	u_char	cyl_mb;
-	u_char	cyl_lb;
-	u_char	heads;		/* #heads */
-	u_char	precomp_cyl_ub;	/* precomp start */
-	u_char	precomp_cyl_mb;
-	u_char	precomp_cyl_lb;
-	u_char	current_cyl_ub;	/* reduced current start */
-	u_char	current_cyl_mb;
-	u_char	current_cyl_lb;
-	u_short	step_rate;	/* stepping motor rate */
-	u_char	landing_cyl_ub;	/* landing zone */
-	u_char	landing_cyl_mb;
-	u_char	landing_cyl_lb;
-	u_char  _r2;
-	u_char	_r3;
-	u_char	_r4;
-};
 
-/*
- * cache parameters
- */
-struct ccs_cache 
-{
-	u_char	_r1	: 2;	/* reserved */
-	u_char	page_code : 6;	/* page code */
-	u_char	page_length;	/* page length */
-	u_char	mode;		/* cache control byte */
-	u_char	threshold;	/* prefetch threshold */
-	u_char	max_prefetch;	/* maximum prefetch size */
-	u_char	max_multiplier;	/* maximum prefetch multiplier */
-	u_char	min_prefetch;	/* minimum prefetch size */
-	u_char	min_multiplier;	/* minimum prefetch multiplier */
-	u_char	_r2[8];
-};
+/* capability flags used with the uniform CD-ROM driver */ 
+#define CDC_CLOSE_TRAY		0x1     /* caddy systems _can't_ close */
+#define CDC_OPEN_TRAY		0x2     /* but _can_ eject.  */
+#define CDC_LOCK		0x4     /* disable manual eject */
+#define CDC_SELECT_SPEED 	0x8     /* programmable speed */
+#define CDC_SELECT_DISC		0x10    /* select disc from juke-box */
+#define CDC_MULTI_SESSION 	0x20    /* read sessions>1 */
+#define CDC_MCN			0x40    /* Medium Catalog Number */
+#define CDC_MEDIA_CHANGED 	0x80    /* media changed */
+#define CDC_PLAY_AUDIO		0x100   /* audio functions */
+#define CDC_RESET               0x200   /* hard reset device */
+#define CDC_IOCTLS              0x400   /* driver has non-standard ioctls */
+#define CDC_DRIVE_STATUS        0x800   /* driver implements drive status */
+
+/* drive status possibilities used with the uniform CD-ROM driver */
+#define CDS_NO_INFO		0               /* if not implemented */
+#define CDS_NO_DISC		1
+#define CDS_TRAY_OPEN		2
+#define CDS_DRIVE_NOT_READY	3
+#define CDS_DISC_OK		4
+
+/* disc status possibilities, other than CDS_NO_DISC and CDS_NO_INFO */
+#define CDS_AUDIO		100
+#define CDS_DATA_1		101
+#define CDS_DATA_2		102
+#define CDS_XA_2_1		103
+#define CDS_XA_2_2		104
+
+/* User-configurable behavior options for the uniform CD-ROM driver */
+#define CDO_AUTO_CLOSE		0x1     /* close tray on first open() */
+#define CDO_AUTO_EJECT		0x2     /* open tray on last release() */
+#define CDO_USE_FFLAGS		0x4     /* use O_NONBLOCK information on open */
+#define CDO_LOCK		0x8     /* lock tray on open files */
+#define CDO_CHECK_TYPE		0x10    /* check type on open for data */
+
+/* Special codes used when specifying changer slots. */
+#define CDSL_NONE       	((int) (~0U>>1)-1)
+#define CDSL_CURRENT    	((int) (~0U>>1))
+
+#ifdef __KERNEL__
+/* Uniform cdrom data structures for cdrom.c */
+struct cdrom_device_info {
+	struct cdrom_device_ops  *ops;  /* link to device_ops */
+	struct cdrom_device_info *next; /* next device_info for this major */
+	void *handle;		        /* driver-dependent data */
+/* specifications */
+        kdev_t dev;	                /* device number */
+	int mask;                       /* mask of capability: disables them */
+	int speed;			/* maximum speed for reading data */
+	int capacity;			/* number of discs in jukebox */
+/* device-related storage */
+	int options : 30;               /* options flags */
+	unsigned mc_flags : 2;          /* media change buffer flags */
+    	int use_count;                  /* number of times device opened */
+    	char name[20];                  /* name of the device type */
+
+};
+
+struct cdrom_device_ops {
+/* routines */
+	int (*open) (struct cdrom_device_info *, int);
+	void (*release) (struct cdrom_device_info *);
+	int (*drive_status) (struct cdrom_device_info *, int);
+	int (*media_changed) (struct cdrom_device_info *, int);
+	int (*tray_move) (struct cdrom_device_info *, int);
+	int (*lock_door) (struct cdrom_device_info *, int);
+	int (*select_speed) (struct cdrom_device_info *, int);
+	int (*select_disc) (struct cdrom_device_info *, int);
+	int (*get_last_session) (struct cdrom_device_info *,
+				 struct cdrom_multisession *);
+	int (*get_mcn) (struct cdrom_device_info *,
+			struct cdrom_mcn *);
+	/* hard reset device */
+	int (*reset) (struct cdrom_device_info *);
+	/* play stuff */
+	int (*audio_ioctl) (struct cdrom_device_info *,unsigned int, void *);
+	/* dev-specific */
+ 	int (*dev_ioctl) (struct cdrom_device_info *,
+			  unsigned int, unsigned long);
+/* driver specifications */
+	const int capability;   /* capability flags */
+	int n_minors;           /* number of active minor devices */
+};
+
+/* the general file operations structure: */
+extern struct file_operations cdrom_fops;
+
+extern int register_cdrom(struct cdrom_device_info *cdi);
+extern int unregister_cdrom(struct cdrom_device_info *cdi);
+#endif  /* End of kernel only stuff */ 
 
 #endif  _LINUX_CDROM_H
-/*==========================================================================*/
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only.  This must remain at the end
- * of the file. 
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-indent-level: 8
- * c-brace-imaginary-offset: 0
- * c-brace-offset: -8
- * c-argdecl-indent: 8
- * c-label-offset: -8
- * c-continued-statement-offset: 8
- * c-continued-brace-offset: 0
- * End:
- */

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov