104950071SJonathan Corbet============================
204950071SJonathan CorbetSummary of CDROM ioctl calls
304950071SJonathan Corbet============================
404950071SJonathan Corbet
504950071SJonathan Corbet- Edward A. Falk <efalk@google.com>
604950071SJonathan Corbet
704950071SJonathan CorbetNovember, 2004
804950071SJonathan Corbet
904950071SJonathan CorbetThis document attempts to describe the ioctl(2) calls supported by
1004950071SJonathan Corbetthe CDROM layer.  These are by-and-large implemented (as of Linux 2.6)
1104950071SJonathan Corbetin drivers/cdrom/cdrom.c and drivers/block/scsi_ioctl.c
1204950071SJonathan Corbet
1304950071SJonathan Corbetioctl values are listed in <linux/cdrom.h>.  As of this writing, they
1404950071SJonathan Corbetare as follows:
1504950071SJonathan Corbet
169c03fee7SPhillip Potter	========================  ===============================================
1704950071SJonathan Corbet	CDROMPAUSE		  Pause Audio Operation
1804950071SJonathan Corbet	CDROMRESUME		  Resume paused Audio Operation
1904950071SJonathan Corbet	CDROMPLAYMSF		  Play Audio MSF (struct cdrom_msf)
2004950071SJonathan Corbet	CDROMPLAYTRKIND		  Play Audio Track/index (struct cdrom_ti)
2104950071SJonathan Corbet	CDROMREADTOCHDR		  Read TOC header (struct cdrom_tochdr)
2204950071SJonathan Corbet	CDROMREADTOCENTRY	  Read TOC entry (struct cdrom_tocentry)
2304950071SJonathan Corbet	CDROMSTOP		  Stop the cdrom drive
2404950071SJonathan Corbet	CDROMSTART		  Start the cdrom drive
2504950071SJonathan Corbet	CDROMEJECT		  Ejects the cdrom media
2604950071SJonathan Corbet	CDROMVOLCTRL		  Control output volume (struct cdrom_volctrl)
2704950071SJonathan Corbet	CDROMSUBCHNL		  Read subchannel data (struct cdrom_subchnl)
2804950071SJonathan Corbet	CDROMREADMODE2		  Read CDROM mode 2 data (2336 Bytes)
2904950071SJonathan Corbet				  (struct cdrom_read)
3004950071SJonathan Corbet	CDROMREADMODE1		  Read CDROM mode 1 data (2048 Bytes)
3104950071SJonathan Corbet				  (struct cdrom_read)
3204950071SJonathan Corbet	CDROMREADAUDIO		  (struct cdrom_read_audio)
3304950071SJonathan Corbet	CDROMEJECT_SW		  enable(1)/disable(0) auto-ejecting
3404950071SJonathan Corbet	CDROMMULTISESSION	  Obtain the start-of-last-session
3504950071SJonathan Corbet				  address of multi session disks
3604950071SJonathan Corbet				  (struct cdrom_multisession)
3704950071SJonathan Corbet	CDROM_GET_MCN		  Obtain the "Universal Product Code"
3804950071SJonathan Corbet				  if available (struct cdrom_mcn)
3904950071SJonathan Corbet	CDROM_GET_UPC		  Deprecated, use CDROM_GET_MCN instead.
4004950071SJonathan Corbet	CDROMRESET		  hard-reset the drive
4104950071SJonathan Corbet	CDROMVOLREAD		  Get the drive's volume setting
4204950071SJonathan Corbet				  (struct cdrom_volctrl)
4304950071SJonathan Corbet	CDROMREADRAW		  read data in raw mode (2352 Bytes)
4404950071SJonathan Corbet				  (struct cdrom_read)
4504950071SJonathan Corbet	CDROMREADCOOKED		  read data in cooked mode
4604950071SJonathan Corbet	CDROMSEEK		  seek msf address
4704950071SJonathan Corbet	CDROMPLAYBLK		  scsi-cd only, (struct cdrom_blk)
4804950071SJonathan Corbet	CDROMREADALL		  read all 2646 bytes
4904950071SJonathan Corbet	CDROMGETSPINDOWN	  return 4-bit spindown value
5004950071SJonathan Corbet	CDROMSETSPINDOWN	  set 4-bit spindown value
5104950071SJonathan Corbet	CDROMCLOSETRAY		  pendant of CDROMEJECT
5204950071SJonathan Corbet	CDROM_SET_OPTIONS	  Set behavior options
5304950071SJonathan Corbet	CDROM_CLEAR_OPTIONS	  Clear behavior options
5404950071SJonathan Corbet	CDROM_SELECT_SPEED	  Set the CD-ROM speed
5504950071SJonathan Corbet	CDROM_SELECT_DISC	  Select disc (for juke-boxes)
5604950071SJonathan Corbet	CDROM_MEDIA_CHANGED	  Check is media changed
5767f1e027SLukas Prediger	CDROM_TIMED_MEDIA_CHANGE  Check if media changed
5867f1e027SLukas Prediger				  since given time
5967f1e027SLukas Prediger				  (struct cdrom_timed_media_change_info)
6004950071SJonathan Corbet	CDROM_DRIVE_STATUS	  Get tray position, etc.
6104950071SJonathan Corbet	CDROM_DISC_STATUS	  Get disc type, etc.
6204950071SJonathan Corbet	CDROM_CHANGER_NSLOTS	  Get number of slots
6304950071SJonathan Corbet	CDROM_LOCKDOOR		  lock or unlock door
6404950071SJonathan Corbet	CDROM_DEBUG		  Turn debug messages on/off
6504950071SJonathan Corbet	CDROM_GET_CAPABILITY	  get capabilities
6604950071SJonathan Corbet	CDROMAUDIOBUFSIZ	  set the audio buffer size
6704950071SJonathan Corbet	DVD_READ_STRUCT		  Read structure
6804950071SJonathan Corbet	DVD_WRITE_STRUCT	  Write structure
6904950071SJonathan Corbet	DVD_AUTH		  Authentication
7004950071SJonathan Corbet	CDROM_SEND_PACKET	  send a packet to the drive
7104950071SJonathan Corbet	CDROM_NEXT_WRITABLE	  get next writable block
7204950071SJonathan Corbet	CDROM_LAST_WRITTEN	  get last block written on disc
739c03fee7SPhillip Potter	========================  ===============================================
7404950071SJonathan Corbet
7504950071SJonathan Corbet
7604950071SJonathan CorbetThe information that follows was determined from reading kernel source
7704950071SJonathan Corbetcode.  It is likely that some corrections will be made over time.
7804950071SJonathan Corbet
7904950071SJonathan Corbet------------------------------------------------------------------------------
8004950071SJonathan Corbet
8104950071SJonathan CorbetGeneral:
8204950071SJonathan Corbet
8304950071SJonathan Corbet	Unless otherwise specified, all ioctl calls return 0 on success
8404950071SJonathan Corbet	and -1 with errno set to an appropriate value on error.  (Some
8504950071SJonathan Corbet	ioctls return non-negative data values.)
8604950071SJonathan Corbet
8704950071SJonathan Corbet	Unless otherwise specified, all ioctl calls return -1 and set
8804950071SJonathan Corbet	errno to EFAULT on a failed attempt to copy data to or from user
8904950071SJonathan Corbet	address space.
9004950071SJonathan Corbet
9104950071SJonathan Corbet	Individual drivers may return error codes not listed here.
9204950071SJonathan Corbet
9304950071SJonathan Corbet	Unless otherwise specified, all data structures and constants
9404950071SJonathan Corbet	are defined in <linux/cdrom.h>
9504950071SJonathan Corbet
9604950071SJonathan Corbet------------------------------------------------------------------------------
9704950071SJonathan Corbet
9804950071SJonathan Corbet
9904950071SJonathan CorbetCDROMPAUSE
10004950071SJonathan Corbet	Pause Audio Operation
10104950071SJonathan Corbet
10204950071SJonathan Corbet
10304950071SJonathan Corbet	usage::
10404950071SJonathan Corbet
10504950071SJonathan Corbet	  ioctl(fd, CDROMPAUSE, 0);
10604950071SJonathan Corbet
10704950071SJonathan Corbet
10804950071SJonathan Corbet	inputs:
10904950071SJonathan Corbet		none
11004950071SJonathan Corbet
11104950071SJonathan Corbet
11204950071SJonathan Corbet	outputs:
11304950071SJonathan Corbet		none
11404950071SJonathan Corbet
11504950071SJonathan Corbet
11604950071SJonathan Corbet	error return:
11704950071SJonathan Corbet	  - ENOSYS	cd drive not audio-capable.
11804950071SJonathan Corbet
11904950071SJonathan Corbet
12004950071SJonathan CorbetCDROMRESUME
12104950071SJonathan Corbet	Resume paused Audio Operation
12204950071SJonathan Corbet
12304950071SJonathan Corbet
12404950071SJonathan Corbet	usage::
12504950071SJonathan Corbet
12604950071SJonathan Corbet	  ioctl(fd, CDROMRESUME, 0);
12704950071SJonathan Corbet
12804950071SJonathan Corbet
12904950071SJonathan Corbet	inputs:
13004950071SJonathan Corbet		none
13104950071SJonathan Corbet
13204950071SJonathan Corbet
13304950071SJonathan Corbet	outputs:
13404950071SJonathan Corbet		none
13504950071SJonathan Corbet
13604950071SJonathan Corbet
13704950071SJonathan Corbet	error return:
13804950071SJonathan Corbet	  - ENOSYS	cd drive not audio-capable.
13904950071SJonathan Corbet
14004950071SJonathan Corbet
14104950071SJonathan CorbetCDROMPLAYMSF
14204950071SJonathan Corbet	Play Audio MSF
14304950071SJonathan Corbet
14404950071SJonathan Corbet	(struct cdrom_msf)
14504950071SJonathan Corbet
14604950071SJonathan Corbet
14704950071SJonathan Corbet	usage::
14804950071SJonathan Corbet
14904950071SJonathan Corbet	  struct cdrom_msf msf;
15004950071SJonathan Corbet
15104950071SJonathan Corbet	  ioctl(fd, CDROMPLAYMSF, &msf);
15204950071SJonathan Corbet
15304950071SJonathan Corbet	inputs:
15404950071SJonathan Corbet		cdrom_msf structure, describing a segment of music to play
15504950071SJonathan Corbet
15604950071SJonathan Corbet
15704950071SJonathan Corbet	outputs:
15804950071SJonathan Corbet		none
15904950071SJonathan Corbet
16004950071SJonathan Corbet
16104950071SJonathan Corbet	error return:
16204950071SJonathan Corbet	  - ENOSYS	cd drive not audio-capable.
16304950071SJonathan Corbet
16404950071SJonathan Corbet	notes:
16504950071SJonathan Corbet		- MSF stands for minutes-seconds-frames
16604950071SJonathan Corbet		- LBA stands for logical block address
16704950071SJonathan Corbet		- Segment is described as start and end times, where each time
16804950071SJonathan Corbet		  is described as minutes:seconds:frames.
16904950071SJonathan Corbet		  A frame is 1/75 of a second.
17004950071SJonathan Corbet
17104950071SJonathan Corbet
17204950071SJonathan CorbetCDROMPLAYTRKIND
17304950071SJonathan Corbet	Play Audio Track/index
17404950071SJonathan Corbet
17504950071SJonathan Corbet	(struct cdrom_ti)
17604950071SJonathan Corbet
17704950071SJonathan Corbet
17804950071SJonathan Corbet	usage::
17904950071SJonathan Corbet
18004950071SJonathan Corbet	  struct cdrom_ti ti;
18104950071SJonathan Corbet
18204950071SJonathan Corbet	  ioctl(fd, CDROMPLAYTRKIND, &ti);
18304950071SJonathan Corbet
18404950071SJonathan Corbet	inputs:
18504950071SJonathan Corbet		cdrom_ti structure, describing a segment of music to play
18604950071SJonathan Corbet
18704950071SJonathan Corbet
18804950071SJonathan Corbet	outputs:
18904950071SJonathan Corbet		none
19004950071SJonathan Corbet
19104950071SJonathan Corbet
19204950071SJonathan Corbet	error return:
19304950071SJonathan Corbet	  - ENOSYS	cd drive not audio-capable.
19404950071SJonathan Corbet
19504950071SJonathan Corbet	notes:
19604950071SJonathan Corbet		- Segment is described as start and end times, where each time
19704950071SJonathan Corbet		  is described as a track and an index.
19804950071SJonathan Corbet
19904950071SJonathan Corbet
20004950071SJonathan Corbet
20104950071SJonathan CorbetCDROMREADTOCHDR
20204950071SJonathan Corbet	Read TOC header
20304950071SJonathan Corbet
20404950071SJonathan Corbet	(struct cdrom_tochdr)
20504950071SJonathan Corbet
20604950071SJonathan Corbet
20704950071SJonathan Corbet	usage::
20804950071SJonathan Corbet
20904950071SJonathan Corbet	  cdrom_tochdr header;
21004950071SJonathan Corbet
21104950071SJonathan Corbet	  ioctl(fd, CDROMREADTOCHDR, &header);
21204950071SJonathan Corbet
21304950071SJonathan Corbet	inputs:
21404950071SJonathan Corbet		cdrom_tochdr structure
21504950071SJonathan Corbet
21604950071SJonathan Corbet
21704950071SJonathan Corbet	outputs:
21804950071SJonathan Corbet		cdrom_tochdr structure
21904950071SJonathan Corbet
22004950071SJonathan Corbet
22104950071SJonathan Corbet	error return:
22204950071SJonathan Corbet	  - ENOSYS	cd drive not audio-capable.
22304950071SJonathan Corbet
22404950071SJonathan Corbet
22504950071SJonathan Corbet
22604950071SJonathan CorbetCDROMREADTOCENTRY
22704950071SJonathan Corbet	Read TOC entry
22804950071SJonathan Corbet
22904950071SJonathan Corbet	(struct cdrom_tocentry)
23004950071SJonathan Corbet
23104950071SJonathan Corbet
23204950071SJonathan Corbet	usage::
23304950071SJonathan Corbet
23404950071SJonathan Corbet	  struct cdrom_tocentry entry;
23504950071SJonathan Corbet
23604950071SJonathan Corbet	  ioctl(fd, CDROMREADTOCENTRY, &entry);
23704950071SJonathan Corbet
23804950071SJonathan Corbet	inputs:
23904950071SJonathan Corbet		cdrom_tocentry structure
24004950071SJonathan Corbet
24104950071SJonathan Corbet
24204950071SJonathan Corbet	outputs:
24304950071SJonathan Corbet		cdrom_tocentry structure
24404950071SJonathan Corbet
24504950071SJonathan Corbet
24604950071SJonathan Corbet	error return:
24704950071SJonathan Corbet	  - ENOSYS	cd drive not audio-capable.
24804950071SJonathan Corbet	  - EINVAL	entry.cdte_format not CDROM_MSF or CDROM_LBA
24904950071SJonathan Corbet	  - EINVAL	requested track out of bounds
25004950071SJonathan Corbet	  - EIO		I/O error reading TOC
25104950071SJonathan Corbet
25204950071SJonathan Corbet	notes:
25304950071SJonathan Corbet		- TOC stands for Table Of Contents
25404950071SJonathan Corbet		- MSF stands for minutes-seconds-frames
25504950071SJonathan Corbet		- LBA stands for logical block address
25604950071SJonathan Corbet
25704950071SJonathan Corbet
25804950071SJonathan Corbet
25904950071SJonathan CorbetCDROMSTOP
26004950071SJonathan Corbet	Stop the cdrom drive
26104950071SJonathan Corbet
26204950071SJonathan Corbet
26304950071SJonathan Corbet	usage::
26404950071SJonathan Corbet
26504950071SJonathan Corbet	  ioctl(fd, CDROMSTOP, 0);
26604950071SJonathan Corbet
26704950071SJonathan Corbet
26804950071SJonathan Corbet	inputs:
26904950071SJonathan Corbet		none
27004950071SJonathan Corbet
27104950071SJonathan Corbet
27204950071SJonathan Corbet	outputs:
27304950071SJonathan Corbet		none
27404950071SJonathan Corbet
27504950071SJonathan Corbet
27604950071SJonathan Corbet	error return:
27704950071SJonathan Corbet	  - ENOSYS	cd drive not audio-capable.
27804950071SJonathan Corbet
27904950071SJonathan Corbet	notes:
28004950071SJonathan Corbet	  - Exact interpretation of this ioctl depends on the device,
28104950071SJonathan Corbet	    but most seem to spin the drive down.
28204950071SJonathan Corbet
28304950071SJonathan Corbet
28404950071SJonathan CorbetCDROMSTART
28504950071SJonathan Corbet	Start the cdrom drive
28604950071SJonathan Corbet
28704950071SJonathan Corbet
28804950071SJonathan Corbet	usage::
28904950071SJonathan Corbet
29004950071SJonathan Corbet	  ioctl(fd, CDROMSTART, 0);
29104950071SJonathan Corbet
29204950071SJonathan Corbet
29304950071SJonathan Corbet	inputs:
29404950071SJonathan Corbet		none
29504950071SJonathan Corbet
29604950071SJonathan Corbet
29704950071SJonathan Corbet	outputs:
29804950071SJonathan Corbet		none
29904950071SJonathan Corbet
30004950071SJonathan Corbet
30104950071SJonathan Corbet	error return:
30204950071SJonathan Corbet	  - ENOSYS	cd drive not audio-capable.
30304950071SJonathan Corbet
30404950071SJonathan Corbet	notes:
30504950071SJonathan Corbet	  - Exact interpretation of this ioctl depends on the device,
30604950071SJonathan Corbet	    but most seem to spin the drive up and/or close the tray.
30704950071SJonathan Corbet	    Other devices ignore the ioctl completely.
30804950071SJonathan Corbet
30904950071SJonathan Corbet
31004950071SJonathan CorbetCDROMEJECT
31104950071SJonathan Corbet	- Ejects the cdrom media
31204950071SJonathan Corbet
31304950071SJonathan Corbet
31404950071SJonathan Corbet	usage::
31504950071SJonathan Corbet
31604950071SJonathan Corbet	  ioctl(fd, CDROMEJECT, 0);
31704950071SJonathan Corbet
31804950071SJonathan Corbet
31904950071SJonathan Corbet	inputs:
32004950071SJonathan Corbet		none
32104950071SJonathan Corbet
32204950071SJonathan Corbet
32304950071SJonathan Corbet	outputs:
32404950071SJonathan Corbet		none
32504950071SJonathan Corbet
32604950071SJonathan Corbet
32704950071SJonathan Corbet	error returns:
32804950071SJonathan Corbet	  - ENOSYS	cd drive not capable of ejecting
32904950071SJonathan Corbet	  - EBUSY	other processes are accessing drive, or door is locked
33004950071SJonathan Corbet
33104950071SJonathan Corbet	notes:
33204950071SJonathan Corbet		- See CDROM_LOCKDOOR, below.
33304950071SJonathan Corbet
33404950071SJonathan Corbet
33504950071SJonathan Corbet
33604950071SJonathan Corbet
33704950071SJonathan CorbetCDROMCLOSETRAY
33804950071SJonathan Corbet	pendant of CDROMEJECT
33904950071SJonathan Corbet
34004950071SJonathan Corbet
34104950071SJonathan Corbet	usage::
34204950071SJonathan Corbet
34304950071SJonathan Corbet	  ioctl(fd, CDROMCLOSETRAY, 0);
34404950071SJonathan Corbet
34504950071SJonathan Corbet
34604950071SJonathan Corbet	inputs:
34704950071SJonathan Corbet		none
34804950071SJonathan Corbet
34904950071SJonathan Corbet
35004950071SJonathan Corbet	outputs:
35104950071SJonathan Corbet		none
35204950071SJonathan Corbet
35304950071SJonathan Corbet
35404950071SJonathan Corbet	error returns:
35504950071SJonathan Corbet	  - ENOSYS	cd drive not capable of closing the tray
35604950071SJonathan Corbet	  - EBUSY	other processes are accessing drive, or door is locked
35704950071SJonathan Corbet
35804950071SJonathan Corbet	notes:
35904950071SJonathan Corbet		- See CDROM_LOCKDOOR, below.
36004950071SJonathan Corbet
36104950071SJonathan Corbet
36204950071SJonathan Corbet
36304950071SJonathan Corbet
36404950071SJonathan CorbetCDROMVOLCTRL
36504950071SJonathan Corbet	Control output volume (struct cdrom_volctrl)
36604950071SJonathan Corbet
36704950071SJonathan Corbet
36804950071SJonathan Corbet	usage::
36904950071SJonathan Corbet
37004950071SJonathan Corbet	  struct cdrom_volctrl volume;
37104950071SJonathan Corbet
37204950071SJonathan Corbet	  ioctl(fd, CDROMVOLCTRL, &volume);
37304950071SJonathan Corbet
37404950071SJonathan Corbet	inputs:
37504950071SJonathan Corbet		cdrom_volctrl structure containing volumes for up to 4
37604950071SJonathan Corbet		channels.
37704950071SJonathan Corbet
37804950071SJonathan Corbet	outputs:
37904950071SJonathan Corbet		none
38004950071SJonathan Corbet
38104950071SJonathan Corbet
38204950071SJonathan Corbet	error return:
38304950071SJonathan Corbet	  - ENOSYS	cd drive not audio-capable.
38404950071SJonathan Corbet
38504950071SJonathan Corbet
38604950071SJonathan Corbet
38704950071SJonathan CorbetCDROMVOLREAD
38804950071SJonathan Corbet	Get the drive's volume setting
38904950071SJonathan Corbet
39004950071SJonathan Corbet	(struct cdrom_volctrl)
39104950071SJonathan Corbet
39204950071SJonathan Corbet
39304950071SJonathan Corbet	usage::
39404950071SJonathan Corbet
39504950071SJonathan Corbet	  struct cdrom_volctrl volume;
39604950071SJonathan Corbet
39704950071SJonathan Corbet	  ioctl(fd, CDROMVOLREAD, &volume);
39804950071SJonathan Corbet
39904950071SJonathan Corbet	inputs:
40004950071SJonathan Corbet		none
40104950071SJonathan Corbet
40204950071SJonathan Corbet
40304950071SJonathan Corbet	outputs:
40404950071SJonathan Corbet		The current volume settings.
40504950071SJonathan Corbet
40604950071SJonathan Corbet
40704950071SJonathan Corbet	error return:
40804950071SJonathan Corbet	  - ENOSYS	cd drive not audio-capable.
40904950071SJonathan Corbet
41004950071SJonathan Corbet
41104950071SJonathan Corbet
41204950071SJonathan CorbetCDROMSUBCHNL
41304950071SJonathan Corbet	Read subchannel data
41404950071SJonathan Corbet
41504950071SJonathan Corbet	(struct cdrom_subchnl)
41604950071SJonathan Corbet
41704950071SJonathan Corbet
41804950071SJonathan Corbet	usage::
41904950071SJonathan Corbet
42004950071SJonathan Corbet	  struct cdrom_subchnl q;
42104950071SJonathan Corbet
42204950071SJonathan Corbet	  ioctl(fd, CDROMSUBCHNL, &q);
42304950071SJonathan Corbet
42404950071SJonathan Corbet	inputs:
42504950071SJonathan Corbet		cdrom_subchnl structure
42604950071SJonathan Corbet
42704950071SJonathan Corbet
42804950071SJonathan Corbet	outputs:
42904950071SJonathan Corbet		cdrom_subchnl structure
43004950071SJonathan Corbet
43104950071SJonathan Corbet
43204950071SJonathan Corbet	error return:
43304950071SJonathan Corbet	  - ENOSYS	cd drive not audio-capable.
43404950071SJonathan Corbet	  - EINVAL	format not CDROM_MSF or CDROM_LBA
43504950071SJonathan Corbet
43604950071SJonathan Corbet	notes:
43704950071SJonathan Corbet		- Format is converted to CDROM_MSF or CDROM_LBA
43804950071SJonathan Corbet		  as per user request on return
43904950071SJonathan Corbet
44004950071SJonathan Corbet
44104950071SJonathan Corbet
44204950071SJonathan CorbetCDROMREADRAW
44304950071SJonathan Corbet	read data in raw mode (2352 Bytes)
44404950071SJonathan Corbet
44504950071SJonathan Corbet	(struct cdrom_read)
44604950071SJonathan Corbet
44704950071SJonathan Corbet	usage::
44804950071SJonathan Corbet
44904950071SJonathan Corbet	  union {
45004950071SJonathan Corbet
45104950071SJonathan Corbet	    struct cdrom_msf msf;		/* input */
45204950071SJonathan Corbet	    char buffer[CD_FRAMESIZE_RAW];	/* return */
45304950071SJonathan Corbet	  } arg;
45404950071SJonathan Corbet	  ioctl(fd, CDROMREADRAW, &arg);
45504950071SJonathan Corbet
45604950071SJonathan Corbet	inputs:
45704950071SJonathan Corbet		cdrom_msf structure indicating an address to read.
45804950071SJonathan Corbet
45904950071SJonathan Corbet		Only the start values are significant.
46004950071SJonathan Corbet
46104950071SJonathan Corbet	outputs:
46204950071SJonathan Corbet		Data written to address provided by user.
46304950071SJonathan Corbet
46404950071SJonathan Corbet
46504950071SJonathan Corbet	error return:
46604950071SJonathan Corbet	  - EINVAL	address less than 0, or msf less than 0:2:0
46704950071SJonathan Corbet	  - ENOMEM	out of memory
46804950071SJonathan Corbet
46904950071SJonathan Corbet	notes:
47004950071SJonathan Corbet		- As of 2.6.8.1, comments in <linux/cdrom.h> indicate that this
47104950071SJonathan Corbet		  ioctl accepts a cdrom_read structure, but actual source code
47204950071SJonathan Corbet		  reads a cdrom_msf structure and writes a buffer of data to
47304950071SJonathan Corbet		  the same address.
47404950071SJonathan Corbet
47504950071SJonathan Corbet		- MSF values are converted to LBA values via this formula::
47604950071SJonathan Corbet
47704950071SJonathan Corbet		    lba = (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
47804950071SJonathan Corbet
47904950071SJonathan Corbet
48004950071SJonathan Corbet
48104950071SJonathan Corbet
48204950071SJonathan CorbetCDROMREADMODE1
48304950071SJonathan Corbet	Read CDROM mode 1 data (2048 Bytes)
48404950071SJonathan Corbet
48504950071SJonathan Corbet	(struct cdrom_read)
48604950071SJonathan Corbet
48704950071SJonathan Corbet	notes:
48804950071SJonathan Corbet		Identical to CDROMREADRAW except that block size is
48904950071SJonathan Corbet		CD_FRAMESIZE (2048) bytes
49004950071SJonathan Corbet
49104950071SJonathan Corbet
49204950071SJonathan Corbet
49304950071SJonathan CorbetCDROMREADMODE2
49404950071SJonathan Corbet	Read CDROM mode 2 data (2336 Bytes)
49504950071SJonathan Corbet
49604950071SJonathan Corbet	(struct cdrom_read)
49704950071SJonathan Corbet
49804950071SJonathan Corbet	notes:
49904950071SJonathan Corbet		Identical to CDROMREADRAW except that block size is
50004950071SJonathan Corbet		CD_FRAMESIZE_RAW0 (2336) bytes
50104950071SJonathan Corbet
50204950071SJonathan Corbet
50304950071SJonathan Corbet
50404950071SJonathan CorbetCDROMREADAUDIO
50504950071SJonathan Corbet	(struct cdrom_read_audio)
50604950071SJonathan Corbet
50704950071SJonathan Corbet	usage::
50804950071SJonathan Corbet
50904950071SJonathan Corbet	  struct cdrom_read_audio ra;
51004950071SJonathan Corbet
51104950071SJonathan Corbet	  ioctl(fd, CDROMREADAUDIO, &ra);
51204950071SJonathan Corbet
51304950071SJonathan Corbet	inputs:
51404950071SJonathan Corbet		cdrom_read_audio structure containing read start
51504950071SJonathan Corbet		point and length
51604950071SJonathan Corbet
51704950071SJonathan Corbet	outputs:
51804950071SJonathan Corbet		audio data, returned to buffer indicated by ra
51904950071SJonathan Corbet
52004950071SJonathan Corbet
52104950071SJonathan Corbet	error return:
52204950071SJonathan Corbet	  - EINVAL	format not CDROM_MSF or CDROM_LBA
52304950071SJonathan Corbet	  - EINVAL	nframes not in range [1 75]
52404950071SJonathan Corbet	  - ENXIO	drive has no queue (probably means invalid fd)
52504950071SJonathan Corbet	  - ENOMEM	out of memory
52604950071SJonathan Corbet
52704950071SJonathan Corbet
52804950071SJonathan CorbetCDROMEJECT_SW
52904950071SJonathan Corbet	enable(1)/disable(0) auto-ejecting
53004950071SJonathan Corbet
53104950071SJonathan Corbet
53204950071SJonathan Corbet	usage::
53304950071SJonathan Corbet
53404950071SJonathan Corbet	  int val;
53504950071SJonathan Corbet
53604950071SJonathan Corbet	  ioctl(fd, CDROMEJECT_SW, val);
53704950071SJonathan Corbet
53804950071SJonathan Corbet	inputs:
53904950071SJonathan Corbet		Flag specifying auto-eject flag.
54004950071SJonathan Corbet
54104950071SJonathan Corbet
54204950071SJonathan Corbet	outputs:
54304950071SJonathan Corbet		none
54404950071SJonathan Corbet
54504950071SJonathan Corbet
54604950071SJonathan Corbet	error return:
54704950071SJonathan Corbet	  - ENOSYS	Drive is not capable of ejecting.
54804950071SJonathan Corbet	  - EBUSY	Door is locked
54904950071SJonathan Corbet
55004950071SJonathan Corbet
55104950071SJonathan Corbet
55204950071SJonathan Corbet
55304950071SJonathan CorbetCDROMMULTISESSION
55404950071SJonathan Corbet	Obtain the start-of-last-session address of multi session disks
55504950071SJonathan Corbet
55604950071SJonathan Corbet	(struct cdrom_multisession)
55704950071SJonathan Corbet
55804950071SJonathan Corbet	usage::
55904950071SJonathan Corbet
56004950071SJonathan Corbet	  struct cdrom_multisession ms_info;
56104950071SJonathan Corbet
56204950071SJonathan Corbet	  ioctl(fd, CDROMMULTISESSION, &ms_info);
56304950071SJonathan Corbet
56404950071SJonathan Corbet	inputs:
56504950071SJonathan Corbet		cdrom_multisession structure containing desired
56604950071SJonathan Corbet
56704950071SJonathan Corbet	  format.
56804950071SJonathan Corbet
56904950071SJonathan Corbet	outputs:
57004950071SJonathan Corbet		cdrom_multisession structure is filled with last_session
57104950071SJonathan Corbet		information.
57204950071SJonathan Corbet
57304950071SJonathan Corbet	error return:
57404950071SJonathan Corbet	  - EINVAL	format not CDROM_MSF or CDROM_LBA
57504950071SJonathan Corbet
57604950071SJonathan Corbet
57704950071SJonathan CorbetCDROM_GET_MCN
57804950071SJonathan Corbet	Obtain the "Universal Product Code"
57904950071SJonathan Corbet	if available
58004950071SJonathan Corbet
58104950071SJonathan Corbet	(struct cdrom_mcn)
58204950071SJonathan Corbet
58304950071SJonathan Corbet
58404950071SJonathan Corbet	usage::
58504950071SJonathan Corbet
58604950071SJonathan Corbet	  struct cdrom_mcn mcn;
58704950071SJonathan Corbet
58804950071SJonathan Corbet	  ioctl(fd, CDROM_GET_MCN, &mcn);
58904950071SJonathan Corbet
59004950071SJonathan Corbet	inputs:
59104950071SJonathan Corbet		none
59204950071SJonathan Corbet
59304950071SJonathan Corbet
59404950071SJonathan Corbet	outputs:
59504950071SJonathan Corbet		Universal Product Code
59604950071SJonathan Corbet
59704950071SJonathan Corbet
59804950071SJonathan Corbet	error return:
59904950071SJonathan Corbet	  - ENOSYS	Drive is not capable of reading MCN data.
60004950071SJonathan Corbet
60104950071SJonathan Corbet	notes:
60204950071SJonathan Corbet		- Source code comments state::
60304950071SJonathan Corbet
60404950071SJonathan Corbet		    The following function is implemented, although very few
60504950071SJonathan Corbet		    audio discs give Universal Product Code information, which
60604950071SJonathan Corbet		    should just be the Medium Catalog Number on the box.  Note,
60704950071SJonathan Corbet		    that the way the code is written on the CD is /not/ uniform
60804950071SJonathan Corbet		    across all discs!
60904950071SJonathan Corbet
61004950071SJonathan Corbet
61104950071SJonathan Corbet
61204950071SJonathan Corbet
61304950071SJonathan CorbetCDROM_GET_UPC
61404950071SJonathan Corbet	CDROM_GET_MCN  (deprecated)
61504950071SJonathan Corbet
61604950071SJonathan Corbet
61704950071SJonathan Corbet	Not implemented, as of 2.6.8.1
61804950071SJonathan Corbet
61904950071SJonathan Corbet
62004950071SJonathan Corbet
62104950071SJonathan CorbetCDROMRESET
62204950071SJonathan Corbet	hard-reset the drive
62304950071SJonathan Corbet
62404950071SJonathan Corbet
62504950071SJonathan Corbet	usage::
62604950071SJonathan Corbet
62704950071SJonathan Corbet	  ioctl(fd, CDROMRESET, 0);
62804950071SJonathan Corbet
62904950071SJonathan Corbet
63004950071SJonathan Corbet	inputs:
63104950071SJonathan Corbet		none
63204950071SJonathan Corbet
63304950071SJonathan Corbet
63404950071SJonathan Corbet	outputs:
63504950071SJonathan Corbet		none
63604950071SJonathan Corbet
63704950071SJonathan Corbet
63804950071SJonathan Corbet	error return:
63904950071SJonathan Corbet	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
64004950071SJonathan Corbet	  - ENOSYS	Drive is not capable of resetting.
64104950071SJonathan Corbet
64204950071SJonathan Corbet
64304950071SJonathan Corbet
64404950071SJonathan Corbet
64504950071SJonathan CorbetCDROMREADCOOKED
64604950071SJonathan Corbet	read data in cooked mode
64704950071SJonathan Corbet
64804950071SJonathan Corbet
64904950071SJonathan Corbet	usage::
65004950071SJonathan Corbet
65104950071SJonathan Corbet	  u8 buffer[CD_FRAMESIZE]
65204950071SJonathan Corbet
65304950071SJonathan Corbet	  ioctl(fd, CDROMREADCOOKED, buffer);
65404950071SJonathan Corbet
65504950071SJonathan Corbet	inputs:
65604950071SJonathan Corbet		none
65704950071SJonathan Corbet
65804950071SJonathan Corbet
65904950071SJonathan Corbet	outputs:
66004950071SJonathan Corbet		2048 bytes of data, "cooked" mode.
66104950071SJonathan Corbet
66204950071SJonathan Corbet
66304950071SJonathan Corbet	notes:
66404950071SJonathan Corbet		Not implemented on all drives.
66504950071SJonathan Corbet
66604950071SJonathan Corbet
66704950071SJonathan Corbet
66804950071SJonathan Corbet
66904950071SJonathan Corbet
67004950071SJonathan CorbetCDROMREADALL
67104950071SJonathan Corbet	read all 2646 bytes
67204950071SJonathan Corbet
67304950071SJonathan Corbet
67404950071SJonathan Corbet	Same as CDROMREADCOOKED, but reads 2646 bytes.
67504950071SJonathan Corbet
67604950071SJonathan Corbet
67704950071SJonathan Corbet
67804950071SJonathan CorbetCDROMSEEK
67904950071SJonathan Corbet	seek msf address
68004950071SJonathan Corbet
68104950071SJonathan Corbet
68204950071SJonathan Corbet	usage::
68304950071SJonathan Corbet
68404950071SJonathan Corbet	  struct cdrom_msf msf;
68504950071SJonathan Corbet
68604950071SJonathan Corbet	  ioctl(fd, CDROMSEEK, &msf);
68704950071SJonathan Corbet
68804950071SJonathan Corbet	inputs:
68904950071SJonathan Corbet		MSF address to seek to.
69004950071SJonathan Corbet
69104950071SJonathan Corbet
69204950071SJonathan Corbet	outputs:
69304950071SJonathan Corbet		none
69404950071SJonathan Corbet
69504950071SJonathan Corbet
69604950071SJonathan Corbet
69704950071SJonathan Corbet
69804950071SJonathan CorbetCDROMPLAYBLK
69904950071SJonathan Corbet	scsi-cd only
70004950071SJonathan Corbet
70104950071SJonathan Corbet	(struct cdrom_blk)
70204950071SJonathan Corbet
70304950071SJonathan Corbet
70404950071SJonathan Corbet	usage::
70504950071SJonathan Corbet
70604950071SJonathan Corbet	  struct cdrom_blk blk;
70704950071SJonathan Corbet
70804950071SJonathan Corbet	  ioctl(fd, CDROMPLAYBLK, &blk);
70904950071SJonathan Corbet
71004950071SJonathan Corbet	inputs:
71104950071SJonathan Corbet		Region to play
71204950071SJonathan Corbet
71304950071SJonathan Corbet
71404950071SJonathan Corbet	outputs:
71504950071SJonathan Corbet		none
71604950071SJonathan Corbet
71704950071SJonathan Corbet
71804950071SJonathan Corbet
71904950071SJonathan Corbet
72004950071SJonathan CorbetCDROMGETSPINDOWN
7218fa10ee1SPaul Gortmaker	Obsolete, was ide-cd only
7228fa10ee1SPaul Gortmaker
7238fa10ee1SPaul Gortmaker
72404950071SJonathan Corbet	usage::
72504950071SJonathan Corbet
72604950071SJonathan Corbet	  char spindown;
72704950071SJonathan Corbet
72804950071SJonathan Corbet	  ioctl(fd, CDROMGETSPINDOWN, &spindown);
72904950071SJonathan Corbet
73004950071SJonathan Corbet	inputs:
73104950071SJonathan Corbet		none
73204950071SJonathan Corbet
73304950071SJonathan Corbet
73404950071SJonathan Corbet	outputs:
73504950071SJonathan Corbet		The value of the current 4-bit spindown value.
73604950071SJonathan Corbet
73704950071SJonathan Corbet
73804950071SJonathan Corbet
73904950071SJonathan Corbet
74004950071SJonathan Corbet
74104950071SJonathan CorbetCDROMSETSPINDOWN
7428fa10ee1SPaul Gortmaker	Obsolete, was ide-cd only
7438fa10ee1SPaul Gortmaker
7448fa10ee1SPaul Gortmaker
74504950071SJonathan Corbet	usage::
74604950071SJonathan Corbet
74704950071SJonathan Corbet	  char spindown
74804950071SJonathan Corbet
74904950071SJonathan Corbet	  ioctl(fd, CDROMSETSPINDOWN, &spindown);
75004950071SJonathan Corbet
75104950071SJonathan Corbet	inputs:
75204950071SJonathan Corbet		4-bit value used to control spindown (TODO: more detail here)
75304950071SJonathan Corbet
75404950071SJonathan Corbet
75504950071SJonathan Corbet	outputs:
75604950071SJonathan Corbet		none
75704950071SJonathan Corbet
75804950071SJonathan Corbet
75904950071SJonathan Corbet
76004950071SJonathan Corbet
76104950071SJonathan Corbet
76204950071SJonathan Corbet
76304950071SJonathan CorbetCDROM_SET_OPTIONS
76404950071SJonathan Corbet	Set behavior options
76504950071SJonathan Corbet
76604950071SJonathan Corbet
76704950071SJonathan Corbet	usage::
76804950071SJonathan Corbet
76904950071SJonathan Corbet	  int options;
77004950071SJonathan Corbet
77104950071SJonathan Corbet	  ioctl(fd, CDROM_SET_OPTIONS, options);
77204950071SJonathan Corbet
77304950071SJonathan Corbet	inputs:
77404950071SJonathan Corbet		New values for drive options.  The logical 'or' of:
77504950071SJonathan Corbet
77604950071SJonathan Corbet	    ==============      ==================================
77704950071SJonathan Corbet	    CDO_AUTO_CLOSE	close tray on first open(2)
77804950071SJonathan Corbet	    CDO_AUTO_EJECT	open tray on last release
77904950071SJonathan Corbet	    CDO_USE_FFLAGS	use O_NONBLOCK information on open
78004950071SJonathan Corbet	    CDO_LOCK		lock tray on open files
78104950071SJonathan Corbet	    CDO_CHECK_TYPE	check type on open for data
78204950071SJonathan Corbet	    ==============      ==================================
78304950071SJonathan Corbet
78404950071SJonathan Corbet	outputs:
78504950071SJonathan Corbet		Returns the resulting options settings in the
78604950071SJonathan Corbet		ioctl return value.  Returns -1 on error.
78704950071SJonathan Corbet
78804950071SJonathan Corbet	error return:
78904950071SJonathan Corbet	  - ENOSYS	selected option(s) not supported by drive.
79004950071SJonathan Corbet
79104950071SJonathan Corbet
79204950071SJonathan Corbet
79304950071SJonathan Corbet
79404950071SJonathan CorbetCDROM_CLEAR_OPTIONS
79504950071SJonathan Corbet	Clear behavior options
79604950071SJonathan Corbet
79704950071SJonathan Corbet
79804950071SJonathan Corbet	Same as CDROM_SET_OPTIONS, except that selected options are
79904950071SJonathan Corbet	turned off.
80004950071SJonathan Corbet
80104950071SJonathan Corbet
80204950071SJonathan Corbet
80304950071SJonathan CorbetCDROM_SELECT_SPEED
80404950071SJonathan Corbet	Set the CD-ROM speed
80504950071SJonathan Corbet
80604950071SJonathan Corbet
80704950071SJonathan Corbet	usage::
80804950071SJonathan Corbet
80904950071SJonathan Corbet	  int speed;
81004950071SJonathan Corbet
81104950071SJonathan Corbet	  ioctl(fd, CDROM_SELECT_SPEED, speed);
81204950071SJonathan Corbet
81304950071SJonathan Corbet	inputs:
81404950071SJonathan Corbet		New drive speed.
81504950071SJonathan Corbet
81604950071SJonathan Corbet
81704950071SJonathan Corbet	outputs:
81804950071SJonathan Corbet		none
81904950071SJonathan Corbet
82004950071SJonathan Corbet
82104950071SJonathan Corbet	error return:
82204950071SJonathan Corbet	  - ENOSYS	speed selection not supported by drive.
82304950071SJonathan Corbet
82404950071SJonathan Corbet
82504950071SJonathan Corbet
82604950071SJonathan CorbetCDROM_SELECT_DISC
82704950071SJonathan Corbet	Select disc (for juke-boxes)
82804950071SJonathan Corbet
82904950071SJonathan Corbet
83004950071SJonathan Corbet	usage::
83104950071SJonathan Corbet
83204950071SJonathan Corbet	  int disk;
83304950071SJonathan Corbet
83404950071SJonathan Corbet	  ioctl(fd, CDROM_SELECT_DISC, disk);
83504950071SJonathan Corbet
83604950071SJonathan Corbet	inputs:
83704950071SJonathan Corbet		Disk to load into drive.
83804950071SJonathan Corbet
83904950071SJonathan Corbet
84004950071SJonathan Corbet	outputs:
84104950071SJonathan Corbet		none
84204950071SJonathan Corbet
84304950071SJonathan Corbet
84404950071SJonathan Corbet	error return:
84504950071SJonathan Corbet	  - EINVAL	Disk number beyond capacity of drive
84604950071SJonathan Corbet
84704950071SJonathan Corbet
84804950071SJonathan Corbet
84904950071SJonathan CorbetCDROM_MEDIA_CHANGED
85004950071SJonathan Corbet	Check is media changed
85104950071SJonathan Corbet
85204950071SJonathan Corbet
85304950071SJonathan Corbet	usage::
85404950071SJonathan Corbet
85504950071SJonathan Corbet	  int slot;
85604950071SJonathan Corbet
85704950071SJonathan Corbet	  ioctl(fd, CDROM_MEDIA_CHANGED, slot);
85804950071SJonathan Corbet
85904950071SJonathan Corbet	inputs:
86004950071SJonathan Corbet		Slot number to be tested, always zero except for jukeboxes.
86104950071SJonathan Corbet
86204950071SJonathan Corbet		May also be special values CDSL_NONE or CDSL_CURRENT
86304950071SJonathan Corbet
86404950071SJonathan Corbet	outputs:
86504950071SJonathan Corbet		Ioctl return value is 0 or 1 depending on whether the media
86604950071SJonathan Corbet
86704950071SJonathan Corbet	  has been changed, or -1 on error.
86804950071SJonathan Corbet
86904950071SJonathan Corbet	error returns:
87004950071SJonathan Corbet	  - ENOSYS	Drive can't detect media change
87104950071SJonathan Corbet	  - EINVAL	Slot number beyond capacity of drive
87204950071SJonathan Corbet	  - ENOMEM	Out of memory
87304950071SJonathan Corbet
87404950071SJonathan Corbet
87504950071SJonathan Corbet
87604950071SJonathan CorbetCDROM_DRIVE_STATUS
87704950071SJonathan Corbet	Get tray position, etc.
87804950071SJonathan Corbet
87904950071SJonathan Corbet
88004950071SJonathan Corbet	usage::
88104950071SJonathan Corbet
88204950071SJonathan Corbet	  int slot;
88304950071SJonathan Corbet
88404950071SJonathan Corbet	  ioctl(fd, CDROM_DRIVE_STATUS, slot);
88504950071SJonathan Corbet
88604950071SJonathan Corbet	inputs:
88704950071SJonathan Corbet		Slot number to be tested, always zero except for jukeboxes.
88804950071SJonathan Corbet
88904950071SJonathan Corbet		May also be special values CDSL_NONE or CDSL_CURRENT
89004950071SJonathan Corbet
89104950071SJonathan Corbet	outputs:
89204950071SJonathan Corbet		Ioctl return value will be one of the following values
89304950071SJonathan Corbet
89404950071SJonathan Corbet	  from <linux/cdrom.h>:
89504950071SJonathan Corbet
89604950071SJonathan Corbet	    =================== ==========================
89704950071SJonathan Corbet	    CDS_NO_INFO		Information not available.
89804950071SJonathan Corbet	    CDS_NO_DISC
89904950071SJonathan Corbet	    CDS_TRAY_OPEN
90004950071SJonathan Corbet	    CDS_DRIVE_NOT_READY
90104950071SJonathan Corbet	    CDS_DISC_OK
90204950071SJonathan Corbet	    -1			error
90304950071SJonathan Corbet	    =================== ==========================
90404950071SJonathan Corbet
90504950071SJonathan Corbet	error returns:
90604950071SJonathan Corbet	  - ENOSYS	Drive can't detect drive status
90704950071SJonathan Corbet	  - EINVAL	Slot number beyond capacity of drive
90804950071SJonathan Corbet	  - ENOMEM	Out of memory
90904950071SJonathan Corbet
91004950071SJonathan Corbet
91104950071SJonathan Corbet
91204950071SJonathan Corbet
91304950071SJonathan CorbetCDROM_DISC_STATUS
91404950071SJonathan Corbet	Get disc type, etc.
91504950071SJonathan Corbet
91604950071SJonathan Corbet
91704950071SJonathan Corbet	usage::
91804950071SJonathan Corbet
91904950071SJonathan Corbet	  ioctl(fd, CDROM_DISC_STATUS, 0);
92004950071SJonathan Corbet
92104950071SJonathan Corbet
92204950071SJonathan Corbet	inputs:
92304950071SJonathan Corbet		none
92404950071SJonathan Corbet
92504950071SJonathan Corbet
92604950071SJonathan Corbet	outputs:
92704950071SJonathan Corbet		Ioctl return value will be one of the following values
92804950071SJonathan Corbet
92904950071SJonathan Corbet	  from <linux/cdrom.h>:
93004950071SJonathan Corbet
93104950071SJonathan Corbet	    - CDS_NO_INFO
93204950071SJonathan Corbet	    - CDS_AUDIO
93304950071SJonathan Corbet	    - CDS_MIXED
93404950071SJonathan Corbet	    - CDS_XA_2_2
93504950071SJonathan Corbet	    - CDS_XA_2_1
93604950071SJonathan Corbet	    - CDS_DATA_1
93704950071SJonathan Corbet
93804950071SJonathan Corbet	error returns:
93904950071SJonathan Corbet		none at present
94004950071SJonathan Corbet
94104950071SJonathan Corbet	notes:
94204950071SJonathan Corbet	    - Source code comments state::
94304950071SJonathan Corbet
94404950071SJonathan Corbet
94504950071SJonathan Corbet		Ok, this is where problems start.  The current interface for
94604950071SJonathan Corbet		the CDROM_DISC_STATUS ioctl is flawed.  It makes the false
94704950071SJonathan Corbet		assumption that CDs are all CDS_DATA_1 or all CDS_AUDIO, etc.
94804950071SJonathan Corbet		Unfortunately, while this is often the case, it is also
94904950071SJonathan Corbet		very common for CDs to have some tracks with data, and some
95004950071SJonathan Corbet		tracks with audio.	Just because I feel like it, I declare
95104950071SJonathan Corbet		the following to be the best way to cope.  If the CD has
95204950071SJonathan Corbet		ANY data tracks on it, it will be returned as a data CD.
95304950071SJonathan Corbet		If it has any XA tracks, I will return it as that.	Now I
95404950071SJonathan Corbet		could simplify this interface by combining these returns with
95504950071SJonathan Corbet		the above, but this more clearly demonstrates the problem
95604950071SJonathan Corbet		with the current interface.  Too bad this wasn't designed
95704950071SJonathan Corbet		to use bitmasks...	       -Erik
95804950071SJonathan Corbet
95904950071SJonathan Corbet		Well, now we have the option CDS_MIXED: a mixed-type CD.
96004950071SJonathan Corbet		User level programmers might feel the ioctl is not very
96104950071SJonathan Corbet		useful.
96204950071SJonathan Corbet				---david
96304950071SJonathan Corbet
96404950071SJonathan Corbet
96504950071SJonathan Corbet
96604950071SJonathan Corbet
96704950071SJonathan CorbetCDROM_CHANGER_NSLOTS
96804950071SJonathan Corbet	Get number of slots
96904950071SJonathan Corbet
97004950071SJonathan Corbet
97104950071SJonathan Corbet	usage::
97204950071SJonathan Corbet
97304950071SJonathan Corbet	  ioctl(fd, CDROM_CHANGER_NSLOTS, 0);
97404950071SJonathan Corbet
97504950071SJonathan Corbet
97604950071SJonathan Corbet	inputs:
97704950071SJonathan Corbet		none
97804950071SJonathan Corbet
97904950071SJonathan Corbet
98004950071SJonathan Corbet	outputs:
98104950071SJonathan Corbet		The ioctl return value will be the number of slots in a
98204950071SJonathan Corbet		CD changer.  Typically 1 for non-multi-disk devices.
98304950071SJonathan Corbet
98404950071SJonathan Corbet	error returns:
98504950071SJonathan Corbet		none
98604950071SJonathan Corbet
98704950071SJonathan Corbet
98804950071SJonathan Corbet
98904950071SJonathan CorbetCDROM_LOCKDOOR
99004950071SJonathan Corbet	lock or unlock door
99104950071SJonathan Corbet
99204950071SJonathan Corbet
99304950071SJonathan Corbet	usage::
99404950071SJonathan Corbet
99504950071SJonathan Corbet	  int lock;
99604950071SJonathan Corbet
99704950071SJonathan Corbet	  ioctl(fd, CDROM_LOCKDOOR, lock);
99804950071SJonathan Corbet
99904950071SJonathan Corbet	inputs:
100004950071SJonathan Corbet		Door lock flag, 1=lock, 0=unlock
100104950071SJonathan Corbet
100204950071SJonathan Corbet
100304950071SJonathan Corbet	outputs:
100404950071SJonathan Corbet		none
100504950071SJonathan Corbet
100604950071SJonathan Corbet
100704950071SJonathan Corbet	error returns:
100804950071SJonathan Corbet	  - EDRIVE_CANT_DO_THIS
100904950071SJonathan Corbet
101004950071SJonathan Corbet				Door lock function not supported.
101104950071SJonathan Corbet	  - EBUSY
101204950071SJonathan Corbet
101304950071SJonathan Corbet				Attempt to unlock when multiple users
101404950071SJonathan Corbet				have the drive open and not CAP_SYS_ADMIN
101504950071SJonathan Corbet
101604950071SJonathan Corbet	notes:
101704950071SJonathan Corbet		As of 2.6.8.1, the lock flag is a global lock, meaning that
101804950071SJonathan Corbet		all CD drives will be locked or unlocked together.  This is
101904950071SJonathan Corbet		probably a bug.
102004950071SJonathan Corbet
102104950071SJonathan Corbet		The EDRIVE_CANT_DO_THIS value is defined in <linux/cdrom.h>
102204950071SJonathan Corbet		and is currently (2.6.8.1) the same as EOPNOTSUPP
102304950071SJonathan Corbet
102404950071SJonathan Corbet
102504950071SJonathan Corbet
102604950071SJonathan CorbetCDROM_DEBUG
102704950071SJonathan Corbet	Turn debug messages on/off
102804950071SJonathan Corbet
102904950071SJonathan Corbet
103004950071SJonathan Corbet	usage::
103104950071SJonathan Corbet
103204950071SJonathan Corbet	  int debug;
103304950071SJonathan Corbet
103404950071SJonathan Corbet	  ioctl(fd, CDROM_DEBUG, debug);
103504950071SJonathan Corbet
103604950071SJonathan Corbet	inputs:
103704950071SJonathan Corbet		Cdrom debug flag, 0=disable, 1=enable
103804950071SJonathan Corbet
103904950071SJonathan Corbet
104004950071SJonathan Corbet	outputs:
104104950071SJonathan Corbet		The ioctl return value will be the new debug flag.
104204950071SJonathan Corbet
104304950071SJonathan Corbet
104404950071SJonathan Corbet	error return:
104504950071SJonathan Corbet	  - EACCES	Access denied:  requires CAP_SYS_ADMIN
104604950071SJonathan Corbet
104704950071SJonathan Corbet
104804950071SJonathan Corbet
104904950071SJonathan CorbetCDROM_GET_CAPABILITY
105004950071SJonathan Corbet	get capabilities
105104950071SJonathan Corbet
105204950071SJonathan Corbet
105304950071SJonathan Corbet	usage::
105404950071SJonathan Corbet
105504950071SJonathan Corbet	  ioctl(fd, CDROM_GET_CAPABILITY, 0);
105604950071SJonathan Corbet
105704950071SJonathan Corbet
105804950071SJonathan Corbet	inputs:
105904950071SJonathan Corbet		none
106004950071SJonathan Corbet
106104950071SJonathan Corbet
106204950071SJonathan Corbet	outputs:
106304950071SJonathan Corbet		The ioctl return value is the current device capability
106404950071SJonathan Corbet		flags.  See CDC_CLOSE_TRAY, CDC_OPEN_TRAY, etc.
106504950071SJonathan Corbet
106604950071SJonathan Corbet
106704950071SJonathan Corbet
106804950071SJonathan CorbetCDROMAUDIOBUFSIZ
106904950071SJonathan Corbet	set the audio buffer size
107004950071SJonathan Corbet
107104950071SJonathan Corbet
107204950071SJonathan Corbet	usage::
107304950071SJonathan Corbet
107404950071SJonathan Corbet	  int arg;
107504950071SJonathan Corbet
107604950071SJonathan Corbet	  ioctl(fd, CDROMAUDIOBUFSIZ, val);
107704950071SJonathan Corbet
107804950071SJonathan Corbet	inputs:
107904950071SJonathan Corbet		New audio buffer size
108004950071SJonathan Corbet
108104950071SJonathan Corbet
108204950071SJonathan Corbet	outputs:
108304950071SJonathan Corbet		The ioctl return value is the new audio buffer size, or -1
108404950071SJonathan Corbet		on error.
108504950071SJonathan Corbet
108604950071SJonathan Corbet	error return:
108704950071SJonathan Corbet	  - ENOSYS	Not supported by this driver.
108804950071SJonathan Corbet
108904950071SJonathan Corbet	notes:
109004950071SJonathan Corbet		Not supported by all drivers.
109104950071SJonathan Corbet
109204950071SJonathan Corbet
109304950071SJonathan Corbet
109404950071SJonathan Corbet
109504950071SJonathan CorbetDVD_READ_STRUCT			Read structure
109604950071SJonathan Corbet
109704950071SJonathan Corbet	usage::
109804950071SJonathan Corbet
109904950071SJonathan Corbet	  dvd_struct s;
110004950071SJonathan Corbet
110104950071SJonathan Corbet	  ioctl(fd, DVD_READ_STRUCT, &s);
110204950071SJonathan Corbet
110304950071SJonathan Corbet	inputs:
110404950071SJonathan Corbet		dvd_struct structure, containing:
110504950071SJonathan Corbet
110604950071SJonathan Corbet	    =================== ==========================================
110704950071SJonathan Corbet	    type		specifies the information desired, one of
110804950071SJonathan Corbet				DVD_STRUCT_PHYSICAL, DVD_STRUCT_COPYRIGHT,
110904950071SJonathan Corbet				DVD_STRUCT_DISCKEY, DVD_STRUCT_BCA,
111004950071SJonathan Corbet				DVD_STRUCT_MANUFACT
111104950071SJonathan Corbet	    physical.layer_num	desired layer, indexed from 0
111204950071SJonathan Corbet	    copyright.layer_num	desired layer, indexed from 0
111304950071SJonathan Corbet	    disckey.agid
111404950071SJonathan Corbet	    =================== ==========================================
111504950071SJonathan Corbet
111604950071SJonathan Corbet	outputs:
111704950071SJonathan Corbet		dvd_struct structure, containing:
111804950071SJonathan Corbet
111904950071SJonathan Corbet	    =================== ================================
112004950071SJonathan Corbet	    physical		for type == DVD_STRUCT_PHYSICAL
112104950071SJonathan Corbet	    copyright		for type == DVD_STRUCT_COPYRIGHT
112204950071SJonathan Corbet	    disckey.value	for type == DVD_STRUCT_DISCKEY
112304950071SJonathan Corbet	    bca.{len,value}	for type == DVD_STRUCT_BCA
112404950071SJonathan Corbet	    manufact.{len,valu}	for type == DVD_STRUCT_MANUFACT
112504950071SJonathan Corbet	    =================== ================================
112604950071SJonathan Corbet
112704950071SJonathan Corbet	error returns:
112804950071SJonathan Corbet	  - EINVAL	physical.layer_num exceeds number of layers
112904950071SJonathan Corbet	  - EIO		Received invalid response from drive
113004950071SJonathan Corbet
113104950071SJonathan Corbet
113204950071SJonathan Corbet
113304950071SJonathan CorbetDVD_WRITE_STRUCT		Write structure
113404950071SJonathan Corbet
113504950071SJonathan Corbet	Not implemented, as of 2.6.8.1
113604950071SJonathan Corbet
113704950071SJonathan Corbet
113804950071SJonathan Corbet
113904950071SJonathan CorbetDVD_AUTH			Authentication
114004950071SJonathan Corbet
114104950071SJonathan Corbet	usage::
114204950071SJonathan Corbet
114304950071SJonathan Corbet	  dvd_authinfo ai;
114404950071SJonathan Corbet
114504950071SJonathan Corbet	  ioctl(fd, DVD_AUTH, &ai);
114604950071SJonathan Corbet
114704950071SJonathan Corbet	inputs:
114804950071SJonathan Corbet		dvd_authinfo structure.  See <linux/cdrom.h>
114904950071SJonathan Corbet
115004950071SJonathan Corbet
115104950071SJonathan Corbet	outputs:
115204950071SJonathan Corbet		dvd_authinfo structure.
115304950071SJonathan Corbet
115404950071SJonathan Corbet
115504950071SJonathan Corbet	error return:
115604950071SJonathan Corbet	  - ENOTTY	ai.type not recognized.
115704950071SJonathan Corbet
115804950071SJonathan Corbet
115904950071SJonathan Corbet
116004950071SJonathan CorbetCDROM_SEND_PACKET
116104950071SJonathan Corbet	send a packet to the drive
116204950071SJonathan Corbet
116304950071SJonathan Corbet
116404950071SJonathan Corbet	usage::
116504950071SJonathan Corbet
116604950071SJonathan Corbet	  struct cdrom_generic_command cgc;
116704950071SJonathan Corbet
116804950071SJonathan Corbet	  ioctl(fd, CDROM_SEND_PACKET, &cgc);
116904950071SJonathan Corbet
117004950071SJonathan Corbet	inputs:
117104950071SJonathan Corbet		cdrom_generic_command structure containing the packet to send.
117204950071SJonathan Corbet
117304950071SJonathan Corbet
117404950071SJonathan Corbet	outputs:
117504950071SJonathan Corbet		none
117604950071SJonathan Corbet
117704950071SJonathan Corbet	  cdrom_generic_command structure containing results.
117804950071SJonathan Corbet
117904950071SJonathan Corbet	error return:
118004950071SJonathan Corbet	  - EIO
118104950071SJonathan Corbet
118204950071SJonathan Corbet			command failed.
118304950071SJonathan Corbet	  - EPERM
118404950071SJonathan Corbet
118504950071SJonathan Corbet			Operation not permitted, either because a
118604950071SJonathan Corbet			write command was attempted on a drive which
118704950071SJonathan Corbet			is opened read-only, or because the command
118804950071SJonathan Corbet			requires CAP_SYS_RAWIO
118904950071SJonathan Corbet	  - EINVAL
119004950071SJonathan Corbet
119104950071SJonathan Corbet			cgc.data_direction not set
119204950071SJonathan Corbet
119304950071SJonathan Corbet
119404950071SJonathan Corbet
119504950071SJonathan CorbetCDROM_NEXT_WRITABLE
119604950071SJonathan Corbet	get next writable block
119704950071SJonathan Corbet
119804950071SJonathan Corbet
119904950071SJonathan Corbet	usage::
120004950071SJonathan Corbet
120104950071SJonathan Corbet	  long next;
120204950071SJonathan Corbet
120304950071SJonathan Corbet	  ioctl(fd, CDROM_NEXT_WRITABLE, &next);
120404950071SJonathan Corbet
120504950071SJonathan Corbet	inputs:
120604950071SJonathan Corbet		none
120704950071SJonathan Corbet
120804950071SJonathan Corbet
120904950071SJonathan Corbet	outputs:
121004950071SJonathan Corbet		The next writable block.
121104950071SJonathan Corbet
121204950071SJonathan Corbet
121304950071SJonathan Corbet	notes:
121404950071SJonathan Corbet		If the device does not support this ioctl directly, the
121504950071SJonathan Corbet
121604950071SJonathan Corbet	  ioctl will return CDROM_LAST_WRITTEN + 7.
121704950071SJonathan Corbet
121804950071SJonathan Corbet
121904950071SJonathan Corbet
122004950071SJonathan CorbetCDROM_LAST_WRITTEN
122104950071SJonathan Corbet	get last block written on disc
122204950071SJonathan Corbet
122304950071SJonathan Corbet
122404950071SJonathan Corbet	usage::
122504950071SJonathan Corbet
122604950071SJonathan Corbet	  long last;
122704950071SJonathan Corbet
122804950071SJonathan Corbet	  ioctl(fd, CDROM_LAST_WRITTEN, &last);
122904950071SJonathan Corbet
123004950071SJonathan Corbet	inputs:
123104950071SJonathan Corbet		none
123204950071SJonathan Corbet
123304950071SJonathan Corbet
123404950071SJonathan Corbet	outputs:
123504950071SJonathan Corbet		The last block written on disc
123604950071SJonathan Corbet
123704950071SJonathan Corbet
123804950071SJonathan Corbet	notes:
123904950071SJonathan Corbet		If the device does not support this ioctl directly, the
124004950071SJonathan Corbet		result is derived from the disc's table of contents.  If the
124104950071SJonathan Corbet		table of contents can't be read, this ioctl returns an
124204950071SJonathan Corbet		error.
1243