Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / Documentation / ioctl / cdrom.txt
diff --git a/kernel/Documentation/ioctl/cdrom.txt b/kernel/Documentation/ioctl/cdrom.txt
new file mode 100644 (file)
index 0000000..59df81c
--- /dev/null
@@ -0,0 +1,966 @@
+               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 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.