IDE-CD driver documentation
Originally by scott snyder  <snyder@fnald0.fnal.gov> (19 May 1996)
Carrying on the torch is: Erik Andersen <andersee@debian.org>
New maintainers (19 Oct 1998): Jens Axboe <axboe@image.dk>

1. Introduction
---------------

The ide-cd driver should work with all ATAPI ver 1.2 to ATAPI 2.6 compliant 
CDROM drives which attach to an IDE interface.  Note that some CDROM vendors
(including Mitsumi, Sony, Creative, Aztech, and Goldstar) have made
both ATAPI-compliant drives and drives which use a proprietary
interface.  If your drive uses one of those proprietary interfaces,
this driver will not work with it (but one of the other CDROM drivers
probably will).  This driver will not work with `ATAPI' drives which
attach to the parallel port.  In addition, there is at least one drive
(CyCDROM CR520ie) which attaches to the IDE port but is not ATAPI;
this driver will not work with drives like that either (but see the
aztcd driver).

This driver provides the following features:

 - Reading from data tracks, and mounting ISO 9660 filesystems.

 - Playing audio tracks.  Most of the CDROM player programs floating
   around should work; I usually use Workman.

 - Multisession support.

 - On drives which support it, reading digital audio data directly
   from audio tracks.  The program cdda2wav can be used for this.
   Note, however, that only some drives actually support this.

 - There is now support for CDROM changers which comply with the 
   ATAPI 2.6 draft standard (such as the NEC CDR-251).  This additional
   functionality includes a function call to query which slot is the
   currently selected slot, a function call to query which slots contain
   CDs, etc. A sample program which demonstrates this functionality is
   appended to the end of this file.  The Sanyo 3-disc changer
   (which does not conform to the standard) is also now supported.
   Please note the driver refers to the first CD as slot # 0.


2. Installation
---------------

0. The ide-cd relies on the ide disk driver.  See
   Documentation/ide/ide.txt for up-to-date information on the ide
   driver.

1. Make sure that the ide and ide-cd drivers are compiled into the
   kernel you're using.  When configuring the kernel, in the section 
   entitled "Floppy, IDE, and other block devices", say either `Y' 
   (which will compile the support directly into the kernel) or `M'
   (to compile support as a module which can be loaded and unloaded)
   to the options: 

      Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
      Include IDE/ATAPI CDROM support

   and `no' to

      Use old disk-only driver on primary interface

   Depending on what type of IDE interface you have, you may need to
   specify additional configuration options.  See
   Documentation/ide/ide.txt.

2. You should also ensure that the iso9660 filesystem is either
   compiled into the kernel or available as a loadable module.  You
   can see if a filesystem is known to the kernel by catting
   /proc/filesystems.

3. The CDROM drive should be connected to the host on an IDE
   interface.  Each interface on a system is defined by an I/O port
   address and an IRQ number, the standard assignments being
   0x1f0 and 14 for the primary interface and 0x170 and 15 for the
   secondary interface.  Each interface can control up to two devices,
   where each device can be a hard drive, a CDROM drive, a floppy drive, 
   or a tape drive.  The two devices on an interface are called `master'
   and `slave'; this is usually selectable via a jumper on the drive.

   Linux names these devices as follows.  The master and slave devices
   on the primary IDE interface are called `hda' and `hdb',
   respectively.  The drives on the secondary interface are called
   `hdc' and `hdd'.  (Interfaces at other locations get other letters
   in the third position; see Documentation/ide/ide.txt.)

   If you want your CDROM drive to be found automatically by the
   driver, you should make sure your IDE interface uses either the
   primary or secondary addresses mentioned above.  In addition, if
   the CDROM drive is the only device on the IDE interface, it should
   be jumpered as `master'.  (If for some reason you cannot configure
   your system in this manner, you can probably still use the driver.
   You may have to pass extra configuration information to the kernel
   when you boot, however.  See Documentation/ide/ide.txt for more
   information.)

4. Boot the system.  If the drive is recognized, you should see a
   message which looks like

     hdb: NEC CD-ROM DRIVE:260, ATAPI CDROM drive

   If you do not see this, see section 5 below.

5. You may want to create a symbolic link /dev/cdrom pointing to the
   actual device.  You can do this with the command

     ln -s  /dev/hdX  /dev/cdrom

   where X should be replaced by the letter indicating where your
   drive is installed.

6. You should be able to see any error messages from the driver with
   the `dmesg' command.


3. Basic usage
--------------

An ISO 9660 CDROM can be mounted by putting the disc in the drive and 
typing (as root)

  mount -t iso9660 /dev/cdrom /mnt/cdrom

where it is assumed that /dev/cdrom is a link pointing to the actual
device (as described in step 5 of the last section) and /mnt/cdrom is
an empty directory.  You should now be able to see the contents of the
CDROM under the /mnt/cdrom directory.  If you want to eject the CDROM,
you must first dismount it with a command like

  umount /mnt/cdrom

Note that audio CDs cannot be mounted.

Some distributions set up /etc/fstab to always try to mount a CDROM
filesystem on bootup.  It is not required to mount the CDROM in this
manner, though, and it may be a nuisance if you change CDROMs often.
You should feel free to remove the cdrom line from /etc/fstab and
mount CDROMs manually if that suits you better.

Multisession and photocd discs should work with no special handling.
The hpcdtoppm package (ftp.gwdg.de:/pub/linux/hpcdtoppm/) may be
useful for reading photocds.

To play an audio CD, you should first unmount and remove any data
CDROM.  Any of the CDROM player programs should then work (workman,
workbone, cdplayer, etc.).  Lacking anything else, you could use the
cdtester program in Documentation/cdrom/sbpcd.

On a few drives, you can read digital audio directly using a program
such as cdda2wav.  The only types of drive which I've heard support
this are Sony and Toshiba drives.  You will get errors if you try to
use this function on a drive which does not support it.

For supported changers, you can use the `cdchange' program (appended to
the end of this file) to switch between changer slots.  Note that the
drive should be unmounted before attempting this.  The program takes
two arguments:  the CDROM device, and the slot number to which you wish
to change.  If the slot number is -1, the drive is unloaded.


4. Compilation options
----------------------

There are a few additional options which can be set when compiling the
driver.  Most people should not need to mess with any of these; they
are listed here simply for completeness.  A compilation option can be
enabled by adding a line of the form `#define <option> 1' to the top
of ide-cd.c.  All these options are disabled by default.

VERBOSE_IDE_CD_ERRORS
  If this is set, ATAPI error codes will be translated into textual
  descriptions.  In addition, a dump is made of the command which
  provoked the error.  This is off by default to save the memory used
  by the (somewhat long) table of error descriptions.  

STANDARD_ATAPI
  If this is set, the code needed to deal with certain drives which do
  not properly implement the ATAPI spec will be disabled.  If you know
  your drive implements ATAPI properly, you can turn this on to get a
  slightly smaller kernel.

NO_DOOR_LOCKING
  If this is set, the driver will never attempt to lock the door of
  the drive.

CDROM_NBLOCKS_BUFFER
  This sets the size of the buffer to be used for a CDROMREADAUDIO
  ioctl.  The default is 8.

TEST
  This currently enables an additional ioctl which enables a user-mode
  program to execute an arbitrary packet command.  See the source for
  details.  This should be left off unless you know what you're doing.


5. Common problems
------------------

This section discusses some common problems encountered when trying to
use the driver, and some possible solutions.  Note that if you are
experiencing problems, you should probably also review
Documentation/ide/ide.txt for current information about the underlying
IDE support code.  Some of these items apply only to earlier versions
of the driver, but are mentioned here for completeness.

In most cases, you should probably check with `dmesg' for any errors
from the driver.

a. Drive is not detected during booting.

   - Review the configuration instructions above and in
     Documentation/ide/ide.txt, and check how your hardware is
     configured.

   - If your drive is the only device on an IDE interface, it should
     be jumpered as master, if at all possible.

   - If your IDE interface is not at the standard addresses of 0x170
     or 0x1f0, you'll need to explicitly inform the driver using a
     lilo option.  See Documentation/ide/ide.txt.  (This feature was
     added around kernel version 1.3.30.)

   - If the autoprobing is not finding your drive, you can tell the
     driver to assume that one exists by using a lilo option of the
     form `hdX=cdrom', where X is the drive letter corresponding to
     where your drive is installed.  Note that if you do this and you 
     see a boot message like

       hdX: ATAPI cdrom (?)

     this does _not_ mean that the driver has successfully detected
     the drive; rather, it means that the driver has not detected a
     drive, but is assuming there's one there anyway because you told
     it so.  If you actually try to do I/O to a drive defined at a
     nonexistent or nonresponding I/O address, you'll probably get
     errors with a status value of 0xff.

   - Some IDE adapters require a nonstandard initialization sequence
     before they'll function properly.  (If this is the case, there
     will often be a separate MS-DOS driver just for the controller.)
     IDE interfaces on sound cards often fall into this category.

     Support for some interfaces needing extra initialization is
     provided in later 1.3.x kernels.  You may need to turn on
     additional kernel configuration options to get them to work;
     see Documentation/ide/ide.txt.

     Even if support is not available for your interface, you may be
     able to get it to work with the following procedure.  First boot
     MS-DOS and load the appropriate drivers.  Then warm-boot linux
     (i.e., without powering off).  If this works, it can be automated
     by running loadlin from the MS-DOS autoexec.


b. Timeout/IRQ errors.

  - If you always get timeout errors, interrupts from the drive are
    probably not making it to the host.

  - IRQ problems may also be indicated by the message
    `IRQ probe failed (<n>)' while booting.  If <n> is zero, that
    means that the system did not see an interrupt from the drive when
    it was expecting one (on any feasible IRQ).  If <n> is negative,
    that means the system saw interrupts on multiple IRQ lines, when
    it was expecting to receive just one from the CDROM drive.

  - Double-check your hardware configuration to make sure that the IRQ
    number of your IDE interface matches what the driver expects.
    (The usual assignments are 14 for the primary (0x1f0) interface
    and 15 for the secondary (0x170) interface.)  Also be sure that
    you don't have some other hardware which might be conflicting with
    the IRQ you're using.  Also check the BIOS setup for your system;
    some have the ability to disable individual IRQ levels, and I've
    had one report of a system which was shipped with IRQ 15 disabled
    by default.

  - Note that many MS-DOS CDROM drivers will still function even if
    there are hardware problems with the interrupt setup; they
    apparently don't use interrupts.

  - If you own a Pioneer DR-A24X, you _will_ get nasty error messages 
    on boot such as "irq timeout: status=0x50 { DriveReady SeekComplete }"
    The Pioneer DR-A24X CDROM drives are fairly popular these days.
    Unfortunately, these drives seem to become very confused when we perform
    the standard Linux ATA disk drive probe. If you own one of these drives,
    you can bypass the ATA probing which confuses these CDROM drives, by 
    adding `append="hdX=noprobe hdX=cdrom"' to your lilo.conf file and running 
    lilo (again where X is the drive letter corresponding to where your drive 
    is installed.)
    
c. System hangups.

  - If the system locks up when you try to access the CDROM, the most
    likely cause is that you have a buggy IDE adapter which doesn't
    properly handle simultaneous transactions on multiple interfaces.
    The most notorious of these is the CMD640B chip.  This problem can
    be worked around by specifying the `serialize' option when
    booting.  Recent kernels should be able to detect the need for
    this automatically in most cases, but the detection is not
    foolproof.  See Documentation/ide/ide.txt for more information
    about the `serialize' option and the CMD640B.

  - Note that many MS-DOS CDROM drivers will work with such buggy
    hardware, apparently because they never attempt to overlap CDROM
    operations with other disk activity.


d. Can't mount a CDROM.

  - If you get errors from mount, it may help to check `dmesg' to see
    if there are any more specific errors from the driver or from the
    filesystem.

  - Make sure there's a CDROM loaded in the drive, and that's it's an
    ISO 9660 disc.  You can't mount an audio CD.

  - With the CDROM in the drive and unmounted, try something like

      cat /dev/cdrom | od | more

    If you see a dump, then the drive and driver are probably working
    OK, and the problem is at the filesystem level (i.e., the CDROM is
    not ISO 9660 or has errors in the filesystem structure).

  - If you see `not a block device' errors, check that the definitions
    of the device special files are correct.  They should be as
    follows:

      brw-rw----   1 root     disk       3,   0 Nov 11 18:48 /dev/hda
      brw-rw----   1 root     disk       3,  64 Nov 11 18:48 /dev/hdb
      brw-rw----   1 root     disk      22,   0 Nov 11 18:48 /dev/hdc
      brw-rw----   1 root     disk      22,  64 Nov 11 18:48 /dev/hdd

    Some early Slackware releases had these defined incorrectly.  If
    these are wrong, you can remake them by running the script
    scripts/MAKEDEV.ide.  (You may have to make it executable
    with chmod first.)

    If you have a /dev/cdrom symbolic link, check that it is pointing
    to the correct device file.

    If you hear people talking of the devices `hd1a' and `hd1b', these
    were old names for what are now called hdc and hdd.  Those names
    should be considered obsolete.

  - If mount is complaining that the iso9660 filesystem is not
    available, but you know it is (check /proc/filesystems), you
    probably need a newer version of mount.  Early versions would not
    always give meaningful error messages.


e. Directory listings are unpredictably truncated, and `dmesg' shows
   `buffer botch' error messages from the driver.

  - There was a bug in the version of the driver in 1.2.x kernels
    which could cause this.  It was fixed in 1.3.0.  If you can't
    upgrade, you can probably work around the problem by specifying a
    blocksize of 2048 when mounting.  (Note that you won't be able to
    directly execute binaries off the CDROM in that case.)

    If you see this in kernels later than 1.3.0, please report it as a
    bug.


f. Data corruption.

  - Random data corruption was occasionally observed with the Hitachi
    CDR-7730 CDROM. If you experience data corruption, using "hdx=slow"
    as a command line parameter may work around the problem, at the
    expense of low system performance.


6. cdchange.c
-------------

/*
 * cdchange.c  [-v]  <device>  [<slot>]
 *
 * This loads a CDROM from a specified slot in a changer, and displays 
 * information about the changer status.  The drive should be unmounted before 
 * using this program.
 *
 * Changer information is displayed if either the -v flag is specified
 * or no slot was specified.
 *
 * Based on code originally from Gerhard Zuber <zuber@berlin.snafu.de>.
 * Changer status information, and rewrite for the new Uniform CDROM driver
 * interface by Erik Andersen <andersee@debian.org>.
 */

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/cdrom.h>


int
main (int argc, char **argv)
{
	char *program;
	char *device;
	int fd;           /* file descriptor for CD-ROM device */
	int status;       /* return status for system calls */
	int verbose = 0;
	int slot=-1, x_slot;
	int total_slots_available;

	program = argv[0];

	++argv;
	--argc;

	if (argc < 1 || argc > 3) {
		fprintf (stderr, "usage: %s [-v] <device> [<slot>]\n",
			 program);
		fprintf (stderr, "       Slots are numbered 1 -- n.\n");
		exit (1);
	}
 
       if (strcmp (argv[0], "-v") == 0) {
                verbose = 1;
                ++argv;
                --argc;
        }
 
	device = argv[0];
 
	if (argc == 2)
		slot = atoi (argv[1]) - 1;

	/* open device */ 
	fd = open(device, O_RDONLY | O_NONBLOCK);
	if (fd < 0) {
		fprintf (stderr, "%s: open failed for `%s': %s\n",
			 program, device, strerror (errno));
		exit (1);
	}

	/* Check CD player status */ 
	total_slots_available = ioctl (fd, CDROM_CHANGER_NSLOTS);
	if (total_slots_available <= 1 ) {
		fprintf (stderr, "%s: Device `%s' is not an ATAPI "
			"compliant CD changer.\n", program, device);
		exit (1);
	}

	if (slot >= 0) {
		if (slot >= total_slots_available) {
			fprintf (stderr, "Bad slot number.  "
				 "Should be 1 -- %d.\n",
				 total_slots_available);
			exit (1);
		}

		/* load */ 
		slot=ioctl (fd, CDROM_SELECT_DISC, slot);
		if (slot<0) {
			fflush(stdout);
				perror ("CDROM_SELECT_DISC ");
			exit(1);
		}
	}

	if (slot < 0 || verbose) {

		status=ioctl (fd, CDROM_SELECT_DISC, CDSL_CURRENT);
		if (status<0) {
			fflush(stdout);
			perror (" CDROM_SELECT_DISC");
			exit(1);
		}
		slot=status;

		printf ("Current slot: %d\n", slot+1);
		printf ("Total slots available: %d\n",
			total_slots_available);

		printf ("Drive status: ");
                status = ioctl (fd, CDROM_DRIVE_STATUS, CDSL_CURRENT);
                if (status<0) {
                  perror(" CDROM_DRIVE_STATUS");
                } else switch(status) {
		case CDS_DISC_OK:
			printf ("Ready.\n");
			break;
		case CDS_TRAY_OPEN:
			printf ("Tray Open.\n");
			break;
		case CDS_DRIVE_NOT_READY:
			printf ("Drive Not Ready.\n");
			break;
		default:
			printf ("This Should not happen!\n");
			break;
		}

		for (x_slot=0; x_slot<total_slots_available; x_slot++) {
			printf ("Slot %2d: ", x_slot+1);
             		status = ioctl (fd, CDROM_DRIVE_STATUS, x_slot);
             		if (status<0) {
             		     perror(" CDROM_DRIVE_STATUS");
             		} else switch(status) {
			case CDS_DISC_OK:
				printf ("Disc present.");
				break;
			case CDS_NO_DISC: 
				printf ("Empty slot.");
				break;
			case CDS_TRAY_OPEN:
				printf ("CD-ROM tray open.\n");
				break;
			case CDS_DRIVE_NOT_READY:
				printf ("CD-ROM drive not ready.\n");
				break;
			case CDS_NO_INFO:
				printf ("No Information available.");
				break;
			default:
				printf ("This Should not happen!\n");
				break;
			}
		  if (slot == x_slot) {
                  status = ioctl (fd, CDROM_DISC_STATUS);
                  if (status<0) {
			perror(" CDROM_DISC_STATUS");
                  }
		  switch (status) {
			case CDS_AUDIO:
				printf ("\tAudio disc.\t");
				break;
			case CDS_DATA_1:
			case CDS_DATA_2:
				printf ("\tData disc type %d.\t", status-CDS_DATA_1+1);
				break;
			case CDS_XA_2_1:
			case CDS_XA_2_2:
				printf ("\tXA data disc type %d.\t", status-CDS_XA_2_1+1);
				break;
			default:
				printf ("\tUnknown disc type 0x%x!\t", status);
				break;
			}
			}
                  	status = ioctl (fd, CDROM_MEDIA_CHANGED, x_slot);
                  	if (status<0) {
				perror(" CDROM_MEDIA_CHANGED");
                  	}
		  	switch (status) {
			case 1:
				printf ("Changed.\n");
				break;
			default:
				printf ("\n");
				break;
			}
		}
	}

	/* close device */
	status = close (fd);
	if (status != 0) {
		fprintf (stderr, "%s: close failed for `%s': %s\n",
			 program, device, strerror (errno));
		exit (1);
	}
 
	exit (0);
}
