patch-2.1.70 linux/Documentation/cdrom/cdrom-standard.tex

Next file: linux/Documentation/cdrom/cm206
Previous file: linux/Documentation/cdrom/aztcd
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.69/linux/Documentation/cdrom/cdrom-standard.tex linux/Documentation/cdrom/cdrom-standard.tex
@@ -1,5 +1,6 @@
 \documentclass{article}
-\def\version{$Id: cdrom-standard.tex,v 1.6 1996/12/29 20:45:18 davem Exp $}
+\def\version{$Id: cdrom-standard.tex,v 1.8 1997/11/19 21:58:33 david Exp $}
+\newcommand{\newsection}[1]{\newpage\section{#1}}
 
 \evensidemargin=0pt
 \oddsidemargin=0pt
@@ -7,11 +8,13 @@
 \textwidth=15.99cm \textheight=24.62cm % normal A4, 1'' margin
 
 \def\linux{{\sc Linux}}
-\def\cdrom{{\sc CDrom}}
-\def\cdromc{{\tt cdrom.c}}
-\def\cdromh{{\tt cdrom.h}}
-\def\ucdrom{{\tt ucdrom.h}}
-\def\fo{\sl}
+\def\cdrom{{\sc cd-rom}}
+\def\UCD{{\sc Uniform cd-rom Driver}}
+\def\cdromc{{\tt {cdrom.c}}}
+\def\cdromh{{\tt {cdrom.h}}}
+\def\fo{\sl}                    % foreign words
+\def\ie{{\fo i.e.}}
+\def\eg{{\fo e.g.}}
 
 \everymath{\it} \everydisplay{\it}
 \catcode `\_=\active \def_{\_\penalty100 }
@@ -19,151 +22,144 @@
 
 \begin{document}
 \title{A \linux\ \cdrom\ standard}
-\author{David van Leeuwen\\{\normalsize\tt david@tm.tno.nl}}
+\author{David van Leeuwen\\{\normalsize\tt david@ElseWare.cistron.nl}
+\\{\footnotesize updated by Erik Andersen {\tt(andersee@debian.org)}}}
+\date{19 November 1997}
 
 \maketitle
 
-\section{Introduction}
+\newsection{Introduction}
 
-\linux\ is probably the Unix-like operating system that supports the widest
-variety of hardware devices. The reasons for this are presumably
-\begin{itemize}
-\item The large list of different hardware devices available for the popular
-IBM PC-architecture,
-\item The open design of the operating system, such that everybody can
-write a driver for Linux (source code examples).
+\linux\ is probably the Unix-like operating system that supports
+the widest variety of hardware devices. The reasons for this are
+presumably 
+\begin{itemize} 
+\item 
+  The large list of hardware devices available for the many platforms
+  that \linux\ now supports (\ie, i386-PCs, Sparc Suns, etc.)
+\item 
+  The open design of the operating system, such that anybody can write a
+  driver for \linux.
+\item 
+  There is plenty of source code around as examples of how to write a driver.
 \end{itemize}
-The vast choice and openness has lead not only to a wide support of
-hardware devices, but also to a certain divergence in behavior.
-Especially for \cdrom\ devices, the way a particular drive reacts to a
-`standard' $ioctl()$ call varies a lot from one brand to another;
-however, the \linux\ \cdrom\ driver writers kept away from wilderness
-by the practice of evolving a new driver by copying, understanding and
-changing an existing one.
-
-Since the beginning of the \cdrom, many different interfaces
-developed.  Some of them had their own proprietary design (Sony,
-Mitsumi, Panasonic, Philips), other manufacturers adopted an existing
-electrical interface and changed the functionality
-(CreativeLabs/SoundBlaster, Teac, Funai) or simply adapted their
-drives to one or more of the already existing electrical interfaces
-(Aztech, Sanyo, Funai, Vertos, Longshine, Optics Storage and most of
-the `NoName' manufacturers).  In cases where a new drive really
-brought his own interface or used his own command set and flow control
+The openness of \linux, and the many different types of available
+hardware has allowed \linux\ to support many different hardware devices.
+Unfortunatly, the very openness that has allowed \linux\ to support
+all these different devices has also allowed the behavior of each
+device driver to differ significantly from one device to another.
+This divergence of behavior has been the very significant for \cdrom\
+devices; the way a particular drive reacts to a `standard' $ioctl()$
+call varies greatly from one device driver to another. To avoid making
+their drivers totally inconsistent, the writers of \linux\ \cdrom\
+drivers generally created new device drivers by understanding, copying,
+and then changing an existing one. Unfortunatly, this practice did not
+maintain uniform behavior across all the \linux\ \cdrom\ drivers. 
+
+This document describes an effort to establish Uniform behavior across
+all the different \cdrom\ device drivers for \linux. This document also
+defines the various $ioctl$s, and how the low-level \cdrom\ device
+drivers should implement them. Currently (as of the \linux\ 2.1.$x$
+development kernels) several low-level \cdrom\ device drivers, including
+both IDE/ATAPI and SCSI, now use this Uniform interface.
+
+When the \cdrom\ was developed, the interface between the \cdrom\ drive
+and the computer was not specified in the standards. As a result, many
+different \cdrom\ interfaces were developed. Some of them had their
+own proprietary design (Sony, Mitsumi, Panasonic, Philips), other
+manufacturers adopted an existing electrical interface and changed
+the functionality (CreativeLabs/SoundBlaster, Teac, Funai) or simply
+adapted their drives to one or more of the already existing electrical
+interfaces (Aztech, Sanyo, Funai, Vertos, Longshine, Optics Storage and
+most of the `NoName' manufacturers). In cases where a new drive really
+brought its own interface or used its own command set and flow control
 scheme, either a separate driver had to be written, or an existing
-driver had to get enhanced.
-
-Nowadays, almost all new \cdrom\ types are either ATAPI/IDE or SCSI;
-it is very unlikely that any manufacturer still will create a new
-interface, and new drives for the existing proprietary interfaces are
-getting rare.  But history has delivered us \cdrom\ support for many
-different interfaces.
-
-When (in the 1.3.70's) I looked at the existing interface which is
-expressed through \cdromh\ it appeared to be a rather wild set of
-commands and data formats.\footnote{I cannot recollect what kernel
-  version I looked at, then, presumably 1.2.13 and 1.3.34---the latest
-  kernel that I was indirectly involved in.} It seemed that many
-features of the interface have been added to include certain specific
-capabilities of certain drives, in an {\fo ad hoc\/} manner. More
-importantly, it appeared that actual execution of the commands is
-different for most of the different drivers: e.g., some drivers close
-the tray if an $open()$ call occurs while the tray is unloaded, while
+driver had to be enhanced. History has delivered us \cdrom\ support for
+many of these different interfaces. Nowadays, almost all new \cdrom\
+drives are either IDE/ATAPI or SCSI, and it is very unlikely that any
+manufacturer will create a new interface. Even finding drives for the
+old proprietary interfaces is getting difficult.
+
+When (in the 1.3.70's) I looked at the existing software interface,
+which was expressed through \cdromh, it appeared to be a rather wild
+set of commands and data formats.\footnote{I cannot recollect what
+kernel version I looked at, then, presumably 1.2.13 and 1.3.34---the
+latest kernel that I was indirectly involved in.} It seemed that many
+features of the software interface had been added to accomodate the
+capabilities of a particular drive, in an {\fo ad hoc\/} manner. More
+importantly, it appeared that the behavior of the `standard' commands
+was different for most of the different drivers: \eg, some drivers
+close the tray if an $open()$ call occurs when the tray is open, while
 others do not. Some drivers lock the door upon opening the device, to
 prevent an incoherent file system, but others don't, to allow software
-ejection.  Undoubtedly, the capabilities of the different drives vary,
-but even when two drives have the same capability the driver behavior
-may be different.
-
-I decided to start a discussion on how to improve uniformity,
-addressing all \cdrom-driver developers found in the various driver
-files. The reactions encouraged me to write a uniform (compatible)
-software level \cdromc\ to which this document is the documentation.
-In the mean time, the data structure definitions in \cdromh\ had been
-cleaned up a lot---which was very helpful for the new code.
- 
-\begin{quote}
-\small
-[Apparently, not all \cdrom\ developers support this initiative.
-They---mainly those who used the already existing drivers not only as
-a coding example, but also as a `user interface' reference during
-their own development---have taken care that \cdromh\ reflects a
-software interface to `user programs' which is unique between all
-drivers as much as possible; these driver writers will continue to
-refine the existing \cdromh\ where it seems necessary, and they tend
-to look if any newly requested functionality isn't already there
-before they are ready to define new structures. The {\tt sbpcd} driver
-gives an example that it is possible to let a robot arm play juke
-box---either with audio or with data CDs---and that it is possible to
-let the juke box work on even if a disk has fallen upon the floor and
-the drive door has closed without having a disk inside; without any
-new software layer or any structures which are not already present in
-\cdromh.  This `other' group of \linux\ \cdrom\ driver writers
-explicitly does {\em not\/} support the idea to define an additional
-software layer between driver and user program.]\parfillskip=0pt
-\end{quote}
-
-The effort (\cdromc) of which this is the documentation is {\em not\/}
-meant to drive a wedge between two groups of driver developers, but
-rather to enable sharing of `strategic code' among drivers. The code
-should {\em not\/} be viewed as a new interface to user-level
-programs, but rather as a new interface between driver code and
-kernel. 
-
-Care is taken that 100\,\% compatibility exists with the data
-structures and programmer's interface defined in \cdromh, and in order
-not to interfere with ongoing development in \cdromh, any `new' data
-structures have been put in a separate header file called \ucdrom.
-Because the data structures of \cdromh\ are fully supported, this
-documentation may also be of help to the programmers using the
-interface defined in \cdromh, but this guide is primarily written to
-help \cdrom\ driver developers adapt their code to use the `common
-\cdrom' code in \cdromc.
-
-Personally, I think that the most important hardware interfaces will
-be the IDE/ATAPI drives and of course the SCSI drives, but as prices
-of hardware drop continuously, it is not unlikely that people will
-have more than one \cdrom\ drive, possibly of mixed types. It is
-important that these drives behave in the same way. (In December 1994,
-one of the cheapest \cdrom\ drives was a Philips cm206, a double-speed
-proprietary drive. In the months that I was busy writing a \linux\ 
-driver for it, proprietary drives became old-fashioned and IDE/ATAPI
-drives became standard. At the time of writing (December 1996) the
-cheapest drive is quadruple speed IDE and at less than half the price
-of its predecessor. Twelve speed drives are available now.)
-
-This document defines the various $ioctl$s, and the way the drivers
-should implement this. Currently (in the kernel 2.1.$n$ development
-line) three low-level \cdrom\ drivers use this interface, among
-which are the most important drivers for IDE and SCSI. 
+ejection. Undoubtedly, the capabilities of the different drives vary,
+but even when two drives have the same capability their driver's
+behavior was usually different.
+
+I decided to start a discussion on how to make all the \linux\ \cdrom\
+drivers behave more uniformly. I began by contacting the developers of
+the many \cdrom\ drivers found in the \linux\ kernel. Their reactions
+encouraged me to write the \UCD\ which this document is intended to
+describe. The implementation of the \UCD\ is in the file \cdromc. This
+driver is intended to be an additional software layer that sits on top
+of the low-level device drivers for each \cdrom\ drive. By adding this
+additional layer, it is possible to have all the different \cdrom\
+devices behave {\em exactly\/} the same (insofar as the underlying
+hardware will allow).
+
+The goal of the \UCD\ is {\em not\/} to alienate driver developers who
+have not yet taken steps to support this effort. The goal of \UCD\ is
+simply is give people writing application programs for \cdrom\ drives
+{\em one\/} \linux\ \cdrom\ interface with consistent behavior for all
+\cdrom\ devices. In addition, this also provides a consistent interface
+between the low-level device driver code and the \linux\ kernel. Care
+is taken that 100\,\% compatibility exists with the data structures and
+programmer's interface defined in \cdromh. This guide was written to
+help \cdrom\ driver developers adapt their code to use the \UCD\ code
+defined in \cdromc.
+
+Personally, I think that the most important hardware interfaces are
+the IDE/ATAPI drives and, of course, the SCSI drives, but as prices
+of hardware drop continuously, it is also likely that people may have
+more than one \cdrom\ drive, possibly of mixed types. It is important
+that these drives behave in the same way. In December 1994, one of the
+cheapest \cdrom\ drives was a Philips cm206, a double-speed proprietary
+drive. In the months that I was busy writing a \linux\ driver for it,
+proprietary drives became obsolete and IDE/ATAPI drives became the
+standard. At the time of the last update to this document (November
+1997) it is becoming difficult to even {\em find} anything less than a
+16 speed \cdrom\ drive, and 24 speed drives are common.
 
-\section{Standardizing through another software level}
+\newsection{Standardizing through another software level}
 \label{cdrom.c}
 
-At the time this document was conceived, all drivers directly implement
-the $ioctl()$ calls through their own routines, with the danger of
-forgetting calls to $verify_area()$ and the risk of divergence in
-implementation. 
-
-For this reason, we\footnote{The writing style is such that `we' is
-used when (at least part of) the \cdrom-device driver authors support
-the idea, an `I' is used for personal opinions} propose to define
-another software-level, that separates the $ioctl()$ and $open()$
-implementation from the actual hardware implementation. Note that we
-do not wish to alter the existing application interface defined in
-\cdromh, but rather want to re-root the hardware-implementation through
-some common code. 
-
-We believe that \cdrom\ drives are specific enough (i.e., different
-from other block-devices such as floppy or hard disc drives), to
-define a set of {\em \cdrom\ device operations},
-$<cdrom-device>_dops$. These are of a different nature than the
-classical block-device file operations $<block-device>_fops$.
-
-The extra interfacing level routines are implemented in a file
-\cdromc, and a low-level \cdrom\ driver hands over the interfacing to
-the kernel by registering the following general $struct\ 
-file_operations$:
+At the time this document was conceived, all drivers directly
+implemented the \cdrom\ $ioctl()$ calls through their own routines. This
+led to the danger of different drivers forgetting to do important things
+like checking that the user was giving the driver valid data. More
+importantly, this led to the divergence of behavior, which has already
+been discussed.
+
+For this reason, the \UCD\ was created to enforce consistent \cdrom\
+drive behavior, and to provide a common set of services to the various
+low-level \cdrom\ device drivers. The \UCD\ now provides another
+software-level, that separates the $ioctl()$ and $open()$ implementation
+from the actual hardware implementation. Note that this effort has
+made few changes which will effect a user's application programs. The
+greatest change involved moving the contents of the various low-level
+\cdrom\ driver's header files to the kernel's cdrom directory. This was
+done to help ensure that the user is only presented with only one cdrom
+interface, the interface defined in \cdromh.
+
+\cdrom\ drives are specific enough (\ie, different from other
+block-devices such as floppy or hard disc drives), to define a set
+of common {\em \cdrom\ device operations}, $<cdrom-device>_dops$.
+These operations are different than the classical block-device file
+operations, $<block-device>_fops$.
+
+The routines for the \UCD\ interface level are implemented in the file
+\cdromc. In this file, the \UCD\ interfaces with the kernel as a block
+device by registering the following general $struct\ file_operations$:
 $$
 \halign{$#$\ \hfil&$#$\ \hfil&$/*$ \rm# $*/$\hfil\cr
 struct& file_operations\ cdrom_fops = \{\hidewidth\cr
@@ -182,49 +178,54 @@
         &NULL                   & revalidate \cr
 \};\cr
 }
-$$
-Every active \cdrom\ device shares this $struct$. The routines declared
-above are all implemented in \cdromc, and this is the place where the
-{\em behavior\/} of all \cdrom-devices is defined, and hence
-standardized. The implementation of the interfacing to the various
-types of hardware still is done by the various \cdrom-device drivers,
-but these routines only implement certain {\em capabilities\/} that
-are typical to \cdrom\ (removable-media) devices.
-
-Registration of the \cdrom\ device driver should now be to the general
-routines in \cdromc, not to the VFS any more. The interfacing with
-\cdromc\ is implemented trough two general structures, that contain
-information about the capabilities of the driver, and the specific
-drives on which the driver operates. The structures are separated to
-contain information about
+$$ 
+
+Every active \cdrom\ device shares this $struct$. The routines
+declared above are all implemented in \cdromc, since this file is the
+place where the behavior of all \cdrom-devices is defined and
+standardized. The actual interface to the various types of \cdrom\ 
+hardware is still performed by various low-level \cdrom-device
+drivers. These routines simply implement certain {\em capabilities\/}
+that are common to all \cdrom\ (and really, all removable-media
+devices).
+
+Registration of a low-level \cdrom\ device driver is now done through
+the general routines in \cdromc, not through the Virtual File System
+(VFS) any more. The interface implemented in \cdromc\ is carried out
+through two general structures that contain information about the
+capabilities of the driver, and the specific drives on which the
+driver operates. The structures are:
 \begin{description}
-\item[the low-level driver] It lists the routines that actually
-  implement \cdrom\ operations, and hence the structure is called
-  $cdrom_device_ops$. The structure is conceptually connected to the
-  major number of the device (although some drivers may have have
-  different major numbers, as is the case for the IDE driver).
-\item[the specific drive] It lists the variables informative of the
-  drive that is driven, and hence the structure is called
-  $cdrom_device_info$. The structure is conceptually connected to the
-  minor number of the device.
+\item[$cdrom_device_ops$] 
+  This structure contains information about the low-level driver for a
+  \cdrom\ device. This structure is conceptually connected to the major
+  number of the device (although some drivers may have different
+  major numbers, as is the case for the IDE driver).
+\item[$cdrom_device_info$] 
+  This structure contains information about a particular \cdrom\ drive,
+  such as its device name, speed, etc. This structure is conceptually
+  connected to the minor number of the device.
 \end{description}
 
-The registration is done for each drive found by the driver (and hence
-for each minor number) though the call
-$$register_cdrom(struct\ cdrom_device_info * <device>_info, char * name)  
-$$
-This device information structure $<device>_info$ (described
-shortly) contains all information needed for the kernel to interface
-with the low-level \cdrom\ device driver. One of the main entries of
-this structure is a pointer to the $cdrom_device_ops$ structure of the
-driver.
-
-This device operations structure $cdrom_device_ops$ lists the
-implemented routines for interfacing to the hardware. [It is
-impossible to come up with a complete list of all capabilities of
-(future) \cdrom\ drives, as the developments in technology follow-up
-at an incredible rate. Maybe write-operation (WORM devices) will
-become very popular in the future.]  The list now is:
+Registering a particular \cdrom\ drive with the \UCD\ is done by the
+low-level device driver though a call to:
+$$register_cdrom(struct\ cdrom_device_info * <device>_info)  
+$$
+The device information structure, $<device>_info$, contains all the
+information needed for the kernel to interface with the low-level
+\cdrom\ device driver. One of the most important entries in this
+structure is a pointer to the $cdrom_device_ops$ structure of the
+low-level driver.
+
+The device operations structure, $cdrom_device_ops$, contains a list
+of pointers to the functions which are implemented in the low-level
+device driver. When \cdromc\ accesses a \cdrom\ device, it does it
+through the functions in this structure. It is impossible to know all
+the capabilities of future \cdrom\ drives, so it is expected that this
+list may need to be expanded from time to time as new technologies are
+developed. For example, CD-R and CD-R/W drives are beginning to become
+popular, and support will soon need to be added for them. For now, the
+current $struct$ is:
 $$
 \halign{$#$\ \hfil&$#$\ \hfil&\hbox to 10em{$#$\hss}&
   $/*$ \rm# $*/$\hfil\cr
@@ -232,7 +233,6 @@
   &int& (* open)(struct\ cdrom_device_info *, int)\cr
   &void& (* release)(struct\ cdrom_device_info *);\cr 
   &int& (* drive_status)(struct\ cdrom_device_info *);\cr     
-  &int& (* disc_status)(struct\ cdrom_device_info *);\cr      
   &int& (* media_changed)(struct\ cdrom_device_info *, int);\cr 
   &int& (* tray_move)(struct\ cdrom_device_info *, int);\cr
   &int& (* lock_door)(struct\ cdrom_device_info *, int);\cr
@@ -247,32 +247,35 @@
   &int& (* dev_ioctl)(struct\ cdrom_device_info *, unsigned\ int, 
         unsigned\ long);\cr
 \noalign{\medskip}
-  &\llap{const\ }int& capability;&  capability flags \cr
+  &const\ int& capability;& capability flags \cr
   &int& n_minors;& number of active minor devices \cr
+\};\cr
 }
 $$
-The \cdrom-driver should simply implement (some of) these
-functions, and register the functions to the global \cdrom\ driver,
-which performs interfacing with the Virtual File System and system
-$ioctl$s. The flags $capability$ specify the hardware-capabilities on
-registration of the device. The value $n_minors$ should be a positive
-value indicating the number of minor devices that are supported by the
-driver, normally~1. Although these two variables are `informative'
-rather than `operational,' they are included in $cdrom_device_ops$
-because they describe the capability of the {\em driver\/} rather than
-the {\em drive}. Nomenclature has always been difficult in computer
-programming. 
+When a low-level device driver implements one of these capabilities,
+it should add a function pointer to this $struct$. When a particular
+function is not implemented, however, this $struct$ should contain a
+NULL instead. The $capability$ flags specify the capabilities of the
+\cdrom\ hardware and/or low-level \cdrom\ driver when a \cdrom\ drive
+is registered with the \UCD. The value $n_minors$ should be a positive
+value indicating the number of minor devices that are supported by
+the low-level device driver, normally~1. Although these two variables
+are `informative' rather than `operational,' they are included in
+$cdrom_device_ops$ because they describe the capability of the {\em
+driver\/} rather than the {\em drive}. Nomenclature has always been
+difficult in computer programming.
 
 Note that most functions have fewer parameters than their
 $blkdev_fops$ counterparts. This is because very little of the
-information in the structures $inode$ and $file$ are used, the main
-parameter is the first, from which the major and minor number can be
-extracted. (Most low-level \cdrom\ drivers don't even look at that value
-as only one device is supported.) This will be available through $dev$
-in $cdrom_device_info$ described below. 
+information in the structures $inode$ and $file$ are used. For most
+drivers, the main parameter is the $struct$ $cdrom_device_info$, from
+which the major and minor number can be extracted. (Most low-level
+\cdrom\ drivers don't even look at the major and minor number though,
+since many of them only support one device.) This will be available
+through $dev$ in $cdrom_device_info$ described below.
 
-The drive-specific, minor-like information that is registered to
-\cdromc, contains the following fields:
+The drive-specific, minor-like information that is registered with
+\cdromc, currently contains the following fields:
 $$
 \halign{$#$\ \hfil&$#$\ \hfil&\hbox to 10em{$#$\hss}&
   $/*$ \rm# $*/$\hfil\cr
@@ -281,72 +284,71 @@
   & struct\ cdrom_device_info *& next;& next device_info for this major\cr
   & void *&  handle;& driver-dependent data\cr
 \noalign{\medskip}
-  & kdev_t&  dev;& device number (incorporates minor)/\cr
+  & kdev_t&  dev;& device number (incorporates minor)\cr
   & int& mask;& mask of capability: disables them \cr
-  &\llap{$const\ $}int& speed;&  maximum speed for reading data \cr
-  &\llap{$const\ $}int& n_discs;& number of discs in jukebox \cr
+  &const\ int& speed;& maximum speed for reading data \cr
+  &const\ int& capacity;& number of discs in a jukebox \cr
 \noalign{\medskip}
   &int& options : 30;& options flags \cr
   &long& mc_flags : 2;& media-change buffer flags \cr
   & int& use_count;& number of times devices is opened\cr
 \}\cr
 }$$
-
-With this $struct$, a linked list of minor devices registered with
-the same low-level driver is built, though the field $next$.  The
-device number, the device operations struct and specifications of
-properties of the drive are stored in this structure.
-
-The flags $mask$ can be used to mask out some of the capabilities
-listed in $ops\to capability$, if a specific drive doesn't support a
-feature of the driver. The value $speed$ specifies the maximum
-head-rate of the drive, measured in units of normal audio speed
-(176\,kB/sec raw data or 150\,kB/sec file system data).  The value
-$n_discs$ should reflect the number of discs the drive can hold
-simultaneously, if it is designed as a juke-box, or otherwise~1.
-The parameters are declared $const$ because they describe properties
-of the drive, which don't change after registration. 
+Using this $struct$, a linked list of the registered minor devices is
+built, using the $next$ field. The device number, the device operations
+struct and specifications of properties of the drive are stored in this
+structure.
+
+The $mask$ flags can be used to mask out some of the capabilities listed
+in $ops\to capability$, if a specific drive doesn't support a feature
+of the driver. The value $speed$ specifies the maximum head-rate of the
+drive, measured in units of normal audio speed (176\,kB/sec raw data or
+150\,kB/sec file system data). The value $n_discs$ should reflect the
+number of discs the drive can hold simultaneously, if it is designed
+as a juke-box, or otherwise~1. The parameters are declared $const$
+because they describe properties of the drive, which don't change after
+registration.
 
 A few registers contain variables local to the \cdrom\ drive. The
 flags $options$ are used to specify how the general \cdrom\ routines
 should behave. These various flags registers should provide enough
-flexibility to adapt to the different user's wishes (and {\em not\/}
-the `arbitrary' wishes of the author of the low-level device driver,
-as is the case in the old scheme). The register $mc_flags$ is used to
-buffer the information from $media_changed()$ to two separate queues.
-Other data that is specific to minor drive, can be accessed through
-$handle$, which can point to a data structure specific to the
-low-level driver. The fields $use_count$, $next$, $options$ and
-$mc_flags$ need not be initialized.
+flexibility to adapt to the different user's wishes (and {\em not\/} the
+`arbitrary' wishes of the author of the low-level device driver, as is
+the case in the old scheme). The register $mc_flags$ is used to buffer
+the information from $media_changed()$ to two separate queues. Other
+data that is specific to minor drive, can be accessed through $handle$,
+which can point to a data structure specific to the low-level driver.
+The fields $use_count$, $next$, $options$ and $mc_flags$ need not be
+initialized.
 
 The intermediate software layer that \cdromc\ forms will performs some
 additional bookkeeping. The use count of the device (the number of
-processes that have the device opened) is registered in $use_count$.
-The function $cdrom_ioctl()$ will verify the appropriate user-memory
-regions for read and write, and in case a location on the CD is
-transferred, it will `sanitize' the format by making requests to the
-low-level drivers in a standard format, and translating all formats
-between the user-software and low level drivers. This relieves much of
-the drivers memory checking and format checking and translation. Also,
-the necessary structures will be declared on the program stack.
+processes that have the device opened) is registered in $use_count$. The
+function $cdrom_ioctl()$ will verify the appropriate user-memory regions
+for read and write, and in case a location on the CD is transferred,
+it will `sanitize' the format by making requests to the low-level
+drivers in a standard format, and translating all formats between the
+user-software and low level drivers. This relieves much of the drivers
+memory checking and format checking and translation. Also, the necessary
+structures will be declared on the program stack.
 
 The implementation of the functions should be as defined in the
 following sections. Two functions {\em must\/} be implemented, namely
 $open()$ and $release()$. Other functions may be omitted, their
 corresponding capability flags will be cleared upon registration.
 Generally, a function returns zero on success and negative on error. A
-function call should return only after the command has completed, but
-of course waiting for the device should not use processor time.
+function call should return only after the command has completed, but of
+course waiting for the device should not use processor time.
 
-\subsection{$Open(struct\ cdrom_device_info * cdi, int\ purpose)$}
+\subsection{$Int\ open(struct\ cdrom_device_info * cdi, int\ purpose)$}
 
 $Open()$ should try to open the device for a specific $purpose$, which
 can be either:
 \begin{itemize}
-\item[0] Open for data read, as is used by {\tt mount()} (2), or the
-user commands {\tt dd} or {\tt cat}.  
-\item[1] Open for $ioctl$ commanding, as is used for audio-CD playing
-programs mostly. 
+\item[0] Open for reading data, as done by {\tt {mount()}} (2), or the
+user commands {\tt {dd}} or {\tt {cat}}.  
+\item[1] Open for $ioctl$ commands, as done by audio-CD playing
+programs.
 \end{itemize}
 In case the driver supports modules, the call $MOD_INC_USE_COUNT$
 should be performed exactly once, if the $open()$ was successful. The
@@ -355,10 +357,11 @@
 
 Notice that any strategic code (closing tray upon $open()$, etc.)\ is
 done by the calling routine in \cdromc, so the low-level routine
-should only be concerned with proper initialization and device-use
-count.
+should only be concerned with proper initialization, such as spinning
+up the disc, etc. % and device-use count
 
-\subsection{$Release(struct\ cdrom_device_info * cdi)$}
+
+\subsection{$Void\ release(struct\ cdrom_device_info * cdi)$}
 
 In case of module support, a single call $MOD_DEC_USE_COUNT$ should be
 coded here.  Possibly other device-specific actions should be taken
@@ -366,14 +369,14 @@
 ejection of the tray, or unlocking the door, should be left over to
 the general routine $cdrom_release()$. Also, the invalidation of the
 allocated buffers in the VFS is taken care of by the routine in
-\cdromc.
+\cdromc.  This is the only function returning type $void$. 
 
-\subsection{$Drive_status(struct\ cdrom_device_info * cdi)$}
+\subsection{$Int\ drive_status(struct\ cdrom_device_info * cdi)$}
 \label{drive status}
 
 The function $drive_status$, if implemented, should provide
-information of the status of the drive (not the status of the disc,
-which may or may not be in the drive). In \ucdrom\ the possibilities
+information on the status of the drive (not the status of the disc,
+which may or may not be in the drive). In \cdromh\ the possibilities
 are listed: 
 $$
 \halign{$#$\ \hfil&$/*$ \rm# $*/$\hfil\cr
@@ -384,19 +387,32 @@
 CDS_DISC_OK& a disc is loaded and everything is fine\cr
 }
 $$
-%For a juke-box, the second argument $drive_nr$ specifies information
-%is requested for another than the default disc ($drive_nr=0$),
-%possibly only a subset of the return values can be returned.
 
-\subsection{$Disc_status(struct\ cdrom_device_info * cdi)$}
+\subsection{$Disc_status$}
 \label{disc status}
 
-As a complement to $drive_status()$, this function can provide the
-general \cdrom-routines with information about the current disc that
-is inserted in the drive represented by $cdi\to dev$. The history of
-development of the CD's use as a carrier medium for various digital
-information has lead to many different disc types, hence this function
-can return:
+As a complement to $drive_status()$, this function can provide {\emph
+{some}} information about the current disc that is inserted in the
+drive. This function is now implemented internally in the \UCD, so the
+low-level drivers do not need to implement this functionality anymore.
+
+The history of development of the CD's use as a carrier medium for
+various digital information has lead to many different disc types. This
+$ioctl$ makes the false assumption that CDs have {\emph {only one}} type
+of data on them. While this is often the case, it is also very common
+for CDs to have some tracks with data, and some tracks with audio.
+Because this is an existing interface, rather than fixing this interface
+by changing the assumptions it was made under, thereby breaking all user
+applications that use this function, the \UCD\ implements this $ioctl$
+as follows: If the CD in question has audio tracks on it, and it has
+absolutly no CD-I, XA, or data tracks on it, it will be reported as
+$CDS_AUDIO$. Failing that, if the CD in question has any CD-I tracks
+on it, it will be reported as $CDS_XA_2_2$. Failing that, if the CD in
+question has any XA tracks on it, it will be reported as $CDS_XA_2_1$.
+Finally, if the CD in question has any data tracks on it, it will be
+reported as a data CD ($CDS_DATA_1$). 
+
+This function can return:
 $$
 \halign{$#$\ \hfil&$/*$ \rm# $*/$\hfil\cr
 CDS_NO_INFO& no information available\cr
@@ -408,11 +424,11 @@
 CDS_XA_2_2& mixed data (XA), mode 2, form 1 (2324  user bytes)\cr
 }
 $$
-As far as I know, \cdrom s are always of type $CDS_DATA_1$. For
+As far as I know, data \cdrom s are always of type $CDS_DATA_1$. For
 some information concerning frame layout of the various disc types, see
-a recent version of {\tt cdrom.h}. 
+a recent version of \cdromh. 
 
-\subsection{$Media_changed(struct\ cdrom_device_info * cdi, int disc_nr)$}
+\subsection{$Int\ media_changed(struct\ cdrom_device_info * cdi, int\ disc_nr)$}
 
 This function is very similar to the original function in $struct\ 
 file_operations$. It returns 1 if the medium of the device $cdi\to
@@ -421,9 +437,9 @@
 ignored for single-disc drives.  Note that by `re-routing' this
 function through $cdrom_media_changed()$, we can implement separate
 queues for the VFS and a new $ioctl()$ function that can report device
-changes to software (e.g., an auto-mounting daemon).
+changes to software (\eg, an auto-mounting daemon).
 
-\subsection{$Tray_move(struct\ cdrom_device_info * cdi, int\ position)$}
+\subsection{$Int\ tray_move(struct\ cdrom_device_info * cdi, int\ position)$}
 
 This function, if implemented, should control the tray movement. (No
 other function should control this.) The parameter $position$ controls
@@ -436,7 +452,7 @@
 error. Note that if the tray is already in the desired position, no
 action need be taken, and the return value should be 0. 
 
-\subsection{$Lock_door(struct\ cdrom_device_info * cdi, int\ lock)$}
+\subsection{$Int\ lock_door(struct\ cdrom_device_info * cdi, int\ lock)$}
 
 This function (and no other code) controls locking of the door, if the
 drive allows this. The value of $lock$ controls the desired locking
@@ -445,42 +461,47 @@
 \item[0] Unlock door, manual opening is allowed
 \item[1] Lock door, tray cannot be ejected manually
 \end{itemize}
-Return values are as for $tray_move()$.
-
-\subsection{$Select_speed(struct\ cdrom_device_info * cdi, int\ speed)$}
+This function returns 0 upon success, and a non-zero value upon
+error. Note that if the door is already in the requested state, no
+action need be taken, and the return value should be 0. 
 
-Although none of the drivers has implemented this function so far,
-some drives are capable of head-speed selection, and hence this is a
-capability that should be standardized through a function in the
-device-operations structure. This function should select the speed at
-which data is read or audio is played back. The special value `0'
-means `auto-selection', i.e., maximum data-rate or real-time audio
-rate. If the drive doesn't have this `auto-selection' capability, the
-decision should be made on the current disc loaded and the return
-value should be positive. A negative return value indicates an
-error. 
+\subsection{$Int\ select_speed(struct\ cdrom_device_info * cdi, int\ speed)$}
 
-There are a few reasons for having the speed to be selectable. Badly
+Some \cdrom\ drives are capable of changing their head-speed. There
+are several reasons for changing the speed of a \cdrom\ drive. Badly
 pressed \cdrom s may benefit from less-than-maximum head rate. Modern
-\cdrom\ drives can obtain very high head rates (up to twelve times
-audio speed is common), but these drives tend to make an annoyingly
-loud noise. A lower speed may reduce this. Finally, although the
-audio-low-pass filters probably aren't designed for it, more than
-real-time playback of audio might be used for high-speed copying of
-audio tracks.
+\cdrom\ drives can obtain very high head rates (up to $24\times$ is
+common).  It has been reported that these drives can make reading
+errors at these high speeds, reducing the speed can prevent data loss
+in these circumstances.  Finally, some of these drives can
+make an annoyingly loud noise, which a lower speed may reduce. %Finally,
+%although the audio-low-pass filters probably aren't designed for it,
+%more than real-time playback of audio might be used for high-speed
+%copying of audio tracks.
+
+This function specifies the speed at which data is read or audio is
+played back. The value of $speed$ specifies the head-speed of the
+drive, measured in units of standard cdrom speed (176\,kB/sec raw data
+or 150\,kB/sec file system data). So to request that a \cdrom\ drive
+operate at 300\,kB/sec you would call the CDROM_SELECT_SPEED $ioctl$
+with $speed=2$. The special value `0' means `auto-selection', \ie,
+maximum data-rate or real-time audio rate. If the drive doesn't have
+this `auto-selection' capability, the decision should be made on the
+current disc loaded and the return value should be positive. A negative
+return value indicates an error.
 
-\subsection{$Select_disc(struct\ cdrom_device_info * cdi, int\ number)$}
+\subsection{$Int\ select_disc(struct\ cdrom_device_info * cdi, int\ number)$}
 
 If the drive can store multiple discs (a juke-box) this function
-should perform disc selection. It should return the number of the
+will perform disc selection. It should return the number of the
 selected disc on success, a negative value on error. Currently, only
-the IDE-cd driver supports such functionality.
+the ide-cd driver supports this functionality.
 
-\subsection{$Get_last_session(struct\ cdrom_device_info * cdi, struct\
+\subsection{$Int\ get_last_session(struct\ cdrom_device_info * cdi, struct\
   cdrom_multisession * ms_info)$}
 
 This function should implement the old corresponding $ioctl()$. For
-device $cdi->dev$, the start of the last session of the current disc
+device $cdi\to dev$, the start of the last session of the current disc
 should be returned in the pointer argument $ms_info$. Note that
 routines in \cdromc\ have sanitized this argument: its requested
 format will {\em always\/} be of the type $CDROM_LBA$ (linear block
@@ -491,7 +512,7 @@
 course) and the routines in \cdromc\ will make the transform if
 necessary. The return value is 0 upon success.
 
-\subsection{$Get_mcn(struct\ cdrom_device_info * cdi, struct\
+\subsection{$Int\ get_mcn(struct\ cdrom_device_info * cdi, struct\
   cdrom_mcn * mcn)$}
 
 Some discs carry a `Media Catalog Number' (MCN), also called
@@ -502,17 +523,19 @@
 pre-declared memory region of type $struct\ cdrom_mcn$. The MCN is
 expected as a 13-character string, terminated by a null-character.
 
-\subsection{$Reset(struct\ cdrom_device_info * cdi)$}
+\subsection{$Int\ reset(struct\ cdrom_device_info * cdi)$}
 
-This call should implement hard-resetting the drive (although in
-circumstances that a hard-reset is necessary, a drive may very well
-not listen to commands anymore). Preferably, control is returned to the
-caller only after the drive has finished resetting.
+This call should perform a hard-reset on the drive (although in
+circumstances that a hard-reset is necessary, a drive may very well not
+listen to commands anymore). Preferably, control is returned to the
+caller only after the drive has finished resetting. If the drive is no
+longer listening, it may be wise for the underlying low-level cdrom
+driver to time out.
 
-\subsection{$Audio_ioctl(struct\ cdrom_device_info * cdi, unsigned\
+\subsection{$Int\ audio_ioctl(struct\ cdrom_device_info * cdi, unsigned\
   int\ cmd, void * arg)$}
 
-Some of the \cdrom-$ioctl$s defined in {\tt cdrom.h} can be
+Some of the \cdrom-$ioctl$s defined in \cdromh\ can be
 implemented by the routines described above, and hence the function
 $cdrom_ioctl$ will use those. However, most $ioctl$s deal with
 audio-control. We have decided to leave these accessed through a
@@ -523,17 +546,19 @@
 Seconds, Frames) for all audio calls. It also verifies the memory
 location of $arg$, and reserves stack-memory for the argument. This
 makes implementation of the $audio_ioctl()$ much simpler than in the
-old driver scheme. For an example you may look up the function
-$cm206_audio_ioctl()$ in {\tt cm206.c} that should be updated with
+old driver scheme. For example, you may look up the function
+$cm206_audio_ioctl()$ in {\tt {cm206.c}} that should be updated with
 this documentation. 
 
-An unimplemented ioctl should return $-EINVAL$, but a harmless request
-(e.g., $CDROMSTART$) may be ignored by returning 0 (success). Other
-errors should be according to the standards, whatever they are. (We
-may decide to sanitize the return value in $cdrom_ioctl()$, in order
-to guarantee a uniform interface to the audio-player software.)
+An unimplemented ioctl should return $-ENOSYS$, but a harmless request
+(\eg, $CDROMSTART$) may be ignored by returning 0 (success). Other
+errors should be according to the standards, whatever they are. When
+an error is returned by the low-level driver, the \UCD\ tries whenever
+possible to return the error code to the calling program. (We may decide
+to sanitize the return value in $cdrom_ioctl()$ though, in order to
+guarantee a uniform interface to the audio-player software.)
 
-\subsection{$Dev_ioctl(struct\ cdrom_device_info * cdi, unsigned\ int\
+\subsection{$Int\ dev_ioctl(struct\ cdrom_device_info * cdi, unsigned\ int\
   cmd, unsigned\ long\ arg)$}
 
 Some $ioctl$s seem to be specific to certain \cdrom\ drives. That is,
@@ -547,7 +572,9 @@
 so either the audio-file-system should ask for 75264 bytes at once
 (the least common multiple of 512 and 2352), or the drivers should
 bend their backs to cope with this incoherence (to which I would be
-opposed). Once this question is resolved, this code should be
+opposed).  Furthermore, it it very difficult for the hardware to find
+the exact frame boundaries, since there are no synchronization headers
+in audio frames.  Once these issues are resolved, this code should be
 standardized in \cdromc.
 
 Because there are so many $ioctl$s that seem to be introduced to
@@ -555,17 +582,17 @@
   actually uses these? I'd be interested!} any `non-standard' $ioctl$s
 are routed through the call $dev_ioctl()$. In principle, `private'
 $ioctl$s should be numbered after the device's major number, and not
-the general \cdrom\ $ioctl$ number, {\tt 0x53}. Currently the
+the general \cdrom\ $ioctl$ number, {\tt {0x53}}. Currently the
 non-supported $ioctl$s are: {\it CDROMREADMODE1, CDROMREADMODE2,
   CDROMREADAUDIO, CDROMREADRAW, CDROMREADCOOKED, CDROMSEEK,
-  CDROMPLAY\-BLK and CDROMREADALL}.
+  CDROMPLAY\-BLK and CDROM\-READALL}.
 
 \subsection{\cdrom\ capabilities}
 
 Instead of just implementing some $ioctl$ calls, the interface in
 \cdromc\ supplies the possibility to indicate the {\em capabilities\/}
 of a \cdrom\ drive. This can be done by ORing any number of
-capability-constants that are defined in \ucdrom\ at the registration
+capability-constants that are defined in \cdromh\ at the registration
 phase. Currently, the capabilities are any of:
 $$
 \halign{$#$\ \hfil&$/*$ \rm# $*/$\hfil\cr
@@ -578,11 +605,14 @@
 CDC_MCN& can read Medium Catalog Number\cr
 CDC_MEDIA_CHANGED& can report if disc has changed\cr
 CDC_PLAY_AUDIO& can perform audio-functions (play, pause, etc)\cr
+CDC_RESET& hard reset device\cr
+CDC_IOCTLS& driver has non-standard ioctls\cr
+CDC_DRIVE_STATUS& driver implements drive status\cr
 }
 $$
 The capability flag is declared $const$, to prevent drivers from
 accidentally tampering with the contents. The capability fags actually
-inform \cdromc\ on what the driver is capable of. If the drive found
+inform \cdromc\ of what the driver can do. If the drive found
 by the driver does not have the capability, is can be masked out by
 the $cdrom_device_info$ variable $mask$. For instance, the SCSI \cdrom\
 driver has implemented the code for loading and ejecting \cdrom's, and
@@ -630,9 +660,12 @@
 }
 $$
 One option needs some more explanation: $CDO_USE_FFLAGS$. In the next
-section we explain what the need for this option is.
+newsection we explain what the need for this option is.
 
-\section{The need to know the purpose of opening}
+A software package {\tt setcd}, available from the Debian distribution
+and {\tt sunsite.unc.edu}, allows user level control of these flags. 
+
+\newsection{The need to know the purpose of opening the \cdrom\ device}
 
 Traditionally, Unix devices can be used in two different `modes',
 either by reading/writing to the device file, or by issuing
@@ -668,7 +701,7 @@
 $ioctl$ commands, while data use wants to open for correct and
 reliable data transfer. The only way user programs can indicate what
 their {\em purpose\/} of opening the device is, is through the $flags$
-parameter (see {\tt open(2)}). For \cdrom\ devices, these flags aren't
+parameter (see {\tt {open(2)}}). For \cdrom\ devices, these flags aren't
 implemented (some drivers implement checking for write-related flags,
 but this is not strictly necessary if the device file has correct
 permission flags). Most option flags simply don't make sense to
@@ -704,9 +737,9 @@
 configurations.\footnote{Incidentally, I think that SUN's approach to
 mounting \cdrom s is very good in origin: under Solaris a
 volume-daemon automatically mounts a newly inserted \cdrom\ under {\tt
-/cdrom/$<volume-name>$/}. In my opinion they should have pushed this
+{/cdrom/$<volume-name>$/}}. In my opinion they should have pushed this
 further and have {\em every\/} \cdrom\ on the local area network be
-mounted at the similar location, i.e., no matter in which particular
+mounted at the similar location, \ie, no matter in which particular
 machine you insert a \cdrom, it will always appear at the same
 position in the directory tree, on every system. When I wanted to
 implement such a user-program for \linux, I came across the
@@ -724,64 +757,60 @@
 
 \subsection{The preferred strategy of $open()$}
 
-The routines in \cdromc\ are designed in such a way that a run-time
+The routines in \cdromc\ are designed in such a way that run-time
 configuration of the behavior of \cdrom\ devices (of {\em any\/} type)
 can be carried out, by the $CDROM_SET/CLEAR_OPTIONS$ $ioctls$. Thus, various
 modes of operation can be set:
 \begin{description}
-\item[$CDO_AUTO_CLOSE \mathrel| CDO_USE_FFLAGS \mathrel| CDO_LOCK$]
-This is the default setting. (With $CDO_CHECK_TYPE$ it will be better,
-in the future.) If the device is not yet opened by any other process,
-and it is opened for data ($O_NONBLOCK$ is not set) and the tray is
-found open, an attempt to close the tray is made. Then, it is verified
-that a disc is in the drive and, if $CDO_CHECK_TYPE$ is set, that its
-type is `data mode 1.' Only if all tests are passed, the return value
-is zero. The door is locked to prevent file system corruption. If
-opened for audio ($O_NONBLOCK$ is set), no actions are taken and a
-value of 0 will be returned.
-\item[0] $Open()$ will always be successful, the option flags are
-ignored. Neither actions are undertaken, nor any integrity checks are
-made. 
-\item[$CDO_AUTO_CLOSE \mathrel| CDO_AUTO_EJECT \mathrel| CDO_LOCK$]
-This mimics the behavior of the current sbpcd-driver. The option flags
-are ignored, the tray is closed on the first open, if
-necessary. Similarly, the tray is opened on the last release, i.e., if
-a \cdrom\ is unmounted, it is automatically ejected, such that the
-user can replace it. 
-\end{description}
+\item[$CDO_AUTO_CLOSE \mathrel| CDO_USE_FFLAGS \mathrel| CDO_LOCK$] This
+is the default setting. (With $CDO_CHECK_TYPE$ it will be better, in the
+future.) If the device is not yet opened by any other process, and it
+the device is being opened for data ($O_NONBLOCK$ is not set) and the
+tray is found to be open, an attempt to close the tray is made. Then,
+it is verified that a disc is in the drive and, if $CDO_CHECK_TYPE$ is
+set, that it contains tracks of type `data mode 1.' Only if all tests
+are passed, the return value is zero. The door is locked to prevent file
+system corruption. If the drive is opened for audio ($O_NONBLOCK$ is
+set), no actions are taken and a value of 0 will be returned. 
+\item[$CDO_AUTO_CLOSE \mathrel| CDO_AUTO_EJECT \mathrel| CDO_LOCK$] This
+mimics the behavior of the current sbpcd-driver. The option flags are
+ignored, the tray is closed on the first open, if necessary. Similarly,
+the tray is opened on the last release, \ie, if a \cdrom\ is unmounted,
+it is automatically ejected, such that the user can replace it.
+\end{description} 
 We hope that these option can convince everybody (both driver
-maintainers and user program developers) to adapt to the new \cdrom\
-driver scheme and option flag interpretation. 
+maintainers and user program developers) to adopt the new \cdrom\
+driver scheme and option flag interpretation.
 
-\section{Description of routines in \cdromc}
+\newsection{Description of routines in \cdromc}
 
 Only a few routines in \cdromc\ are exported to the drivers. In this
-section we will treat these, as well as the functioning of the routines
-that `take over' the interface to the kernel. The header file
-belonging to \cdromc\ is called \ucdrom, but may be included in {\tt
-cdrom.h} in the future.
+newsection we will discuss these, as well as the functions that `take
+over' the \cdrom\ interface to the kernel. The header file belonging
+to \cdromc\ is called \cdromh. Formerly, some of the contents of this
+file were placed in the file {\tt {ucdrom.h}}, but this file has now been
+merged back into \cdromh.
 
 \subsection{$Struct\ file_operations\ cdrom_fops$}
 
-The contents of this structure has been described in
-section~\ref{cdrom.c}, and this structure should be used in
-registering the block device to the kernel:
+The contents of this structure were described in section~\ref{cdrom.c}.
+As already stated, this structure should be used to register block
+devices with the kernel:
 $$
 register_blkdev(major, <name>, \&cdrom_fops);
 $$
 
-\subsection{$Int\ register_cdrom( struct\ cdrom_device_info\ * cdi, 
-  char * name,)$}
+\subsection{$Int\ register_cdrom( struct\ cdrom_device_info\ * cdi)$}
 
-Similar to registering $cdrom_fops$ to the kernel, the device
-operations and information structures, as described in
-section~\ref{cdrom.c}, should be registered to the general \cdrom\ 
-interface:
+This function is used in about the same way one registers $cdrom_fops$
+with the kernel, the device operations and information structures,
+as described in section~\ref{cdrom.c}, should be registered with the
+\UCD:
 $$
-register_cdrom(\&<device>_info), <name>);
+register_cdrom(\&<device>_info));
 $$
 This function returns zero upon success, and non-zero upon
-failure. The structure $<device>_info$ should have a pointer the
+failure. The structure $<device>_info$ should have a pointer to the
 driver's $<device>_dops$, as in 
 $$
 \vbox{\halign{&$#$\hfil\cr
@@ -790,46 +819,46 @@
 &\ldots\cr
 \}\cr
 }}$$
-Note that a drivers has one static structure, $<device>_dops$, while
-it has as many structures $<device>_info$ as there are minor devices
+Note that a driver must have one static structure, $<device>_dops$, while
+it may have as many structures $<device>_info$ as there are minor devices
 active. $Register_cdrom()$ builds a linked list from these. 
 
 \subsection{$Int\ unregister_cdrom(struct\ cdrom_device_info * cdi)$}
 
-Unregistering device $cdi$ with minor number $MINOR(cdi\to dev)$
-removes the minor device from the list. If it was the last minor for
-the driver, this disconnects the registered device-operation routines
-from the \cdrom\ interface. This function returns zero upon success,
-and non-zero upon failure.
+Unregistering device $cdi$ with minor number $MINOR(cdi\to dev)$ removes
+the minor device from the list. If it was the last registered minor for
+the low-level driver, this disconnects the registered device-operation
+routines from the \cdrom\ interface. This function returns zero upon
+success, and non-zero upon failure.
 
 \subsection{$Int\ cdrom_open(struct\ inode * ip, struct\ file * fp)$}
 
 This function is not called directly by the low-level drivers, it is
 listed in the standard $cdrom_fops$. If the VFS opens a file, this
-function becomes active. A strategy logic is implemented in this
-routine, taking care of all capabilities and options that are set in
-the $cdrom_device_ops$ connected to the device. Then, the program flow is
-transferred to the device_dependent $open()$ call. 
+function becomes active. A strategy is implemented in this routine,
+taking care of all capabilities and options that are set in the
+$cdrom_device_ops$ connected to the device. Then, the program flow is
+transferred to the device_dependent $open()$ call.
 
 \subsection{$Void\ cdrom_release(struct\ inode *ip, struct\ file
 *fp)$}
 
 This function implements the reverse-logic of $cdrom_open()$, and then
-calls the device-dependent $release()$ routine.  When the use-count
-has reached 0, the allocated buffers in the are flushed by calls to
-$sync_dev(dev)$ and $invalidate_buffers(dev)$.
+calls the device-dependent $release()$ routine. When the use-count has
+reached 0, the allocated buffers are flushed by calls to $sync_dev(dev)$
+and $invalidate_buffers(dev)$.
 
 
 \subsection{$Int\ cdrom_ioctl(struct\ inode *ip, struct\ file *fp,
                        unsigned\ int\ cmd, unsigned\ long\ arg)$}
 \label{cdrom-ioctl}
 
-This function handles all $ioctl$ requests for \cdrom\ devices in a
-uniform way. The different calls fall into three categories: $ioctl$s
-that can be directly implemented by device operations, ones that are
-routed through the call $audio_ioctl()$, and the remaining ones, that
-are presumable device-dependent. Generally, a negative return value
-indicates an error. 
+This function handles all the standard $ioctl$ requests for \cdrom\
+devices in a uniform way. The different calls fall into three
+categories: $ioctl$s that can be directly implemented by device
+operations, ones that are routed through the call $audio_ioctl()$, and
+the remaining ones, that are presumable device-dependent. Generally, a
+negative return value indicates an error.
 
 \subsubsection{Directly implemented $ioctl$s}
 \label{ioctl-direct}
@@ -847,7 +876,7 @@
 \item[CDROM_GET_MCN or CDROM_GET_UPC] Get the Medium Catalog Number from a CD.
 \end{description}
 
-\subsubsection{$Ioctl$s rooted through $audio_ioctl()$}
+\subsubsection{$Ioctl$s routed through $audio_ioctl()$}
 \label{ioctl-audio}
 
 The following set of $ioctl$s are all implemented through a call to
@@ -887,10 +916,11 @@
 \item[CDROM_CLEAR_OPTIONS] Clear options specified by $arg$. Returns
   the option flag register after modification.
 \item[CDROM_SELECT_SPEED] Select head-rate speed of disc specified as
-  by $arg$. The value 0 means `auto-select', i.e., play audio discs at
-  real time and data disc at maximum speed. The value $arg$ is
-  checked against the maximum head rate of the drive found in
-  the $cdrom_dops$.
+  by $arg$ in units of standard cdrom speed (176\,kB/sec raw data or
+  150\,kB/sec file system data). The value 0 means `auto-select', \ie,
+  play audio discs at real time and data disc at maximum speed. The value
+  $arg$ is checked against the maximum head rate of the drive found in the
+  $cdrom_dops$.
 \item[CDROM_SELECT_DISC] Select disc numbered $arg$ from a juke-box.
   First disc is numbered 0. The number $arg$ is checked against the
   maximum number of discs in the juke-box found in the $cdrom_dops$.
@@ -902,8 +932,8 @@
   value $CDSL_CURRENT$ requests that information about the currently
   selected slot is returned.
 \item[CDROM_DRIVE_STATUS] Returns the status of the drive by a call to
-  $drive_status()$. Return values are as defined in section~\ref{drive
-    status}. Note that this call doesn't return information on the
+  $drive_status()$. Return values are defined in section~\ref{drive
+   status}. Note that this call doesn't return information on the
   current playing activity of the drive; this can be polled through an
   $ioctl$ call to $CDROMSUBCHNL$. For Juke-boxes, an extra argument
   $arg$ specifies the slot for which (possibly limited) information is
@@ -916,40 +946,38 @@
   juke-box. 
 \end{description}
 
-\subsubsection{Device dependent $ioct$s}
+\subsubsection{Device dependent $ioctl$s}
 
 Finally, all other $ioctl$s are passed to the function $dev_ioctl()$,
 if implemented. No memory allocation or verification is carried out. 
 
-\subsection{How to update your driver}
+\newsection{How to update your driver}
 
 \begin{enumerate}
 \item Make a backup of your current driver. 
-\item Get hold of the files \cdromc\ and \ucdrom, they should be in
+\item Get hold of the files \cdromc\ and \cdromh, they should be in
   the directory tree that came with this documentation.
-\item Include {\tt \char`\<linux/ucdrom.h>} just after {\tt cdrom.h}.
+\item Make sure you include \cdromh.
 \item Change the 3rd argument of $register_blkdev$ from
 $\&<your-drive>_fops$ to $\&cdrom_fops$. 
-\item Just after that line, add a line to register to the \cdrom\ 
-  routines:
-  $$register_cdrom(\&<your-drive>_info, <name>);$$
-  Similarly, add a
-  call to $unregister_cdrom()$.
+\item Just after that line, add the following to register with the \UCD:
+  $$register_cdrom(\&<your-drive>_info);$$
+  Similarly, add a call to $unregister_cdrom()$ at the appropriate place.
 \item Copy an example of the device-operations $struct$ to your
-  source, e.g., from {\tt cm206.c} $cm206_dops$, and change all
+  source, \eg, from {\tt {cm206.c}} $cm206_dops$, and change all
   entries to names corresponding to your driver, or names you just
   happen to like. If your driver doesn't support a certain function,
   make the entry $NULL$. At the entry $capability$ you should list all
-  capabilities your drive could support, in principle. If your drive
+  capabilities your driver currently supports. If your driver
   has a capability that is not listed, please send me a message.
 \item Copy the $cdrom_device_info$ declaration from the same example
   driver, and modify the entries according to your needs. If your
   driver dynamically determines the capabilities of the hardware, this
   structure should also be declared dynamically. 
 \item Implement all functions in your $<device>_dops$ structure,
-  according to prototypes listed in \ucdrom, and specifications given
+  according to prototypes listed in \cdromh, and specifications given
   in section~\ref{cdrom.c}. Most likely you have already implemented
-  the code in a large part, and you may just have to adapt the
+  the code in a large part, and you will almost certainly need to adapt the
   prototype and return values.
 \item Rename your $<device>_ioctl()$ function to $audio_ioctl$ and
   change the prototype a little. Remove entries listed in the first
@@ -968,111 +996,29 @@
   function, $<device>_ioctl$, the device-dependent $ioctl$s. Note that
   memory checking and allocation must be kept in this code!
 \item Change the prototypes of $<device>_open()$ and
-  $<device>_release()$, and remove any strategic code (i.e., tray
+  $<device>_release()$, and remove any strategic code (\ie, tray
   movement, door locking, etc.).
 \item Try to recompile the drivers. We advice you to use modules, both
-  for {\tt cdrom.o} and your driver, as debugging is much easier this
+  for {\tt {cdrom.o}} and your driver, as debugging is much easier this
   way.
 \end{enumerate} 
 
-\section{Thanks}
+\newsection{Thanks}
 
-Thanks to all the people involved. Thanks to Scott Snyder and Gerd
-Knorr, who were the first to implement this interface for SCSI and
-IDE-CD drivers and added many ideas for extension of the data
-structures relative to kernel~2.0. Further thanks to Thomas Quinot,
-Jon Tombs, Ken Pizzini, Eberhard M\"onkeberg and Andrew Kroll, the
-\linux\ \cdrom\ device driver developers who were kind enough to give
-suggestions and criticisms during the writing. Finally of course, I
-want to thank Linus Torvalds for making this possible in the first
-place.
+Thanks to all the people involved.  First, Erik Andersen, who has
+taken over the torch in maintaining \cdromc\ and integrating many
+\cdrom-related code in the 2.1-kernel.  Thanks to Scott Snyder and
+Gerd Knorr, who were the first to implement this interface for SCSI
+and IDE-CD drivers and added many ideas for extension of the data
+structures relative to kernel~2.0.  Further thanks to Heiko Eissfeldt,
+Thomas Quinot, Jon Tombs, Ken Pizzini, Eberhard M\"onkeberg and Andrew
+Kroll, the \linux\ \cdrom\ device driver developers who were kind
+enough to give suggestions and criticisms during the writing. Finally
+of course, I want to thank Linus Torvalds for making this possible in
+the first place.
 
 \vfill
 $ \version\ $
 \eject
 \end{document}
 
-\def\versionlog{
-$Log: cdrom-standard.tex,v $
-Revision 1.6  1996/12/29 20:45:18  davem
-Merge to 2.1.18, versioned module symbols are
-disabled until new modutils is released.
-
-Revision 1.6  1996/12/23 21:17:44  david
-Added reasons for speed selection.
-
-Revision 1.5  1996/12/22 21:54:25  david
-Repared version definition.
-
-Revision 1.4  1996/12/22 21:40:26  david
-Added older version log at end of text.
-
-Revision 1.3  1996/12/22 21:31:58  david
-Adapted text to fit kernel changes up to 2.1.15.
-
-Sun Dec 22 21:31:58 1996  David A. van Leeuwen  <david@ElseWare>
-
-        * cdrom-standard.tex: Adapted text to fit kernel changes up to 2.1.15.
-
-Sun Sep 22 20:18:00 1996  David
-
-        * cdrom-standard.tex:
-        Documentation adapted to align with developments started by Scott
-        Snyder, Gerd Knorr and myself.
-
-        Split _ops in _info (minor stuff) and _ops (major stuff).
-        Moved capability back to _ops, added n_minors.
-        Implemented use_count in _info.
-        Removed open_files().
-
-Sat Aug 10 10:57:16 1996  David 
-
-        * cdrom-standard.tex:
-        Weakened Eberhard's annoying comments by making it a quotation and
-        having it appear smaal-type. He doesn't react to my email-messages.
-
-        Changed float speed to int speed.
-
-Tue May 21 15:27:10 1996  David 
-
-        * cdrom-standard.tex:
-        Typographic errors introduced by Eberhard Moenkeberg were corrected,
-        as well one of my own typos. I deepfully respect the person that
-        corrects all typos i make in code and documentation!
-
-        Linux version 1.99.6.
-
-        * cdrom-standard.tex:
-        Changes made by Eberhard Moenkeberg, much to my annoyance. The
-        contents of the introduction were altered completely so that it now
-        says the opposite of what I wrote before: that there is no need for an
-        additional unform cdrom layer. This makes the whole document and the
-        project for that matter worthless.
-
-        ---david
-
-        * cdrom-standard.tex:
-        Version as it appeared first in the official kernel documentation
-        tree, Linux 1.99.2, Documentation/cdrom/cdrom-standard.tex.
-
-        Some improvements in use of English language have been made by people
-        that know better English than me.
-
-Wed Apr 17 20:46:34 1996  David 
-
-        * cdrom-standard.tex: changed #minors from 4 to 16.
-
-Sun Apr 14 20:53:17 1996  David 
-
-        * cdrom-standard.tex:
-        Update to go with cdrom.c version 0.3. More ioctl stuff.
-
-Wed Apr 10 18:00:28 1996  David 
-
-        * cdrom-standard.tex:
-        Version as first distributed among CDrom device driver authors.
-
-Mon Apr  8 18:25:21 1996  David A. van Leeuwen  <david@ElseWare>
-
-        * cdrom-standard.tex: *** empty log message ***
-}

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov