		Summary of CDROM ioctl calls.
		============================

		Edward A. Falk <efalk@google.com>

		November, 2004

This document attempts to describe the ioctl(2) calls supported by
the CDROM layer.  These are by-and-large implemented (as of Linux 2.6)
in drivers/cdrom/cdrom.c and drivers/block/scsi_ioctl.c

ioctl values are listed in <linux/cdrom.h>.  As of this writing, they
are as follows:

	CDROMPAUSE		Pause Audio Operation
	CDROMRESUME		Resume paused Audio Operation
	CDROMPLAYMSF		Play Audio MSF (struct cdrom_msf)
	CDROMPLAYTRKIND		Play Audio Track/index (struct cdrom_ti)
	CDROMREADTOCHDR		Read TOC header (struct cdrom_tochdr)
	CDROMREADTOCENTRY	Read TOC entry (struct cdrom_tocentry)
	CDROMSTOP		Stop the cdrom drive
	CDROMSTART		Start the cdrom drive
	CDROMEJECT		Ejects the cdrom media
	CDROMVOLCTRL		Control output volume (struct cdrom_volctrl)
	CDROMSUBCHNL		Read subchannel data (struct cdrom_subchnl)
	CDROMREADMODE2		Read CDROM mode 2 data (2336 Bytes)
					   (struct cdrom_read)
	CDROMREADMODE1		Read CDROM mode 1 data (2048 Bytes)
					   (struct cdrom_read)
	CDROMREADAUDIO		(struct cdrom_read_audio)
	CDROMEJECT_SW		enable(1)/disable(0) auto-ejecting
	CDROMMULTISESSION	Obtain the start-of-last-session
				  address of multi session disks
				  (struct cdrom_multisession)
	CDROM_GET_MCN		Obtain the "Universal Product Code"
				   if available (struct cdrom_mcn)
	CDROM_GET_UPC		Deprecated, use CDROM_GET_MCN instead.
	CDROMRESET		hard-reset the drive
	CDROMVOLREAD		Get the drive's volume setting
					  (struct cdrom_volctrl)
	CDROMREADRAW		read data in raw mode (2352 Bytes)
					   (struct cdrom_read)
	CDROMREADCOOKED		read data in cooked mode
	CDROMSEEK		seek msf address
	CDROMPLAYBLK		scsi-cd only, (struct cdrom_blk)
	CDROMREADALL		read all 2646 bytes
	CDROMGETSPINDOWN	return 4-bit spindown value
	CDROMSETSPINDOWN	set 4-bit spindown value
	CDROMCLOSETRAY		pendant of CDROMEJECT
	CDROM_SET_OPTIONS	Set behavior options
	CDROM_CLEAR_OPTIONS	Clear behavior options
	CDROM_SELECT_SPEED	Set the CD-ROM speed
	CDROM_SELECT_DISC	Select disc (for juke-boxes)
	CDROM_MEDIA_CHANGED	Check is media changed
	CDROM_DRIVE_STATUS	Get tray position, etc.
	CDROM_DISC_STATUS	Get disc type, etc.
	CDROM_CHANGER_NSLOTS	Get number of slots
	CDROM_LOCKDOOR		lock or unlock door
	CDROM_DEBUG		Turn debug messages on/off
	CDROM_GET_CAPABILITY	get capabilities
	CDROMAUDIOBUFSIZ	set the audio buffer size
	DVD_READ_STRUCT		Read structure
	DVD_WRITE_STRUCT	Write structure
	DVD_AUTH		Authentication
	CDROM_SEND_PACKET	send a packet to the drive
	CDROM_NEXT_WRITABLE	get next writable block
	CDROM_LAST_WRITTEN	get last block written on disc


The information that follows was determined from reading kernel source
code.  It is likely that some corrections will be made over time.







General:

	Unless otherwise specified, all ioctl calls return 0 on success
	and -1 with errno set to an appropriate value on error.  (Some
	ioctls return non-negative data values.)

	Unless otherwise specified, all ioctl calls return -1 and set
	errno to EFAULT on a failed attempt to copy data to or from user
	address space.

	Individual drivers may return error codes not listed here.

	Unless otherwise specified, all data structures and constants
	are defined in <linux/cdrom.h>




CDROMPAUSE			Pause Audio Operation

	usage:

	  ioctl(fd, CDROMPAUSE, 0);

	inputs:		none

	outputs:	none

	error return:
	  ENOSYS	cd drive not audio-capable.


CDROMRESUME			Resume paused Audio Operation

	usage:

	  ioctl(fd, CDROMRESUME, 0);

	inputs:		none

	outputs:	none

	error return:
	  ENOSYS	cd drive not audio-capable.


CDROMPLAYMSF			Play Audio MSF (struct cdrom_msf)

	usage:

	  struct cdrom_msf msf;
	  ioctl(fd, CDROMPLAYMSF, &msf);

	inputs:
	  cdrom_msf structure, describing a segment of music to play

	outputs:	none

	error return:
	  ENOSYS	cd drive not audio-capable.

	notes:
	  MSF stands for minutes-seconds-frames
	  LBA stands for logical block address

	  Segment is described as start and end times, where each time
	  is described as minutes:seconds:frames.  A frame is 1/75 of
	  a second.


CDROMPLAYTRKIND			Play Audio Track/index (struct cdrom_ti)

	usage:

	  struct cdrom_ti ti;
	  ioctl(fd, CDROMPLAYTRKIND, &ti);

	inputs:
	  cdrom_ti structure, describing a segment of music to play

	outputs:	none

	error return:
	  ENOSYS	cd drive not audio-capable.

	notes:
	  Segment is described as start and end times, where each time
	  is described as a track and an index.



CDROMREADTOCHDR			Read TOC header (struct cdrom_tochdr)

	usage:

	  cdrom_tochdr header;
	  ioctl(fd, CDROMREADTOCHDR, &header);

	inputs:
	  cdrom_tochdr structure

	outputs:
	  cdrom_tochdr structure

	error return:
	  ENOSYS	cd drive not audio-capable.



CDROMREADTOCENTRY		Read TOC entry (struct cdrom_tocentry)

	usage:

	  struct cdrom_tocentry entry;
	  ioctl(fd, CDROMREADTOCENTRY, &entry);

	inputs:
	  cdrom_tocentry structure

	outputs:
	  cdrom_tocentry structure

	error return:
	  ENOSYS	cd drive not audio-capable.
	  EINVAL	entry.cdte_format not CDROM_MSF or CDROM_LBA
	  EINVAL	requested track out of bounds
	  EIO		I/O error reading TOC

	notes:
	  TOC stands for Table Of Contents
	  MSF stands for minutes-seconds-frames
	  LBA stands for logical block address



CDROMSTOP			Stop the cdrom drive

	usage:

	  ioctl(fd, CDROMSTOP, 0);

	inputs:		none

	outputs:	none

	error return:
	  ENOSYS	cd drive not audio-capable.

	notes:
	  Exact interpretation of this ioctl depends on the device,
	  but most seem to spin the drive down.


CDROMSTART			Start the cdrom drive

	usage:

	  ioctl(fd, CDROMSTART, 0);

	inputs:		none

	outputs:	none

	error return:
	  ENOSYS	cd drive not audio-capable.

	notes:
	  Exact interpretation of this ioctl depends on the device,
	  but most seem to spin the drive up and/or close the tray.
	  Other devices ignore the ioctl completely.


CDROMEJECT			Ejects the cdrom media

	usage:

	  ioctl(fd, CDROMEJECT, 0);

	inputs:		none

	outputs:	none

	error returns:
	  ENOSYS	cd drive not capable of ejecting
	  EBUSY		other processes are accessing drive, or door is locked

	notes:
	  See CDROM_LOCKDOOR, below.



CDROMCLOSETRAY			pendant of CDROMEJECT

	usage:

	  ioctl(fd, CDROMCLOSETRAY, 0);

	inputs:		none

	outputs:	none

	error returns:
	  ENOSYS	cd drive not capable of closing the tray
	  EBUSY		other processes are accessing drive, or door is locked

	notes:
	  See CDROM_LOCKDOOR, below.



CDROMVOLCTRL			Control output volume (struct cdrom_volctrl)

	usage:

	  struct cdrom_volctrl volume;
	  ioctl(fd, CDROMVOLCTRL, &volume);

	inputs:
	  cdrom_volctrl structure containing volumes for up to 4
	  channels.

	outputs:	none

	error return:
	  ENOSYS	cd drive not audio-capable.



CDROMVOLREAD			Get the drive's volume setting
					  (struct cdrom_volctrl)

	usage:

	  struct cdrom_volctrl volume;
	  ioctl(fd, CDROMVOLREAD, &volume);

	inputs:		none

	outputs:
	  The current volume settings.

	error return:
	  ENOSYS	cd drive not audio-capable.



CDROMSUBCHNL			Read subchannel data (struct cdrom_subchnl)

	usage:

	  struct cdrom_subchnl q;
	  ioctl(fd, CDROMSUBCHNL, &q);

	inputs:
	  cdrom_subchnl structure

	outputs:
	  cdrom_subchnl structure

	error return:
	  ENOSYS	cd drive not audio-capable.
	  EINVAL	format not CDROM_MSF or CDROM_LBA

	notes:
	  Format is converted to CDROM_MSF or CDROM_LBA
	  as per user request on return



CDROMREADRAW			read data in raw mode (2352 Bytes)
					   (struct cdrom_read)

	usage:

	  union {
	    struct cdrom_msf msf;		/* input */
	    char buffer[CD_FRAMESIZE_RAW];	/* return */
	  } arg;
	  ioctl(fd, CDROMREADRAW, &arg);

	inputs:
	  cdrom_msf structure indicating an address to read.
	  Only the start values are significant.

	outputs:
	  Data written to address provided by user.

	error return:
	  EINVAL	address less than 0, or msf less than 0:2:0
	  ENOMEM	out of memory

	notes:
	  As of 2.6.8.1, comments in <linux/cdrom.h> indicate that this
	  ioctl accepts a cdrom_read structure, but actual source code
	  reads a cdrom_msf structure and writes a buffer of data to
	  the same address.

	  MSF values are converted to LBA values via this formula:

	    lba = (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;




CDROMREADMODE1			Read CDROM mode 1 data (2048 Bytes)
					   (struct cdrom_read)

	notes:
	  Identical to CDROMREADRAW except that block size is
	  CD_FRAMESIZE (2048) bytes



CDROMREADMODE2			Read CDROM mode 2 data (2336 Bytes)
					   (struct cdrom_read)

	notes:
	  Identical to CDROMREADRAW except that block size is
	  CD_FRAMESIZE_RAW0 (2336) bytes



CDROMREADAUDIO			(struct cdrom_read_audio)

	usage:

	  struct cdrom_read_audio ra;
	  ioctl(fd, CDROMREADAUDIO, &ra);

	inputs:
	  cdrom_read_audio structure containing read start
	  point and length

	outputs:
	  audio data, returned to buffer indicated by ra

	error return:
	  EINVAL	format not CDROM_MSF or CDROM_LBA
	  EINVAL	nframes not in range [1 75]
	  ENXIO		drive has no queue (probably means invalid fd)
	  ENOMEM	out of memory


CDROMEJECT_SW			enable(1)/disable(0) auto-ejecting

	usage:

	  int val;
	  ioctl(fd, CDROMEJECT_SW, val);

	inputs:
	  Flag specifying auto-eject flag.

	outputs:	none

	error return:
	  ENOSYS	Drive is not capable of ejecting.
	  EBUSY		Door is locked




CDROMMULTISESSION		Obtain the start-of-last-session
				  address of multi session disks
				  (struct cdrom_multisession)
	usage:

	  struct cdrom_multisession ms_info;
	  ioctl(fd, CDROMMULTISESSION, &ms_info);

	inputs:
	  cdrom_multisession structure containing desired
	  format.

	outputs:
	  cdrom_multisession structure is filled with last_session
	  information.

	error return:
	  EINVAL	format not CDROM_MSF or CDROM_LBA


CDROM_GET_MCN			Obtain the "Universal Product Code"
				   if available (struct cdrom_mcn)

	usage:

	  struct cdrom_mcn mcn;
	  ioctl(fd, CDROM_GET_MCN, &mcn);

	inputs:		none

	outputs:
	  Universal Product Code

	error return:
	  ENOSYS	Drive is not capable of reading MCN data.

	notes:
	  Source code comments state:

	    The following function is implemented, although very few
	    audio discs give Universal Product Code information, which
	    should just be the Medium Catalog Number on the box.  Note,
	    that the way the code is written on the CD is /not/ uniform
	    across all discs!




CDROM_GET_UPC			CDROM_GET_MCN  (deprecated)

	Not implemented, as of 2.6.8.1



CDROMRESET			hard-reset the drive

	usage:

	  ioctl(fd, CDROMRESET, 0);

	inputs:		none

	outputs:	none

	error return:
	  EACCES	Access denied:  requires CAP_SYS_ADMIN
	  ENOSYS	Drive is not capable of resetting.




CDROMREADCOOKED			read data in cooked mode

	usage:

	  u8 buffer[CD_FRAMESIZE]
	  ioctl(fd, CDROMREADCOOKED, buffer);

	inputs:		none

	outputs:
	  2048 bytes of data, "cooked" mode.

	notes:
	  Not implemented on all drives.




CDROMREADALL			read all 2646 bytes

	Same as CDROMREADCOOKED, but reads 2646 bytes.



CDROMSEEK			seek msf address

	usage:

	  struct cdrom_msf msf;
	  ioctl(fd, CDROMSEEK, &msf);

	inputs:
	  MSF address to seek to.

	outputs:	none



CDROMPLAYBLK			scsi-cd only, (struct cdrom_blk)

	usage:

	  struct cdrom_blk blk;
	  ioctl(fd, CDROMPLAYBLK, &blk);

	inputs:
	  Region to play

	outputs:	none



CDROMGETSPINDOWN

	usage:

	  char spindown;
	  ioctl(fd, CDROMGETSPINDOWN, &spindown);

	inputs:		none

	outputs:
	  The value of the current 4-bit spindown value.




CDROMSETSPINDOWN

	usage:

	  char spindown
	  ioctl(fd, CDROMSETSPINDOWN, &spindown);

	inputs:
	  4-bit value used to control spindown (TODO: more detail here)

	outputs:	none





CDROM_SET_OPTIONS		Set behavior options

	usage:

	  int options;
	  ioctl(fd, CDROM_SET_OPTIONS, options);

	inputs:
	  New values for drive options.  The logical 'or' of:
	    CDO_AUTO_CLOSE	close tray on first open(2)
	    CDO_AUTO_EJECT	open tray on last release
	    CDO_USE_FFLAGS	use O_NONBLOCK information on open
	    CDO_LOCK		lock tray on open files
	    CDO_CHECK_TYPE	check type on open for data

	outputs:
	  Returns the resulting options settings in the
	  ioctl return value.  Returns -1 on error.

	error return:
	  ENOSYS	selected option(s) not supported by drive.




CDROM_CLEAR_OPTIONS		Clear behavior options

	Same as CDROM_SET_OPTIONS, except that selected options are
	turned off.



CDROM_SELECT_SPEED		Set the CD-ROM speed

	usage:

	  int speed;
	  ioctl(fd, CDROM_SELECT_SPEED, speed);

	inputs:
	  New drive speed.

	outputs:	none

	error return:
	  ENOSYS	speed selection not supported by drive.



CDROM_SELECT_DISC		Select disc (for juke-boxes)

	usage:

	  int disk;
	  ioctl(fd, CDROM_SELECT_DISC, disk);

	inputs:
	  Disk to load into drive.

	outputs:	none

	error return:
	  EINVAL	Disk number beyond capacity of drive



CDROM_MEDIA_CHANGED		Check is media changed

	usage:

	  int slot;
	  ioctl(fd, CDROM_MEDIA_CHANGED, slot);

	inputs:
	  Slot number to be tested, always zero except for jukeboxes.
	  May also be special values CDSL_NONE or CDSL_CURRENT

	outputs:
	  Ioctl return value is 0 or 1 depending on whether the media
	  has been changed, or -1 on error.

	error returns:
	  ENOSYS	Drive can't detect media change
	  EINVAL	Slot number beyond capacity of drive
	  ENOMEM	Out of memory



CDROM_DRIVE_STATUS		Get tray position, etc.

	usage:

	  int slot;
	  ioctl(fd, CDROM_DRIVE_STATUS, slot);

	inputs:
	  Slot number to be tested, always zero except for jukeboxes.
	  May also be special values CDSL_NONE or CDSL_CURRENT

	outputs:
	  Ioctl return value will be one of the following values
	  from <linux/cdrom.h>:

	    CDS_NO_INFO		Information not available.
	    CDS_NO_DISC
	    CDS_TRAY_OPEN
	    CDS_DRIVE_NOT_READY
	    CDS_DISC_OK
	    -1			error

	error returns:
	  ENOSYS	Drive can't detect drive status
	  EINVAL	Slot number beyond capacity of drive
	  ENOMEM	Out of memory




CDROM_DISC_STATUS		Get disc type, etc.

	usage:

	  ioctl(fd, CDROM_DISC_STATUS, 0);

	inputs:		none

	outputs:
	  Ioctl return value will be one of the following values
	  from <linux/cdrom.h>:
	    CDS_NO_INFO
	    CDS_AUDIO
	    CDS_MIXED
	    CDS_XA_2_2
	    CDS_XA_2_1
	    CDS_DATA_1

	error returns:	none at present

	notes:
	  Source code comments state:

	    Ok, this is where problems start.  The current interface for
	    the CDROM_DISC_STATUS ioctl is flawed.  It makes the false
	    assumption that CDs are all CDS_DATA_1 or all CDS_AUDIO, etc.
	    Unfortunately, while this is often the case, it is also
	    very common for CDs to have some tracks with data, and some
	    tracks with audio.	Just because I feel like it, I declare
	    the following to be the best way to cope.  If the CD has
	    ANY data tracks on it, it will be returned as a data CD.
	    If it has any XA tracks, I will return it as that.	Now I
	    could simplify this interface by combining these returns with
	    the above, but this more clearly demonstrates the problem
	    with the current interface.  Too bad this wasn't designed
	    to use bitmasks...	       -Erik

	    Well, now we have the option CDS_MIXED: a mixed-type CD.
	    User level programmers might feel the ioctl is not very
	    useful.
			---david




CDROM_CHANGER_NSLOTS		Get number of slots

	usage:

	  ioctl(fd, CDROM_CHANGER_NSLOTS, 0);

	inputs:		none

	outputs:
	  The ioctl return value will be the number of slots in a
	  CD changer.  Typically 1 for non-multi-disk devices.

	error returns:	none



CDROM_LOCKDOOR			lock or unlock door

	usage:

	  int lock;
	  ioctl(fd, CDROM_LOCKDOOR, lock);

	inputs:
	  Door lock flag, 1=lock, 0=unlock

	outputs:	none

	error returns:
	  EDRIVE_CANT_DO_THIS	Door lock function not supported.
	  EBUSY			Attempt to unlock when multiple users
	  			have the drive open and not CAP_SYS_ADMIN

	notes:
	  As of 2.6.8.1, the lock flag is a global lock, meaning that
	  all CD drives will be locked or unlocked together.  This is
	  probably a bug.

	  The EDRIVE_CANT_DO_THIS value is defined in <linux/cdrom.h>
	  and is currently (2.6.8.1) the same as EOPNOTSUPP



CDROM_DEBUG			Turn debug messages on/off

	usage:

	  int debug;
	  ioctl(fd, CDROM_DEBUG, debug);

	inputs:
	  Cdrom debug flag, 0=disable, 1=enable

	outputs:
	  The ioctl return value will be the new debug flag.

	error return:
	  EACCES	Access denied:  requires CAP_SYS_ADMIN



CDROM_GET_CAPABILITY		get capabilities

	usage:

	  ioctl(fd, CDROM_GET_CAPABILITY, 0);

	inputs:		none

	outputs:
	  The ioctl return value is the current device capability
	  flags.  See CDC_CLOSE_TRAY, CDC_OPEN_TRAY, etc.



CDROMAUDIOBUFSIZ		set the audio buffer size

	usage:

	  int arg;
	  ioctl(fd, CDROMAUDIOBUFSIZ, val);

	inputs:
	  New audio buffer size

	outputs:
	  The ioctl return value is the new audio buffer size, or -1
	  on error.

	error return:
	  ENOSYS	Not supported by this driver.

	notes:
	  Not supported by all drivers.



DVD_READ_STRUCT			Read structure

	usage:

	  dvd_struct s;
	  ioctl(fd, DVD_READ_STRUCT, &s);

	inputs:
	  dvd_struct structure, containing:
	    type		specifies the information desired, one of
	    			DVD_STRUCT_PHYSICAL, DVD_STRUCT_COPYRIGHT,
				DVD_STRUCT_DISCKEY, DVD_STRUCT_BCA,
				DVD_STRUCT_MANUFACT
	    physical.layer_num	desired layer, indexed from 0
	    copyright.layer_num	desired layer, indexed from 0
	    disckey.agid

	outputs:
	  dvd_struct structure, containing:
	    physical		for type == DVD_STRUCT_PHYSICAL
	    copyright		for type == DVD_STRUCT_COPYRIGHT
	    disckey.value	for type == DVD_STRUCT_DISCKEY
	    bca.{len,value}	for type == DVD_STRUCT_BCA
	    manufact.{len,valu}	for type == DVD_STRUCT_MANUFACT

	error returns:
	  EINVAL	physical.layer_num exceeds number of layers
	  EIO		Received invalid response from drive



DVD_WRITE_STRUCT		Write structure

	Not implemented, as of 2.6.8.1



DVD_AUTH			Authentication

	usage:

	  dvd_authinfo ai;
	  ioctl(fd, DVD_AUTH, &ai);

	inputs:
	  dvd_authinfo structure.  See <linux/cdrom.h>

	outputs:
	  dvd_authinfo structure.

	error return:
	  ENOTTY	ai.type not recognized.



CDROM_SEND_PACKET		send a packet to the drive

	usage:

	  struct cdrom_generic_command cgc;
	  ioctl(fd, CDROM_SEND_PACKET, &cgc);

	inputs:
	  cdrom_generic_command structure containing the packet to send.

	outputs:	none
	  cdrom_generic_command structure containing results.

	error return:
	  EIO		command failed.
	  EPERM		Operation not permitted, either because a
			write command was attempted on a drive which
			is opened read-only, or because the command
			requires CAP_SYS_RAWIO
	  EINVAL	cgc.data_direction not set



CDROM_NEXT_WRITABLE		get next writable block

	usage:

	  long next;
	  ioctl(fd, CDROM_NEXT_WRITABLE, &next);

	inputs:		none

	outputs:
	  The next writable block.

	notes:
	  If the device does not support this ioctl directly, the
	  ioctl will return CDROM_LAST_WRITTEN + 7.



CDROM_LAST_WRITTEN		get last block written on disc

	usage:

	  long last;
	  ioctl(fd, CDROM_LAST_WRITTEN, &last);

	inputs:		none

	outputs:
	  The last block written on disc

	notes:
	  If the device does not support this ioctl directly, the
	  result is derived from the disc's table of contents.  If the
	  table of contents can't be read, this ioctl returns an
	  error.
