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.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.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.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.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.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.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.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.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.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);
}
