3731 lines · 98.7 KB · C
RawDownload
/* linux/drivers/cdrom/cdrom.c   Copyright (c) 1996, 1997 David A. van Leeuwen.   Copyright (c) 1997, 1998 Erik Andersen <andersee@debian.org>   Copyright (c) 1998, 1999 Jens Axboe <axboe@image.dk>    May be copied or modified under the terms of the GNU General Public   License.  See linux/COPYING for more information.    Uniform CD-ROM driver for Linux.   See Documentation/cdrom/cdrom-standard.rst for usage information.    The routines in the file provide a uniform interface between the   software that uses CD-ROMs and the various low-level drivers that   actually talk to the hardware. Suggestions are welcome.   Patches that work are more welcome though.  ;-)  Revision History ---------------------------------- 1.00  Date Unknown -- David van Leeuwen <david@tm.tno.nl> -- Initial version by David A. van Leeuwen. I don't have a detailed  changelog for the 1.x series, David? 2.00  Dec  2, 1997 -- Erik Andersen <andersee@debian.org>  -- New maintainer! As David A. van Leeuwen has been too busy to actively  maintain and improve this driver, I am now carrying on the torch. If  you have a problem with this driver, please feel free to contact me.   -- Added (rudimentary) sysctl interface. I realize this is really weak  right now, and is _very_ badly implemented. It will be improved...   -- Modified CDROM_DISC_STATUS so that it is now incorporated into  the Uniform CD-ROM driver via the cdrom_count_tracks function.  The cdrom_count_tracks function helps resolve some of the false  assumptions of the CDROM_DISC_STATUS ioctl, and is also used to check  for the correct media type when mounting or playing audio from a CD.   -- Remove the calls to verify_area and only use the copy_from_user and  copy_to_user stuff, since these calls now provide their own memory  checking with the 2.1.x kernels.   -- Major update to return codes so that errors from low-level drivers  are passed on through (thanks to Gerd Knorr for pointing out this  problem).   -- Made it so if a function isn't implemented in a low-level driver,  ENOSYS is now returned instead of EINVAL.   -- Simplified some complex logic so that the source code is easier to read.   -- Other stuff I probably forgot to mention (lots of changes). 2.01 to 2.11 Dec 1997-Jan 1998  -- TO-DO!  Write changelogs for 2.01 to 2.12. 2.12  Jan  24, 1998 -- Erik Andersen <andersee@debian.org>  -- Fixed a bug in the IOCTL_IN and IOCTL_OUT macros.  It turns out that  copy_*_user does not return EFAULT on error, but instead returns the number   of bytes not copied.  I was returning whatever non-zero stuff came back from   the copy_*_user functions directly, which would result in strange errors. 2.13  July 17, 1998 -- Erik Andersen <andersee@debian.org>  -- Fixed a bug in CDROM_SELECT_SPEED where you couldn't lower the speed  of the drive.  Thanks to Tobias Ringstr|m <tori@prosolvia.se> for pointing  this out and providing a simple fix.  -- Fixed the procfs-unload-module bug with the fill_inode procfs callback.  thanks to Andrea Arcangeli  -- Fixed it so that the /proc entry now also shows up when cdrom is  compiled into the kernel.  Before it only worked when loaded as a module.   2.14 August 17, 1998 -- Erik Andersen <andersee@debian.org>  -- Fixed a bug in cdrom_media_changed and handling of reporting that  the media had changed for devices that _don't_ implement media_changed.    Thanks to Grant R. Guenther <grant@torque.net> for spotting this bug.  -- Made a few things more pedanticly correct. 2.50 Oct 19, 1998 - Jens Axboe <axboe@image.dk>  -- New maintainers! Erik was too busy to continue the work on the driver,  so now Chris Zwilling <chris@cloudnet.com> and Jens Axboe <axboe@image.dk>  will do their best to follow in his footsteps    2.51 Dec 20, 1998 - Jens Axboe <axboe@image.dk>  -- Check if drive is capable of doing what we ask before blindly changing  cdi->options in various ioctl.  -- Added version to proc entry.    2.52 Jan 16, 1999 - Jens Axboe <axboe@image.dk>  -- Fixed an error in open_for_data where we would sometimes not return  the correct error value. Thanks Huba Gaspar <huba@softcell.hu>.  -- Fixed module usage count - usage was based on /proc/sys/dev  instead of /proc/sys/dev/cdrom. This could lead to an oops when other  modules had entries in dev. Feb 02 - real bug was in sysctl.c where  dev would be removed even though it was used. cdrom.c just illuminated  that bug.    2.53 Feb 22, 1999 - Jens Axboe <axboe@image.dk>  -- Fixup of several ioctl calls, in particular CDROM_SET_OPTIONS has  been "rewritten" because capabilities and options aren't in sync. They  should be...  -- Added CDROM_LOCKDOOR ioctl. Locks the door and keeps it that way.  -- Added CDROM_RESET ioctl.  -- Added CDROM_DEBUG ioctl. Enable debug messages on-the-fly.  -- Added CDROM_GET_CAPABILITY ioctl. This relieves userspace programs  from parsing /proc/sys/dev/cdrom/info.    2.54 Mar 15, 1999 - Jens Axboe <axboe@image.dk>  -- Check capability mask from low level driver when counting tracks as  per suggestion from Corey J. Scotts <cstotts@blue.weeg.uiowa.edu>.    2.55 Apr 25, 1999 - Jens Axboe <axboe@image.dk>  -- autoclose was mistakenly checked against CDC_OPEN_TRAY instead of  CDC_CLOSE_TRAY.  -- proc info didn't mask against capabilities mask.    3.00 Aug 5, 1999 - Jens Axboe <axboe@image.dk>  -- Unified audio ioctl handling across CD-ROM drivers. A lot of the  code was duplicated before. Drives that support the generic packet  interface are now being fed packets from here instead.  -- First attempt at adding support for MMC2 commands - for DVD and  CD-R(W) drives. Only the DVD parts are in now - the interface used is  the same as for the audio ioctls.  -- ioctl cleanups. if a drive couldn't play audio, it didn't get  a change to perform device specific ioctls as well.  -- Defined CDROM_CAN(CDC_XXX) for checking the capabilities.  -- Put in sysctl files for autoclose, autoeject, check_media, debug,  and lock.  -- /proc/sys/dev/cdrom/info has been updated to also contain info about  CD-Rx and DVD capabilities.  -- Now default to checking media type.  -- CDROM_SEND_PACKET ioctl added. The infrastructure was in place for  doing this anyway, with the generic_packet addition.    3.01 Aug 6, 1999 - Jens Axboe <axboe@image.dk>  -- Fix up the sysctl handling so that the option flags get set  correctly.  -- Fix up ioctl handling so the device specific ones actually get  called :).    3.02 Aug 8, 1999 - Jens Axboe <axboe@image.dk>  -- Fixed volume control on SCSI drives (or others with longer audio  page).  -- Fixed a couple of DVD minors. Thanks to Andrew T. Veliath  <andrewtv@usa.net> for telling me and for having defined the various  DVD structures and ioctls in the first place! He designed the original  DVD patches for ide-cd and while I rearranged and unified them, the  interface is still the same.    3.03 Sep 1, 1999 - Jens Axboe <axboe@image.dk>  -- Moved the rest of the audio ioctls from the CD-ROM drivers here. Only  CDROMREADTOCENTRY and CDROMREADTOCHDR are left.  -- Moved the CDROMREADxxx ioctls in here.  -- Defined the cdrom_get_last_written and cdrom_get_next_block as ioctls  and exported functions.  -- Erik Andersen <andersen@xmission.com> modified all SCMD_ commands  to now read GPCMD_ for the new generic packet interface. All low level  drivers are updated as well.  -- Various other cleanups.   3.04 Sep 12, 1999 - Jens Axboe <axboe@image.dk>  -- Fixed a couple of possible memory leaks (if an operation failed and  we didn't free the buffer before returning the error).  -- Integrated Uniform CD Changer handling from Richard Sharman  <rsharman@pobox.com>.  -- Defined CD_DVD and CD_CHANGER log levels.  -- Fixed the CDROMREADxxx ioctls.  -- CDROMPLAYTRKIND uses the GPCMD_PLAY_AUDIO_MSF command - too few  drives supported it. We lose the index part, however.  -- Small modifications to accommodate opens of /dev/hdc1, required  for ide-cd to handle multisession discs.  -- Export cdrom_mode_sense and cdrom_mode_select.  -- init_cdrom_command() for setting up a cgc command.    3.05 Oct 24, 1999 - Jens Axboe <axboe@image.dk>  -- Changed the interface for CDROM_SEND_PACKET. Before it was virtually  impossible to send the drive data in a sensible way.  -- Lowered stack usage in mmc_ioctl(), dvd_read_disckey(), and  dvd_read_manufact.  -- Added setup of write mode for packet writing.  -- Fixed CDDA ripping with cdda2wav - accept much larger requests of  number of frames and split the reads in blocks of 8.   3.06 Dec 13, 1999 - Jens Axboe <axboe@image.dk>  -- Added support for changing the region of DVD drives.  -- Added sense data to generic command.   3.07 Feb 2, 2000 - Jens Axboe <axboe@suse.de>  -- Do same "read header length" trick in cdrom_get_disc_info() as  we do in cdrom_get_track_info() -- some drive don't obey specs and  fail if they can't supply the full Mt Fuji size table.  -- Deleted stuff related to setting up write modes. It has a different  home now.  -- Clear header length in mode_select unconditionally.  -- Removed the register_disk() that was added, not needed here.   3.08 May 1, 2000 - Jens Axboe <axboe@suse.de>  -- Fix direction flag in setup_send_key and setup_report_key. This  gave some SCSI adapters problems.  -- Always return -EROFS for write opens  -- Convert to module_init/module_exit style init and remove some  of the #ifdef MODULE stuff  -- Fix several dvd errors - DVD_LU_SEND_ASF should pass agid,  DVD_HOST_SEND_RPC_STATE did not set buffer size in cdb, and  dvd_do_auth passed uninitialized data to drive because init_cdrom_command  did not clear a 0 sized buffer.    3.09 May 12, 2000 - Jens Axboe <axboe@suse.de>  -- Fix Video-CD on SCSI drives that don't support READ_CD command. In  that case switch block size and issue plain READ_10 again, then switch  back.   3.10 Jun 10, 2000 - Jens Axboe <axboe@suse.de>  -- Fix volume control on CD's - old SCSI-II drives now use their own  code, as doing MODE6 stuff in here is really not my intention.  -- Use READ_DISC_INFO for more reliable end-of-disc.   3.11 Jun 12, 2000 - Jens Axboe <axboe@suse.de>  -- Fix bug in getting rpc phase 2 region info.  -- Reinstate "correct" CDROMPLAYTRKIND    3.12 Oct 18, 2000 - Jens Axboe <axboe@suse.de>  -- Use quiet bit on packet commands not known to work    3.20 Dec 17, 2003 - Jens Axboe <axboe@suse.de>  -- Various fixes and lots of cleanups not listed :-)  -- Locking fixes  -- Mt Rainier support  -- DVD-RAM write open fixes   Nov 5 2001, Aug 8 2002. Modified by Andy Polyakov  <appro@fy.chalmers.se> to support MMC-3 compliant DVD+RW units.   Modified by Nigel Kukard <nkukard@lbsd.net> - support DVD+RW  2.4.x patch by Andy Polyakov <appro@fy.chalmers.se> -------------------------------------------------------------------------*/ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #define REVISION "Revision: 3.20"#define VERSION "Id: cdrom.c 3.20 2003/12/17" /* I use an error-log mask to give fine grain control over the type of   messages dumped to the system logs.  The available masks include: */#define CD_NOTHING      0x0#define CD_WARNING	0x1#define CD_REG_UNREG	0x2#define CD_DO_IOCTL	0x4#define CD_OPEN		0x8#define CD_CLOSE	0x10#define CD_COUNT_TRACKS 0x20#define CD_CHANGER	0x40#define CD_DVD		0x80 /* Define this to remove _all_ the debugging messages *//* #define ERRLOGMASK CD_NOTHING */#define ERRLOGMASK CD_WARNING/* #define ERRLOGMASK (CD_WARNING|CD_OPEN|CD_COUNT_TRACKS|CD_CLOSE) *//* #define ERRLOGMASK (CD_WARNING|CD_REG_UNREG|CD_DO_IOCTL|CD_OPEN|CD_CLOSE|CD_COUNT_TRACKS) */ #include <linux/atomic.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/major.h>#include <linux/types.h>#include <linux/errno.h>#include <linux/kernel.h>#include <linux/mm.h>#include <linux/nospec.h>#include <linux/slab.h> #include <linux/cdrom.h>#include <linux/sysctl.h>#include <linux/proc_fs.h>#include <linux/blkpg.h>#include <linux/init.h>#include <linux/fcntl.h>#include <linux/blkdev.h>#include <linux/times.h>#include <linux/uaccess.h>#include <scsi/scsi_common.h> /* used to tell the module to turn on full debugging messages */static bool debug;/* default compatibility mode */static bool autoclose=1;static bool autoeject;static bool lockdoor = 1;/* will we ever get to use this... sigh. */static bool check_media_type;/* automatically restart mrw format */static bool mrw_format_restart = 1;module_param(debug, bool, 0);module_param(autoclose, bool, 0);module_param(autoeject, bool, 0);module_param(lockdoor, bool, 0);module_param(check_media_type, bool, 0);module_param(mrw_format_restart, bool, 0); static DEFINE_MUTEX(cdrom_mutex); static const char *mrw_format_status[] = {	"not mrw",	"bgformat inactive",	"bgformat active",	"mrw complete",}; static const char *mrw_address_space[] = { "DMA", "GAA" }; #if (ERRLOGMASK != CD_NOTHING)#define cd_dbg(type, fmt, ...)				\do {							\	if ((ERRLOGMASK & type) || debug == 1)		\		pr_debug(fmt, ##__VA_ARGS__);		\} while (0)#else#define cd_dbg(type, fmt, ...)				\do {							\	if (0 && (ERRLOGMASK & type) || debug == 1)	\		pr_debug(fmt, ##__VA_ARGS__);		\} while (0)#endif /* The (cdo->capability & ~cdi->mask & CDC_XXX) construct was used in   a lot of places. This macro makes the code more clear. */#define CDROM_CAN(type) (cdi->ops->capability & ~cdi->mask & (type)) /* * Another popular OS uses 7 seconds as the hard timeout for default * commands, so it is a good choice for us as well. */#define CDROM_DEF_TIMEOUT	(7 * HZ) /* Not-exported routines. */ static void cdrom_sysctl_register(void); static LIST_HEAD(cdrom_list); static void signal_media_change(struct cdrom_device_info *cdi){	cdi->mc_flags = 0x3; /* set media changed bits, on both queues */	cdi->last_media_change_ms = ktime_to_ms(ktime_get());} int cdrom_dummy_generic_packet(struct cdrom_device_info *cdi,			       struct packet_command *cgc){	if (cgc->sshdr) {		cgc->sshdr->sense_key = 0x05;		cgc->sshdr->asc = 0x20;		cgc->sshdr->ascq = 0x00;	} 	cgc->stat = -EIO;	return -EIO;}EXPORT_SYMBOL(cdrom_dummy_generic_packet); static int cdrom_flush_cache(struct cdrom_device_info *cdi){	struct packet_command cgc; 	init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);	cgc.cmd[0] = GPCMD_FLUSH_CACHE; 	cgc.timeout = 5 * 60 * HZ; 	return cdi->ops->generic_packet(cdi, &cgc);} /* requires CD R/RW */static int cdrom_get_disc_info(struct cdrom_device_info *cdi,			       disc_information *di){	const struct cdrom_device_ops *cdo = cdi->ops;	struct packet_command cgc;	int ret, buflen; 	/* set up command and get the disc info */	init_cdrom_command(&cgc, di, sizeof(*di), CGC_DATA_READ);	cgc.cmd[0] = GPCMD_READ_DISC_INFO;	cgc.cmd[8] = cgc.buflen = 2;	cgc.quiet = 1; 	ret = cdo->generic_packet(cdi, &cgc);	if (ret)		return ret; 	/* not all drives have the same disc_info length, so requeue	 * packet with the length the drive tells us it can supply	 */	buflen = be16_to_cpu(di->disc_information_length) +		sizeof(di->disc_information_length); 	if (buflen > sizeof(disc_information))		buflen = sizeof(disc_information); 	cgc.cmd[8] = cgc.buflen = buflen;	ret = cdo->generic_packet(cdi, &cgc);	if (ret)		return ret; 	/* return actual fill size */	return buflen;} /* This macro makes sure we don't have to check on cdrom_device_ops * existence in the run-time routines below. Change_capability is a * hack to have the capability flags defined const, while we can still * change it here without gcc complaining at every line. */#define ENSURE(cdo, call, bits)					\do {								\	if (cdo->call == NULL)					\		WARN_ON_ONCE((cdo)->capability & (bits));	\} while (0) /* * the first prototypes used 0x2c as the page code for the mrw mode page, * subsequently this was changed to 0x03. probe the one used by this drive */static int cdrom_mrw_probe_pc(struct cdrom_device_info *cdi){	struct packet_command cgc;	char buffer[16]; 	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ); 	cgc.timeout = HZ;	cgc.quiet = 1; 	if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC, 0)) {		cdi->mrw_mode_page = MRW_MODE_PC;		return 0;	} else if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC_PRE1, 0)) {		cdi->mrw_mode_page = MRW_MODE_PC_PRE1;		return 0;	} 	return 1;} static int cdrom_is_mrw(struct cdrom_device_info *cdi, int *write){	struct packet_command cgc;	struct mrw_feature_desc *mfd;	unsigned char buffer[16];	int ret; 	*write = 0; 	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ); 	cgc.cmd[0] = GPCMD_GET_CONFIGURATION;	cgc.cmd[3] = CDF_MRW;	cgc.cmd[8] = sizeof(buffer);	cgc.quiet = 1; 	if ((ret = cdi->ops->generic_packet(cdi, &cgc)))		return ret; 	mfd = (struct mrw_feature_desc *)&buffer[sizeof(struct feature_header)];	if (be16_to_cpu(mfd->feature_code) != CDF_MRW)		return 1;	*write = mfd->write; 	if ((ret = cdrom_mrw_probe_pc(cdi))) {		*write = 0;		return ret;	} 	return 0;} static int cdrom_mrw_bgformat(struct cdrom_device_info *cdi, int cont){	struct packet_command cgc;	unsigned char buffer[12];	int ret; 	pr_info("%sstarting format\n", cont ? "Re" : ""); 	/*	 * FmtData bit set (bit 4), format type is 1	 */	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_WRITE);	cgc.cmd[0] = GPCMD_FORMAT_UNIT;	cgc.cmd[1] = (1 << 4) | 1; 	cgc.timeout = 5 * 60 * HZ; 	/*	 * 4 byte format list header, 8 byte format list descriptor	 */	buffer[1] = 1 << 1;	buffer[3] = 8; 	/*	 * nr_blocks field	 */	buffer[4] = 0xff;

Lines 1–500 of 3731.