summaryrefslogtreecommitdiffstats
path: root/Documentation/cdrom
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1997-12-16 05:34:03 +0000
committerRalf Baechle <ralf@linux-mips.org>1997-12-16 05:34:03 +0000
commit967c65a99059fd459b956c1588ce0ba227912c4e (patch)
tree8224d013ff5d255420713d05610c7efebd204d2a /Documentation/cdrom
parente20c1cc1656a66a2773bca4591a895cbc12696ff (diff)
Merge with Linux 2.1.72, part 1.
Diffstat (limited to 'Documentation/cdrom')
-rw-r--r--Documentation/cdrom/aztcd47
-rw-r--r--Documentation/cdrom/cdrom-standard.tex936
-rw-r--r--Documentation/cdrom/cm2062
-rw-r--r--Documentation/cdrom/gscd2
-rw-r--r--Documentation/cdrom/ide-cd83
-rw-r--r--Documentation/cdrom/isp162
-rw-r--r--Documentation/cdrom/sbpcd10
-rw-r--r--Documentation/cdrom/sjcd2
-rw-r--r--Documentation/cdrom/sonycd5352
9 files changed, 548 insertions, 538 deletions
diff --git a/Documentation/cdrom/aztcd b/Documentation/cdrom/aztcd
index a0832d340..0056ce914 100644
--- a/Documentation/cdrom/aztcd
+++ b/Documentation/cdrom/aztcd
@@ -1,10 +1,10 @@
-$Id: README.aztcd,v 2.50 1996/05/16 18:31:22 root Exp root $
+$Id: README.aztcd,v 2.60 1997/11/29 09:51:25 root Exp root $
Readme-File /usr/src/Documentation/cdrom/aztcd
for
AZTECH CD-ROM CDA268-01A, ORCHID CD-3110,
OKANO/WEARNES CDD110, CONRAD TXC, CyCDROM CR520, CR540
CD-ROM Drives
- Version 2.5 and newer
+ Version 2.6 and newer
(for other drives see 6.-8.)
NOTE: THIS DRIVER WILL WORK WITH THE CD-ROM DRIVES LISTED, WHICH HAVE
@@ -43,9 +43,9 @@ Contents of this file:
1. NOTE
This software has been successfully in alpha and beta test and is part of
the standard kernel since kernel 1.1.8x since December 1994. It works with
-with AZTECH CDA268-01A, ORCHID CDS-3110, ORCHID/WEARNES CDD110 and
-CONRAD TXC (Nr.99 31 23 -series 04) and has proven to be stable with kernel
-versions 1.0.9 to 1.3.72. But with any software there still may be bugs in it.
+AZTECH CDA268-01A, ORCHID CDS-3110, ORCHID/WEARNES CDD110 and CONRAD TXC
+(Nr.99 31 23 -series 04) and has proven to be stable with kernel
+versions 1.0.9 and newer. But with any software there still may be bugs in it.
So if you encounter problems, you are invited to help us improve this software.
Please send me a detailed bug report (see chapter BUG REPORTS). You are also
invited in helping us to increase the number of drives, which are supported.
@@ -55,8 +55,8 @@ old kernel, in order to reboot if something goes wrong!
2. INSTALLATION
The driver consists of a header file 'aztcd.h', which normally should reside
-in /usr/include/linux and the source code 'aztcd.c', which normally resides in
-/usr/src/linux/drivers/cdrom. It uses /dev/aztcd (/dev/aztcd0 in some distri-
+in /usr/src/linux/drivers/cdrom and the source code 'aztcd.c', which normally
+resides in the same place. It uses /dev/aztcd (/dev/aztcd0 in some distri-
butions), which must be a valid block device with major number 29 and reside
in directory /dev. To mount a CD-ROM, your kernel needs to have the ISO9660-
filesystem support included.
@@ -82,6 +82,8 @@ start Linux with boot parameter aztcd=<base address>, e.g. aztcd=0x320. If
you do not know the base address, start your PC with DOS and look at the boot
message of your CD-ROM's DOS driver. If that still does not help, use boot
parameter aztcd=<base address>,0x79 , this tells aztcd to try a little harder.
+aztcd may be configured to use autoprobing the base address by recompiling
+it (see chapter 4.).
If the message looks correct, as user 'root' you should be able to mount the
drive by
@@ -112,8 +114,14 @@ filesystem, you have to recompile your kernel:
have to set up. If you have a soundcard, read chapter 4.2.
Users of other drives should read chapter OTHER DRIVES of this file.
You also can configure that address by kernel boot parameter aztcd=...
+- aztcd may be configured to use autoprobing the base address by setting
+ AZT_BASE_ADDR to '-1'. In that case aztcd probes the addresses listed
+ under AZT_BASE_AUTO. But please remember, that autoprobing always may
+ incorrectly influence other hardware components too!
- There are some other points, which may be configured, e.g. auto-eject the
CD when unmounting a drive, tray locking etc., see aztcd.h for details.
+- If you're using a linux kernel version prior to 2.1.0, in aztcd.h
+ uncomment the line '#define AZT_KERNEL_PRIOR_2_1'
- Build a new kernel, configure it for 'Aztech/Orchid/Okano/Wearnes support'
(if you want aztcd to be part of the kernel). Do not configure it for
'Aztech... support', if you want to use aztcd as a run time loadable module.
@@ -149,10 +157,14 @@ your boot kernel is not the same than the source kernel version, from which
you create the modules. So rebuild your kernel, if necessary.
Now edit the base address of your AZTECH interface card in
-/usr/src/linux/include/linux/aztcd.h to the appropriate value. There are
-also some special features which may be configured, e.g. auto-eject a CD
-when unmounting the drive etc; see aztcd.h for details. Then change
-to /usr/src/linux and do a
+/usr/src/linux/drivers/cdrom/aztcd.h to the appropriate value.
+aztcd may be configured to use autoprobing the base address by setting
+AZT_BASE_ADDR to '-1'. In that case aztcd probes the addresses listed
+under AZT_BASE_AUTO. But please remember, that autoprobing always may
+incorrectly influence other hardware components too!
+There are also some special features which may be configured, e.g.
+auto-eject a CD when unmounting the drive etc; see aztcd.h for details.
+Then change to /usr/src/linux and do a
make modules
make modules_install
After that you can run-time load the driver via
@@ -161,6 +173,7 @@ and remove it via rmmod aztcd.
If you did not set the correct base address in aztcd.h, you can also supply the
base address when loading the driver via
insmod /lib/modules/X.X.X/misc/aztcd.o aztcd=<base address>
+Again specifing aztcd=-1 will cause autoprobing.
If you do not have the iso9660-filesystem in your boot kernel, you also have
to load it before you can mount the CDROM:
insmod /lib/modules/X.X.X/fs/isofs.o
@@ -178,7 +191,7 @@ should try to boot DOS first and let their DOS drivers initialize the
soundcard and CDROM, then warm boot (or use loadlin) their PC to start
Linux.
Support for the CDROM-interface of SoundWave32-soundcards is directly
-implemented in the AZTECH driver. Please edit /usr/src/linux/include/aztdc.h,
+implemented in the AZTECH driver. Please edit linux/drivers/cdrom/aztdc.h,
uncomment line '#define AZT_SW32' and set the appropriate value for
AZT_BASE_ADDR and AZT_SW32_BASE_ADDR. This support was tested with an Orchid
CDS-3110 connected to a SoundWave32.
@@ -239,7 +252,7 @@ README.CDROM.
6. BUG REPORTS
Please send detailed bug reports and bug fixes via EMail to
- zimmerma@rz.fht-esslingen.de
+ Werner.Zimmermann@fht-esslingen.de
Please include a description of your CD-ROM drive type and interface card,
the exact firmware message during Linux bootup, the version number of the
@@ -516,15 +529,15 @@ features for testing CDROM-drives can be found in
Werner Zimmermann
Fachhochschule fuer Technik Esslingen
-(EMail: zimmerma@rz.fht-esslingen.de)
-Maerz 16, 1995
+(EMail: Werner.Zimmermann@fht-esslingen.de)
+October, 1997
---------------------------------------------------------------------------
APPENDIX: Source code of cdplay.c
/* Tiny Audio CD Player
- Copyright 1994, 1995, 1996 Werner Zimmermann (zimmerma@rz.fht-esslingen.de)
+ Copyright 1994, 1995, 1996 Werner Zimmermann (Werner.Zimmermann@fht-esslingen.de)
This program originally was written to test the audio functions of the
AZTECH.CDROM-driver, but it should work with every CD-ROM drive. Before
@@ -550,7 +563,7 @@ History: V0.1 W.Zimmermann: First release. Nov. 8, 1994
#include <fcntl.h>
#include <unistd.h>
#include <linux/cdrom.h>
-#include <linux/aztcd.h>
+#include <linux/../../drivers/cdrom/aztcd.h>
void help(void)
{ printf("Available Commands: STOP s EJECT/CLOSE e QUIT q\n");
diff --git a/Documentation/cdrom/cdrom-standard.tex b/Documentation/cdrom/cdrom-standard.tex
index 5c9e91de8..6f1af1c18 100644
--- a/Documentation/cdrom/cdrom-standard.tex
+++ b/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}
-
-\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).
+\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 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.
-
-\section{Standardizing through another software level}
+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.
+
+\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 @@ struct& file_operations\ cdrom_fops = \{\hidewidth\cr
&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)
+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)
$$
-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:
+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 @@ struct& cdrom_device_ops\ \{ \hidewidth\cr
&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 @@ struct& cdrom_device_ops\ \{ \hidewidth\cr
&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.
-
-The drive-specific, minor-like information that is registered to
-\cdromc, contains the following fields:
+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 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\ \{ \hidewidth\cr
& 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 @@ open-for-ioctl call can only fail if there is no hardware.
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 @@ such as spinning down the device. However, strategic actions such as
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_DRIVE_NOT_READY& something is wrong, tray is moving?\cr
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_1& mixed data (XA), mode 2, form 1 (2048 user bytes)\cr
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 @@ $disc_nr$ identifies a specific slot in a juke-box, it should be
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 @@ This function returns 0 upon success, and a non-zero value upon
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 @@ state:
\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)$}
-
-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.
-
-There are a few reasons for having the speed to be selectable. 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.
+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.
-\subsection{$Select_disc(struct\ cdrom_device_info * cdi, int\ number)$}
+\subsection{$Int\ select_speed(struct\ cdrom_device_info * cdi, int\ speed)$}
+
+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 $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{$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 @@ return the requested information in $CDROM_MSF$ format if it wishes so
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 @@ same format. The return argument to this function is a pointer to a
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 @@ though. It sanitizes the address format type to $CDROM_MSF$ (Minutes,
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 @@ problem here could be the fact that audio-frames are 2352 bytes long,
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 @@ satisfy certain drivers,\footnote{Is there software around that
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_MULTI_SESSION& can read sessions $>\rm1$\cr
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 @@ CDROM_CLEAR_OPTIONS& clear options specified in $(int)\ arg$\cr
}
$$
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 @@ device in order to get a file handle which is needed for issuing
$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 @@ deal with a dozen or more different, competing hardware
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 @@ CDO_USE_FFLAGS)$.
\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 @@ struct\ &cdrom_device_info\ <device>_info = \{\cr
&\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 @@ set behavior to non-moving on $open()$ and $release()$ calls.
\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 @@ the current flags.
\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 @@ the current flags.
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 @@ the current flags.
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 @@ $\&<your-drive>_fops$ to $\&cdrom_fops$.
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 ***
-}
diff --git a/Documentation/cdrom/cm206 b/Documentation/cdrom/cm206
index 9cbbdcd76..1aebd7e5d 100644
--- a/Documentation/cdrom/cm206
+++ b/Documentation/cdrom/cm206
@@ -116,7 +116,7 @@ If module parameters and LILO config options don't work
-------------------------------------------------------
If autoprobing does not work, you can hard-wire the default values
of the base port address (CM206_BASE) and interrupt request line
-(CM206_IRQ) into the file ./include/linux/cm206.h. Change
+(CM206_IRQ) into the file /usr/src/linux/drivers/cdrom/cm206.h. Change
the defines of CM206_IRQ and CM206_BASE.
diff --git a/Documentation/cdrom/gscd b/Documentation/cdrom/gscd
index 66d4baabd..bb25a8c60 100644
--- a/Documentation/cdrom/gscd
+++ b/Documentation/cdrom/gscd
@@ -23,7 +23,7 @@ drive interface is compatible, too.
Installation
------------
-Change to '/usr/src/linux/include/linux' and edit the file 'gscd.h'. Insert
+Change to '/usr/src/linux/drivers/cdrom' and edit the file 'gscd.h'. Insert
the i/o address of your interface card.
The default base address is 0x340. This will work for most applications.
diff --git a/Documentation/cdrom/ide-cd b/Documentation/cdrom/ide-cd
index f30fdfbf5..70384d975 100644
--- a/Documentation/cdrom/ide-cd
+++ b/Documentation/cdrom/ide-cd
@@ -379,12 +379,14 @@ f. Data corruption.
* interface by Erik Andersen <andersee@et.byu.edu>.
*/
+#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
-#include <stdio.h>
-#include <linux/ucdrom.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/cdrom.h>
int
@@ -395,7 +397,7 @@ main (int argc, char **argv)
int fd; /* file descriptor for CD-ROM device */
int status; /* return status for system calls */
int verbose = 0;
- int x_slot = -1;
+ int slot=-1, x_slot;
int total_slots_available;
program = argv[0];
@@ -419,10 +421,10 @@ main (int argc, char **argv)
device = argv[0];
if (argc == 2)
- x_slot = atoi (argv[1]) - 1;
+ slot = atoi (argv[1]) - 1;
/* open device */
- fd = open (device, 0);
+ fd = open(device, O_RDONLY | O_NONBLOCK);
if (fd < 0) {
fprintf (stderr, "%s: open failed for `%s': %s\n",
program, device, strerror (errno));
@@ -437,8 +439,8 @@ main (int argc, char **argv)
exit (1);
}
- if (x_slot >= 0) {
- if (x_slot >= total_slots_available) {
+ if (slot >= 0) {
+ if (slot >= total_slots_available) {
fprintf (stderr, "Bad slot number. "
"Should be 1 -- %d.\n",
total_slots_available);
@@ -446,19 +448,33 @@ main (int argc, char **argv)
}
/* load */
- status = ioctl (fd, CDROM_SELECT_DISC, x_slot);
+ slot=ioctl (fd, CDROM_SELECT_DISC, slot);
+ if (slot<0) {
+ fflush(stdout);
+ perror ("CDROM_SELECT_DISC ");
+ exit(1);
+ }
}
- if (x_slot < 0 || verbose) {
+ if (slot < 0 || verbose) {
- status = ioctl (fd, CDROM_SELECT_DISC, CDSL_CURRENT);
+ 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", status+1);
+ printf ("Current slot: %d\n", slot+1);
printf ("Total slots available: %d\n",
total_slots_available);
printf ("Drive status: ");
- switch (ioctl (fd, CDROM_DRIVE_STATUS, CDSL_CURRENT)) {
+ 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;
@@ -475,23 +491,58 @@ main (int argc, char **argv)
for (x_slot=0; x_slot<total_slots_available; x_slot++) {
printf ("Slot %2d: ", x_slot+1);
- switch (ioctl (fd, CDROM_DRIVE_STATUS, x_slot)) {
+ 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.");
+ printf ("No Information available.");
break;
default:
printf ("This Should not happen!\n");
break;
}
- switch (ioctl (fd, CDROM_MEDIA_CHANGED, x_slot)) {
+ 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 ("\t\tChanged.\n");
+ printf ("Changed.\n");
break;
default:
printf ("\n");
diff --git a/Documentation/cdrom/isp16 b/Documentation/cdrom/isp16
index 2f43a42ec..7dcf6f9c9 100644
--- a/Documentation/cdrom/isp16
+++ b/Documentation/cdrom/isp16
@@ -82,7 +82,7 @@ The default values are
dma=0
drive_type=Sanyo
reflecting my own configuration. The defaults can be changed in
-the file ~/include/linux/ips16.h.
+the file linux/drivers/cdrom/ips16.h.
The cdrom interface can be configured at run time by loading the
initialisation driver as a module. In that case, the interface
diff --git a/Documentation/cdrom/sbpcd b/Documentation/cdrom/sbpcd
index dca6a2f93..7e43d9ce4 100644
--- a/Documentation/cdrom/sbpcd
+++ b/Documentation/cdrom/sbpcd
@@ -88,7 +88,7 @@ Mozart card - I simply had to add
to configure the CDROM interface for type "Panasonic" (LaserMate) and address
0x340.
-The interface type has to get configured in /usr/include/linux/sbpcd.h,
+The interface type has to get configured in linux/drivers/cdrom/sbpcd.h,
because the register layout is different between the "SoundBlaster" and the
"LaserMate" type.
@@ -176,7 +176,7 @@ This release consists of
- this README file
- the driver file linux/drivers/cdrom/sbpcd.c
- the stub files linux/drivers/cdrom/sbpcd[234].c
-- the header file linux/include/linux/sbpcd.h.
+- the header file linux/drivers/cdrom/sbpcd.h.
To install:
@@ -189,7 +189,7 @@ To install:
correct if you can mount a data CD. There is no choice for you with the
type; only one is the right, the others are deadly wrong.
- a. Go into /usr/src/linux/include/linux/sbpcd.h and configure it for your
+ a. Go into /usr/src/linux/drivers/cdrom/sbpcd.h and configure it for your
hardware (near the beginning):
a1. Set it up for the appropriate type of interface board.
"Original" CreativeLabs sound cards need "SBPRO 1".
@@ -568,10 +568,10 @@ Appendix -- the "cdtester" utility:
#include <linux/cdrom.h>
#ifdef AZT_PRIVATE_IOCTLS
-#include <linux/aztcd.h>
+#include <linux/../../drivers/cdrom/aztcd.h>
#endif AZT_PRIVATE_IOCTLS
#ifdef SBP_PRIVATE_IOCTLS
-#include <linux/sbpcd.h>
+#include <linux/../../drivers/cdrom/sbpcd.h>
#include <linux/fs.h>
#endif SBP_PRIVATE_IOCTLS
diff --git a/Documentation/cdrom/sjcd b/Documentation/cdrom/sjcd
index 5357b9c9b..2ebaf4f4d 100644
--- a/Documentation/cdrom/sjcd
+++ b/Documentation/cdrom/sjcd
@@ -39,7 +39,7 @@ through the use of command line options: type at the "boot:" prompt:
file /etc/lilo.conf). You could also use 'append="sjcd=<configuration_info>"'
in the appropriate section of /etc/lilo.conf
If you're building a kernel yourself you can set your default base
-i/o address with SJCD_BASE_ADDR in include/linux/sjcd.h.
+i/o address with SJCD_BASE_ADDR in /usr/src/linux/drivers/cdrom/sjcd.h.
The sjcd driver supports being loaded as a module. The following
command will set the base i/o address on the fly (assuming you
diff --git a/Documentation/cdrom/sonycd535 b/Documentation/cdrom/sonycd535
index 71d3a8649..b7bf48d8a 100644
--- a/Documentation/cdrom/sonycd535
+++ b/Documentation/cdrom/sonycd535
@@ -36,7 +36,7 @@ REQUIREMENTS
recognized
- you must enter your interface address into
- /usr/src/linux/include/linux/sonycd535.h and build the
+ /usr/src/linux/drivers/cdrom/sonycd535.h and build the
appropriate kernel or use the "kernel command line" parameter
sonycd535=0x320
with the correct interface address.