diff options
Diffstat (limited to 'share/man/man4/cd.4')
-rw-r--r-- | share/man/man4/cd.4 | 540 |
1 files changed, 540 insertions, 0 deletions
diff --git a/share/man/man4/cd.4 b/share/man/man4/cd.4 new file mode 100644 index 000000000000..ec16751c6f1a --- /dev/null +++ b/share/man/man4/cd.4 @@ -0,0 +1,540 @@ +.\" Copyright (c) 1996 +.\" Julian Elischer <julian@FreeBSD.org>. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd January 8, 2009 +.Dt CD 4 +.Os +.Sh NAME +.Nm cd +.Nd SCSI CD-ROM driver +.Sh SYNOPSIS +.Cd device cd +.Cd "options ""CHANGER_MIN_BUSY_SECONDS=3""" +.Cd "options ""CHANGER_MAX_BUSY_SECONDS=11"" +.Sh DESCRIPTION +The +.Nm +driver provides support for a +.Tn SCSI +.Tn CD-ROM +(Compact Disc-Read Only Memory) drive. +In an attempt to look like a regular disk, the +.Nm +driver synthesizes a partition table, with one partition covering the entire +.Tn CD-ROM . +It is possible to modify this partition table using +.Xr disklabel 8 , +but it will only last until the +.Tn CD-ROM +is unmounted. +In general the interfaces are similar to those described by +.Xr ad 4 +and +.Xr da 4 . +.Pp +As the +.Tn SCSI +adapter is probed during boot, the +.Tn SCSI +bus is scanned for devices. +Any devices found which answer as CDROM +(type 5) or WORM (type 4) type devices will be `attached' to the +.Nm +driver. +Prior to +.Fx 2.1 , +the first device found will be attached as +.Li cd0 +the next, +.Li cd1 , +etc. +Beginning in +.Fx 2.1 +it is possible to specify what cd unit a device should +come on line as; refer to +.Xr scsi 4 +for details on kernel configuration. +.Pp +The system utility +.Xr disklabel 8 +may be used to read the synthesized +disk label +structure, which will contain correct figures for the size of the +.Tn CD-ROM +should that information be required. +.Sh KERNEL CONFIGURATION +Any number of +.Tn CD-ROM +devices may be attached to the system regardless of system +configuration as all resources are dynamically allocated. +.Sh IOCTLS +The following +.Xr ioctl 2 +calls which apply to +.Tn SCSI +.Tn CD-ROM +drives are defined +in the header files +.In sys/cdio.h +and +.In sys/disklabel.h . +.Pp +.Bl -tag -width CDIOCREADSUBCHANNEL +.It Dv DIOCGDINFO +.It Dv DIOCSDINFO +.Pq Li "struct disklabel" +Read or write the in-core copy of the disklabel for the +drive. +The disklabel is initialized with information +read from the scsi inquiry commands, and should be the same as +the information printed at boot. +This structure is defined in +.Xr disklabel 5 . +.It Dv CDIOCCAPABILITY +.Pq Li "struct ioc_capability" +Retrieve information from the drive on what features it supports. +The information is returned in the following structure: +.Bd -literal -offset indent +struct ioc_capability { + u_long play_function; +#define CDDOPLAYTRK 0x00000001 + /* Can play tracks/index */ +#define CDDOPLAYMSF 0x00000002 + /* Can play msf to msf */ +#define CDDOPLAYBLOCKS 0x00000004 + /* Can play range of blocks */ +#define CDDOPAUSE 0x00000100 + /* Output can be paused */ +#define CDDORESUME 0x00000200 + /* Output can be resumed */ +#define CDDORESET 0x00000400 + /* Drive can be completely reset */ +#define CDDOSTART 0x00000800 + /* Audio can be started */ +#define CDDOSTOP 0x00001000 + /* Audio can be stopped */ +#define CDDOPITCH 0x00002000 + /* Audio pitch can be changed */ + + u_long routing_function; +#define CDREADVOLUME 0x00000001 + /* Volume settings can be read */ +#define CDSETVOLUME 0x00000002 + /* Volume settings can be set */ +#define CDSETMONO 0x00000100 + /* Output can be set to mono */ +#define CDSETSTEREO 0x00000200 + /* Output can be set to stereo (def) */ +#define CDSETLEFT 0x00000400 + /* Output can be set to left only */ +#define CDSETRIGHT 0x00000800 + /* Output can be set to right only */ +#define CDSETMUTE 0x00001000 + /* Output can be muted */ +#define CDSETPATCH 0x00008000 + /* Direct routing control allowed */ + + u_long special_function; +#define CDDOEJECT 0x00000001 + /* The tray can be opened */ +#define CDDOCLOSE 0x00000002 + /* The tray can be closed */ +#define CDDOLOCK 0x00000004 + /* The tray can be locked */ +#define CDREADHEADER 0x00000100 + /* Can read Table of Contents */ +#define CDREADENTRIES 0x00000200 + /* Can read TOC Entries */ +#define CDREADSUBQ 0x00000200 + /* Can read Subchannel info */ +#define CDREADRW 0x00000400 + /* Can read subcodes R-W */ +#define CDHASDEBUG 0x00004000 + /* The tray has dynamic debugging */ +}; +.Ed +.It Dv CDIOCPLAYTRACKS +.Pq Li "struct ioc_play_track" +Start audio playback given a track address and length. +The structure is defined as follows: +.Bd -literal -offset indent +struct ioc_play_track +{ + u_char start_track; + u_char start_index; + u_char end_track; + u_char end_index; +}; +.Ed +.It Dv CDIOCPLAYBLOCKS +.Pq Li "struct ioc_play_blocks" +Start audio playback given a block address and length. +The structure is defined as follows: +.Bd -literal -offset indent +struct ioc_play_blocks +{ + int blk; + int len; +}; +.Ed +.It Dv CDIOCPLAYMSF +.Pq Li "struct ioc_play_msf" +Start audio playback given a `minutes-seconds-frames' address and +length. +The structure is defined as follows: +.Bd -literal -offset indent +struct ioc_play_msf +{ + u_char start_m; + u_char start_s; + u_char start_f; + u_char end_m; + u_char end_s; + u_char end_f; +}; +.Ed +.It Dv CDIOCREADSUBCHANNEL +.Pq Li "struct ioc_read_subchannel" +Read information from the subchannel at the location specified by this +structure: +.Bd -literal -offset indent +struct ioc_read_subchannel { + u_char address_format; +#define CD_LBA_FORMAT 1 +#define CD_MSF_FORMAT 2 + u_char data_format; +#define CD_SUBQ_DATA 0 +#define CD_CURRENT_POSITION 1 +#define CD_MEDIA_CATALOG 2 +#define CD_TRACK_INFO 3 + u_char track; + int data_len; + struct cd_sub_channel_info *data; +}; +.Ed +.It Dv CDIOREADTOCHEADER +.Pq Li "struct ioc_toc_header" +Return summary information about the table of contents for the mounted +.Tn CD-ROM . +The information is returned into the following structure: +.Bd -literal -offset indent +struct ioc_toc_header { + u_short len; + u_char starting_track; + u_char ending_track; +}; +.Ed +.It Dv CDIOREADTOCENTRYS +.Pq Li "struct ioc_read_toc_entry" +Return information from the table of contents entries mentioned. +.Pq Yes, this command name is misspelled. +The argument structure is defined as follows: +.Bd -literal -offset indent +struct ioc_read_toc_entry { + u_char address_format; + u_char starting_track; + u_short data_len; + struct cd_toc_entry *data; +}; +.Ed +The requested data is written into an area of size +.Li data_len +and pointed to by +.Li data . +.It Dv CDIOCSETPATCH +.Pq Li "struct ioc_patch" +Attach various audio channels to various output channels. +The argument structure is defined thusly: +.Bd -literal -offset indent +struct ioc_patch { + u_char patch[4]; + /* one for each channel */ +}; +.Ed +.It Dv CDIOCGETVOL +.It Dv CDIOCSETVOL +.Pq Li "struct ioc_vol" +Get (set) information about the volume settings of the output channels. +The argument structure is as follows: +.Bd -literal -offset indent +struct ioc_vol +{ + u_char vol[4]; + /* one for each channel */ +}; +.Ed +.It Dv CDIOCSETMONO +Patch all output channels to all source channels. +.It Dv CDIOCSETSTEREO +Patch left source channel to the left output channel and the right +source channel to the right output channel. +.It Dv CDIOCSETMUTE +Mute output without changing the volume settings. +.It Dv CDIOCSETLEFT +.It Dv CDIOCSETRIGHT +Attach both output channels to the left (right) source channel. +.It Dv CDIOCSETDEBUG +.It Dv CDIOCCLRDEBUG +Turn on (off) debugging for the appropriate device. +.It Dv CDIOCPAUSE +.It Dv CDIOCRESUME +Pause (resume) audio play, without resetting the location of the read-head. +.It Dv CDIOCRESET +Reset the drive. +.It Dv CDIOCSTART +.It Dv CDIOCSTOP +Tell the drive to spin-up (-down) the +.Tn CD-ROM . +.It Dv CDIOCALLOW +.It Dv CDIOCPREVENT +Tell the drive to allow (prevent) manual ejection of the +.Tn CD-ROM +disc. +Not all drives support this feature. +.It Dv CDIOCEJECT +Eject the +.Tn CD-ROM . +.It Dv CDIOCCLOSE +Tell the drive to close its door and load the media. +Not all drives support this feature. +.It Dv CDIOCPITCH +.Pq Li "struct ioc_pitch" +For drives that support it, this command instructs the drive to play +the audio at a faster or slower rate than normal. +Values of +.Li speed +between -32767 and -1 result in slower playback; a zero value +indicates normal speed; and values from 1 to 32767 give faster +playback. +Drives with less than 16 bits of resolution will silently +ignore less-significant bits. +The structure is defined thusly: +.Bd -literal -offset indent +struct ioc_pitch +{ + short speed; +}; +.Ed +.El +.Sh NOTES +When a +.Tn CD-ROM +is changed in a drive controlled by the +.Nm +driver, then the act of changing the media will invalidate the +disklabel and information held within the kernel. +To stop corruption, +all accesses to the device will be discarded until there are no more +open file descriptors referencing the device. +During this period, all +new open attempts will be rejected. +When no more open file descriptors +reference the device, the first next open will load a new set of +parameters (including disklabel) for the drive. +.Pp +The audio code in the +.Nm +driver only support +.Tn SCSI-2 +standard audio commands. +As many +.Tn CD-ROM +manufacturers have not followed the standard, there are many +.Tn CD-ROM +drives for which audio will not work. +Some work is planned to support +some of the more common `broken' +.Tn CD-ROM +drives; however, this is not yet under way. +.Sh CHANGER OPERATION +This driver has built-in support for LUN-based CD changers. +A LUN-based CD +changer is a drive that can hold two or more CDs, but only has one CD +player mechanism. +Each CD in the drive shows up as a separate logical unit +on the +.Tn SCSI +bus. +The +.Nm +driver automatically recognizes LUN-based changers, and routes commands for +changers through an internal scheduler. +The scheduler prevents changer +"thrashing", which is caused by sending commands to different LUNs in the +changer at the same time. +.Pp +The scheduler honors minimum and maximum time +quanta that the driver will spend on a particular LUN. +The minimum time +is the guaranteed minimum amount of time that the driver will spend on a +given LUN, even if there is no outstanding I/O for that LUN. +The maximum +time is the maximum amount of time the changer will spend on a LUN if there +is outstanding I/O for another LUN. +If there is no outstanding I/O for +another LUN, the driver will allow indefinite access to a given LUN. +.Pp +The minimum and maximum time quanta are configurable via kernel options and +also via sysctl and kernel tunable variables. +The kernel options are: +.Pp +.Bl -item -compact +.It +.Cd "options ""CHANGER_MIN_BUSY_SECONDS=3""" +.It +.Cd "options ""CHANGER_MAX_BUSY_SECONDS=11""" +.El +.Pp +The sysctl/kernel tunable variables are: +.Pp +.Bl -item -compact +.It +.Va kern.cam.cd.changer.min_busy_seconds +.It +.Va kern.cam.cd.changer.max_busy_seconds +.El +.Pp +It is suggested that the user try experimenting with the minimum and +maximum timeouts via the sysctl variables to arrive at the proper values +for your changer. +Once you have settled on the proper timeouts for your +changer, you can then put them in your kernel config file. +.Pp +If your system does have a LUN-based changer, you may notice that the +probe messages for the various LUNs of the changer will continue to appear +while the boot process is going on. +This is normal, and is caused by the +changer scheduling code. +.Sh SYSCTL VARIABLES +The following variables are available as both +.Xr sysctl 8 +variables and +.Xr loader 8 +tunables: +.Bl -tag -width 12 +.It kern.cam.cd.retry_count +.Pp +This variable determines how many times the +.Nm +driver will retry a READ or WRITE command. +This does not affect the number of retries used during probe time or for +the +.Nm +driver dump routine. +This value currently defaults to 4. +.It kern.cam.cd.%d.minimum_cmd_size +.Pp +The +.Nm +driver attempts to automatically determine whether the drive it is talking +to supports 6 byte or 10 byte MODE SENSE/MODE SELECT operations. +Many +.Tn SCSI +drives only support 6 byte commands, and +.Tn ATAPI +drives only support 10 byte commands. +The +.Nm +driver first attempts to determine whether the protocol in use typically +supports 6 byte commands by issuing a CAM Path Inquiry CCB. +It will then default to 6 byte or 10 byte commands as appropriate. +After that, the +.Nm +driver defaults to using 6 byte commands (assuming the protocol the drive +speaks claims to support 6 byte commands), until one fails with a +.Tn SCSI +ILLEGAL REQUEST error. +Then it tries the 10 byte version of the command to +see if that works instead. +Users can change the default via per-drive +sysctl variables and loader tunables. +Where +.Dq %d +is the unit number of the drive in question. +Valid minimum command sizes +are 6 and 10. +Any value above 6 will be rounded to 10, and any value below +6 will be rounded to 6. +.It kern.cam.cd.changer.min_busy_seconds +.It kern.cam.cd.changer.max_busy_seconds +.Pp +Tune how long individual LUNs are 'locked' for I/O operations to +optimize changer operation. +See CHANGER OPERATION section for information on how to use these items. +.El +.Sh FILES +.Bl -tag -width /dev/cd[0-9][a-h] -compact +.It Pa /dev/cd[0-9][a-h] +raw mode +.Tn CD-ROM +devices +.El +.Sh DIAGNOSTICS +None. +.Sh SEE ALSO +.Xr da 4 , +.Xr scsi 4 , +.Xr disklabel 5 , +.Xr disklabel 8 , +.Xr cd 9 +.Sh HISTORY +This +.Nm +driver is based upon the +.Nm +driver written by Julian Elischer, which appeared in +.Bx 386 0.1 . +The +CAM version of the +.Nm +driver was written by Kenneth Merry and first appeared in +.Fx 3.0 . +.Sh BUGS +The names of the structures used for the third argument to +.Fn ioctl +were poorly chosen, and a number of spelling errors have survived in +the names of the +.Fn ioctl +commands. +.Pp +There is no mechanism currently to set different minimum and maximum +timeouts for different CD changers; the timeout values set by the kernel +options or the sysctl variables apply to all LUN-based CD changers in the +system. +It is possible to implement such support, but the sysctl +implementation at least would be rather inelegant, because of the current +inability of the sysctl code to handle the addition of nodes after compile +time. +Thus, it would take one dynamically sized sysctl variable and a +userland utility to get/set the timeout values. +Implementation of separate +timeouts for different CD devices in the kernel config file would likely +require modification of +.Xr config 8 +to support the two timeouts when hardwiring +.Nm +devices. |