linux/drivers/cdrom/cdrom.c
<<
>>
Prefs
   1/* linux/drivers/cdrom/cdrom.c
   2   Copyright (c) 1996, 1997 David A. van Leeuwen.
   3   Copyright (c) 1997, 1998 Erik Andersen <andersee@debian.org>
   4   Copyright (c) 1998, 1999 Jens Axboe <axboe@image.dk>
   5
   6   May be copied or modified under the terms of the GNU General Public
   7   License.  See linux/COPYING for more information.
   8
   9   Uniform CD-ROM driver for Linux.
  10   See Documentation/cdrom/cdrom-standard.rst for usage information.
  11
  12   The routines in the file provide a uniform interface between the
  13   software that uses CD-ROMs and the various low-level drivers that
  14   actually talk to the hardware. Suggestions are welcome.
  15   Patches that work are more welcome though.  ;-)
  16
  17 To Do List:
  18 ----------------------------------
  19
  20 -- Modify sysctl/proc interface. I plan on having one directory per
  21 drive, with entries for outputing general drive information, and sysctl
  22 based tunable parameters such as whether the tray should auto-close for
  23 that drive. Suggestions (or patches) for this welcome!
  24
  25
  26 Revision History
  27 ----------------------------------
  28 1.00  Date Unknown -- David van Leeuwen <david@tm.tno.nl>
  29 -- Initial version by David A. van Leeuwen. I don't have a detailed
  30  changelog for the 1.x series, David?
  31
  322.00  Dec  2, 1997 -- Erik Andersen <andersee@debian.org>
  33  -- New maintainer! As David A. van Leeuwen has been too busy to actively
  34  maintain and improve this driver, I am now carrying on the torch. If
  35  you have a problem with this driver, please feel free to contact me.
  36
  37  -- Added (rudimentary) sysctl interface. I realize this is really weak
  38  right now, and is _very_ badly implemented. It will be improved...
  39
  40  -- Modified CDROM_DISC_STATUS so that it is now incorporated into
  41  the Uniform CD-ROM driver via the cdrom_count_tracks function.
  42  The cdrom_count_tracks function helps resolve some of the false
  43  assumptions of the CDROM_DISC_STATUS ioctl, and is also used to check
  44  for the correct media type when mounting or playing audio from a CD.
  45
  46  -- Remove the calls to verify_area and only use the copy_from_user and
  47  copy_to_user stuff, since these calls now provide their own memory
  48  checking with the 2.1.x kernels.
  49
  50  -- Major update to return codes so that errors from low-level drivers
  51  are passed on through (thanks to Gerd Knorr for pointing out this
  52  problem).
  53
  54  -- Made it so if a function isn't implemented in a low-level driver,
  55  ENOSYS is now returned instead of EINVAL.
  56
  57  -- Simplified some complex logic so that the source code is easier to read.
  58
  59  -- Other stuff I probably forgot to mention (lots of changes).
  60
  612.01 to 2.11 Dec 1997-Jan 1998
  62  -- TO-DO!  Write changelogs for 2.01 to 2.12.
  63
  642.12  Jan  24, 1998 -- Erik Andersen <andersee@debian.org>
  65  -- Fixed a bug in the IOCTL_IN and IOCTL_OUT macros.  It turns out that
  66  copy_*_user does not return EFAULT on error, but instead returns the number 
  67  of bytes not copied.  I was returning whatever non-zero stuff came back from 
  68  the copy_*_user functions directly, which would result in strange errors.
  69
  702.13  July 17, 1998 -- Erik Andersen <andersee@debian.org>
  71  -- Fixed a bug in CDROM_SELECT_SPEED where you couldn't lower the speed
  72  of the drive.  Thanks to Tobias Ringstr|m <tori@prosolvia.se> for pointing
  73  this out and providing a simple fix.
  74  -- Fixed the procfs-unload-module bug with the fill_inode procfs callback.
  75  thanks to Andrea Arcangeli
  76  -- Fixed it so that the /proc entry now also shows up when cdrom is
  77  compiled into the kernel.  Before it only worked when loaded as a module.
  78
  79  2.14 August 17, 1998 -- Erik Andersen <andersee@debian.org>
  80  -- Fixed a bug in cdrom_media_changed and handling of reporting that
  81  the media had changed for devices that _don't_ implement media_changed.  
  82  Thanks to Grant R. Guenther <grant@torque.net> for spotting this bug.
  83  -- Made a few things more pedanticly correct.
  84
  852.50 Oct 19, 1998 - Jens Axboe <axboe@image.dk>
  86  -- New maintainers! Erik was too busy to continue the work on the driver,
  87  so now Chris Zwilling <chris@cloudnet.com> and Jens Axboe <axboe@image.dk>
  88  will do their best to follow in his footsteps
  89  
  90  2.51 Dec 20, 1998 - Jens Axboe <axboe@image.dk>
  91  -- Check if drive is capable of doing what we ask before blindly changing
  92  cdi->options in various ioctl.
  93  -- Added version to proc entry.
  94  
  95  2.52 Jan 16, 1999 - Jens Axboe <axboe@image.dk>
  96  -- Fixed an error in open_for_data where we would sometimes not return
  97  the correct error value. Thanks Huba Gaspar <huba@softcell.hu>.
  98  -- Fixed module usage count - usage was based on /proc/sys/dev
  99  instead of /proc/sys/dev/cdrom. This could lead to an oops when other
 100  modules had entries in dev. Feb 02 - real bug was in sysctl.c where
 101  dev would be removed even though it was used. cdrom.c just illuminated
 102  that bug.
 103  
 104  2.53 Feb 22, 1999 - Jens Axboe <axboe@image.dk>
 105  -- Fixup of several ioctl calls, in particular CDROM_SET_OPTIONS has
 106  been "rewritten" because capabilities and options aren't in sync. They
 107  should be...
 108  -- Added CDROM_LOCKDOOR ioctl. Locks the door and keeps it that way.
 109  -- Added CDROM_RESET ioctl.
 110  -- Added CDROM_DEBUG ioctl. Enable debug messages on-the-fly.
 111  -- Added CDROM_GET_CAPABILITY ioctl. This relieves userspace programs
 112  from parsing /proc/sys/dev/cdrom/info.
 113  
 114  2.54 Mar 15, 1999 - Jens Axboe <axboe@image.dk>
 115  -- Check capability mask from low level driver when counting tracks as
 116  per suggestion from Corey J. Scotts <cstotts@blue.weeg.uiowa.edu>.
 117  
 118  2.55 Apr 25, 1999 - Jens Axboe <axboe@image.dk>
 119  -- autoclose was mistakenly checked against CDC_OPEN_TRAY instead of
 120  CDC_CLOSE_TRAY.
 121  -- proc info didn't mask against capabilities mask.
 122  
 123  3.00 Aug 5, 1999 - Jens Axboe <axboe@image.dk>
 124  -- Unified audio ioctl handling across CD-ROM drivers. A lot of the
 125  code was duplicated before. Drives that support the generic packet
 126  interface are now being fed packets from here instead.
 127  -- First attempt at adding support for MMC2 commands - for DVD and
 128  CD-R(W) drives. Only the DVD parts are in now - the interface used is
 129  the same as for the audio ioctls.
 130  -- ioctl cleanups. if a drive couldn't play audio, it didn't get
 131  a change to perform device specific ioctls as well.
 132  -- Defined CDROM_CAN(CDC_XXX) for checking the capabilities.
 133  -- Put in sysctl files for autoclose, autoeject, check_media, debug,
 134  and lock.
 135  -- /proc/sys/dev/cdrom/info has been updated to also contain info about
 136  CD-Rx and DVD capabilities.
 137  -- Now default to checking media type.
 138  -- CDROM_SEND_PACKET ioctl added. The infrastructure was in place for
 139  doing this anyway, with the generic_packet addition.
 140  
 141  3.01 Aug 6, 1999 - Jens Axboe <axboe@image.dk>
 142  -- Fix up the sysctl handling so that the option flags get set
 143  correctly.
 144  -- Fix up ioctl handling so the device specific ones actually get
 145  called :).
 146  
 147  3.02 Aug 8, 1999 - Jens Axboe <axboe@image.dk>
 148  -- Fixed volume control on SCSI drives (or others with longer audio
 149  page).
 150  -- Fixed a couple of DVD minors. Thanks to Andrew T. Veliath
 151  <andrewtv@usa.net> for telling me and for having defined the various
 152  DVD structures and ioctls in the first place! He designed the original
 153  DVD patches for ide-cd and while I rearranged and unified them, the
 154  interface is still the same.
 155  
 156  3.03 Sep 1, 1999 - Jens Axboe <axboe@image.dk>
 157  -- Moved the rest of the audio ioctls from the CD-ROM drivers here. Only
 158  CDROMREADTOCENTRY and CDROMREADTOCHDR are left.
 159  -- Moved the CDROMREADxxx ioctls in here.
 160  -- Defined the cdrom_get_last_written and cdrom_get_next_block as ioctls
 161  and exported functions.
 162  -- Erik Andersen <andersen@xmission.com> modified all SCMD_ commands
 163  to now read GPCMD_ for the new generic packet interface. All low level
 164  drivers are updated as well.
 165  -- Various other cleanups.
 166
 167  3.04 Sep 12, 1999 - Jens Axboe <axboe@image.dk>
 168  -- Fixed a couple of possible memory leaks (if an operation failed and
 169  we didn't free the buffer before returning the error).
 170  -- Integrated Uniform CD Changer handling from Richard Sharman
 171  <rsharman@pobox.com>.
 172  -- Defined CD_DVD and CD_CHANGER log levels.
 173  -- Fixed the CDROMREADxxx ioctls.
 174  -- CDROMPLAYTRKIND uses the GPCMD_PLAY_AUDIO_MSF command - too few
 175  drives supported it. We lose the index part, however.
 176  -- Small modifications to accommodate opens of /dev/hdc1, required
 177  for ide-cd to handle multisession discs.
 178  -- Export cdrom_mode_sense and cdrom_mode_select.
 179  -- init_cdrom_command() for setting up a cgc command.
 180  
 181  3.05 Oct 24, 1999 - Jens Axboe <axboe@image.dk>
 182  -- Changed the interface for CDROM_SEND_PACKET. Before it was virtually
 183  impossible to send the drive data in a sensible way.
 184  -- Lowered stack usage in mmc_ioctl(), dvd_read_disckey(), and
 185  dvd_read_manufact.
 186  -- Added setup of write mode for packet writing.
 187  -- Fixed CDDA ripping with cdda2wav - accept much larger requests of
 188  number of frames and split the reads in blocks of 8.
 189
 190  3.06 Dec 13, 1999 - Jens Axboe <axboe@image.dk>
 191  -- Added support for changing the region of DVD drives.
 192  -- Added sense data to generic command.
 193
 194  3.07 Feb 2, 2000 - Jens Axboe <axboe@suse.de>
 195  -- Do same "read header length" trick in cdrom_get_disc_info() as
 196  we do in cdrom_get_track_info() -- some drive don't obey specs and
 197  fail if they can't supply the full Mt Fuji size table.
 198  -- Deleted stuff related to setting up write modes. It has a different
 199  home now.
 200  -- Clear header length in mode_select unconditionally.
 201  -- Removed the register_disk() that was added, not needed here.
 202
 203  3.08 May 1, 2000 - Jens Axboe <axboe@suse.de>
 204  -- Fix direction flag in setup_send_key and setup_report_key. This
 205  gave some SCSI adapters problems.
 206  -- Always return -EROFS for write opens
 207  -- Convert to module_init/module_exit style init and remove some
 208  of the #ifdef MODULE stuff
 209  -- Fix several dvd errors - DVD_LU_SEND_ASF should pass agid,
 210  DVD_HOST_SEND_RPC_STATE did not set buffer size in cdb, and
 211  dvd_do_auth passed uninitialized data to drive because init_cdrom_command
 212  did not clear a 0 sized buffer.
 213  
 214  3.09 May 12, 2000 - Jens Axboe <axboe@suse.de>
 215  -- Fix Video-CD on SCSI drives that don't support READ_CD command. In
 216  that case switch block size and issue plain READ_10 again, then switch
 217  back.
 218
 219  3.10 Jun 10, 2000 - Jens Axboe <axboe@suse.de>
 220  -- Fix volume control on CD's - old SCSI-II drives now use their own
 221  code, as doing MODE6 stuff in here is really not my intention.
 222  -- Use READ_DISC_INFO for more reliable end-of-disc.
 223
 224  3.11 Jun 12, 2000 - Jens Axboe <axboe@suse.de>
 225  -- Fix bug in getting rpc phase 2 region info.
 226  -- Reinstate "correct" CDROMPLAYTRKIND
 227
 228   3.12 Oct 18, 2000 - Jens Axboe <axboe@suse.de>
 229  -- Use quiet bit on packet commands not known to work
 230
 231   3.20 Dec 17, 2003 - Jens Axboe <axboe@suse.de>
 232  -- Various fixes and lots of cleanups not listed :-)
 233  -- Locking fixes
 234  -- Mt Rainier support
 235  -- DVD-RAM write open fixes
 236
 237  Nov 5 2001, Aug 8 2002. Modified by Andy Polyakov
 238  <appro@fy.chalmers.se> to support MMC-3 compliant DVD+RW units.
 239
 240  Modified by Nigel Kukard <nkukard@lbsd.net> - support DVD+RW
 241  2.4.x patch by Andy Polyakov <appro@fy.chalmers.se>
 242
 243-------------------------------------------------------------------------*/
 244
 245#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 246
 247#define REVISION "Revision: 3.20"
 248#define VERSION "Id: cdrom.c 3.20 2003/12/17"
 249
 250/* I use an error-log mask to give fine grain control over the type of
 251   messages dumped to the system logs.  The available masks include: */
 252#define CD_NOTHING      0x0
 253#define CD_WARNING      0x1
 254#define CD_REG_UNREG    0x2
 255#define CD_DO_IOCTL     0x4
 256#define CD_OPEN         0x8
 257#define CD_CLOSE        0x10
 258#define CD_COUNT_TRACKS 0x20
 259#define CD_CHANGER      0x40
 260#define CD_DVD          0x80
 261
 262/* Define this to remove _all_ the debugging messages */
 263/* #define ERRLOGMASK CD_NOTHING */
 264#define ERRLOGMASK CD_WARNING
 265/* #define ERRLOGMASK (CD_WARNING|CD_OPEN|CD_COUNT_TRACKS|CD_CLOSE) */
 266/* #define ERRLOGMASK (CD_WARNING|CD_REG_UNREG|CD_DO_IOCTL|CD_OPEN|CD_CLOSE|CD_COUNT_TRACKS) */
 267
 268#include <linux/atomic.h>
 269#include <linux/module.h>
 270#include <linux/fs.h>
 271#include <linux/major.h>
 272#include <linux/types.h>
 273#include <linux/errno.h>
 274#include <linux/kernel.h>
 275#include <linux/mm.h>
 276#include <linux/slab.h> 
 277#include <linux/cdrom.h>
 278#include <linux/sysctl.h>
 279#include <linux/proc_fs.h>
 280#include <linux/blkpg.h>
 281#include <linux/init.h>
 282#include <linux/fcntl.h>
 283#include <linux/blkdev.h>
 284#include <linux/times.h>
 285#include <linux/uaccess.h>
 286#include <scsi/scsi_common.h>
 287#include <scsi/scsi_request.h>
 288
 289/* used to tell the module to turn on full debugging messages */
 290static bool debug;
 291/* default compatibility mode */
 292static bool autoclose=1;
 293static bool autoeject;
 294static bool lockdoor = 1;
 295/* will we ever get to use this... sigh. */
 296static bool check_media_type;
 297/* automatically restart mrw format */
 298static bool mrw_format_restart = 1;
 299module_param(debug, bool, 0);
 300module_param(autoclose, bool, 0);
 301module_param(autoeject, bool, 0);
 302module_param(lockdoor, bool, 0);
 303module_param(check_media_type, bool, 0);
 304module_param(mrw_format_restart, bool, 0);
 305
 306static DEFINE_MUTEX(cdrom_mutex);
 307
 308static const char *mrw_format_status[] = {
 309        "not mrw",
 310        "bgformat inactive",
 311        "bgformat active",
 312        "mrw complete",
 313};
 314
 315static const char *mrw_address_space[] = { "DMA", "GAA" };
 316
 317#if (ERRLOGMASK != CD_NOTHING)
 318#define cd_dbg(type, fmt, ...)                          \
 319do {                                                    \
 320        if ((ERRLOGMASK & type) || debug == 1)          \
 321                pr_debug(fmt, ##__VA_ARGS__);           \
 322} while (0)
 323#else
 324#define cd_dbg(type, fmt, ...)                          \
 325do {                                                    \
 326        if (0 && (ERRLOGMASK & type) || debug == 1)     \
 327                pr_debug(fmt, ##__VA_ARGS__);           \
 328} while (0)
 329#endif
 330
 331/* The (cdo->capability & ~cdi->mask & CDC_XXX) construct was used in
 332   a lot of places. This macro makes the code more clear. */
 333#define CDROM_CAN(type) (cdi->ops->capability & ~cdi->mask & (type))
 334
 335/*
 336 * Another popular OS uses 7 seconds as the hard timeout for default
 337 * commands, so it is a good choice for us as well.
 338 */
 339#define CDROM_DEF_TIMEOUT       (7 * HZ)
 340
 341/* Not-exported routines. */
 342
 343static void cdrom_sysctl_register(void);
 344
 345static LIST_HEAD(cdrom_list);
 346
 347int cdrom_dummy_generic_packet(struct cdrom_device_info *cdi,
 348                               struct packet_command *cgc)
 349{
 350        if (cgc->sshdr) {
 351                cgc->sshdr->sense_key = 0x05;
 352                cgc->sshdr->asc = 0x20;
 353                cgc->sshdr->ascq = 0x00;
 354        }
 355
 356        cgc->stat = -EIO;
 357        return -EIO;
 358}
 359EXPORT_SYMBOL(cdrom_dummy_generic_packet);
 360
 361static int cdrom_flush_cache(struct cdrom_device_info *cdi)
 362{
 363        struct packet_command cgc;
 364
 365        init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
 366        cgc.cmd[0] = GPCMD_FLUSH_CACHE;
 367
 368        cgc.timeout = 5 * 60 * HZ;
 369
 370        return cdi->ops->generic_packet(cdi, &cgc);
 371}
 372
 373/* requires CD R/RW */
 374static int cdrom_get_disc_info(struct cdrom_device_info *cdi,
 375                               disc_information *di)
 376{
 377        const struct cdrom_device_ops *cdo = cdi->ops;
 378        struct packet_command cgc;
 379        int ret, buflen;
 380
 381        /* set up command and get the disc info */
 382        init_cdrom_command(&cgc, di, sizeof(*di), CGC_DATA_READ);
 383        cgc.cmd[0] = GPCMD_READ_DISC_INFO;
 384        cgc.cmd[8] = cgc.buflen = 2;
 385        cgc.quiet = 1;
 386
 387        ret = cdo->generic_packet(cdi, &cgc);
 388        if (ret)
 389                return ret;
 390
 391        /* not all drives have the same disc_info length, so requeue
 392         * packet with the length the drive tells us it can supply
 393         */
 394        buflen = be16_to_cpu(di->disc_information_length) +
 395                sizeof(di->disc_information_length);
 396
 397        if (buflen > sizeof(disc_information))
 398                buflen = sizeof(disc_information);
 399
 400        cgc.cmd[8] = cgc.buflen = buflen;
 401        ret = cdo->generic_packet(cdi, &cgc);
 402        if (ret)
 403                return ret;
 404
 405        /* return actual fill size */
 406        return buflen;
 407}
 408
 409/* This macro makes sure we don't have to check on cdrom_device_ops
 410 * existence in the run-time routines below. Change_capability is a
 411 * hack to have the capability flags defined const, while we can still
 412 * change it here without gcc complaining at every line.
 413 */
 414#define ENSURE(cdo, call, bits)                                 \
 415do {                                                            \
 416        if (cdo->call == NULL)                                  \
 417                WARN_ON_ONCE((cdo)->capability & (bits));       \
 418} while (0)
 419
 420/*
 421 * the first prototypes used 0x2c as the page code for the mrw mode page,
 422 * subsequently this was changed to 0x03. probe the one used by this drive
 423 */
 424static int cdrom_mrw_probe_pc(struct cdrom_device_info *cdi)
 425{
 426        struct packet_command cgc;
 427        char buffer[16];
 428
 429        init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
 430
 431        cgc.timeout = HZ;
 432        cgc.quiet = 1;
 433
 434        if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC, 0)) {
 435                cdi->mrw_mode_page = MRW_MODE_PC;
 436                return 0;
 437        } else if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC_PRE1, 0)) {
 438                cdi->mrw_mode_page = MRW_MODE_PC_PRE1;
 439                return 0;
 440        }
 441
 442        return 1;
 443}
 444
 445static int cdrom_is_mrw(struct cdrom_device_info *cdi, int *write)
 446{
 447        struct packet_command cgc;
 448        struct mrw_feature_desc *mfd;
 449        unsigned char buffer[16];
 450        int ret;
 451
 452        *write = 0;
 453
 454        init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
 455
 456        cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
 457        cgc.cmd[3] = CDF_MRW;
 458        cgc.cmd[8] = sizeof(buffer);
 459        cgc.quiet = 1;
 460
 461        if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
 462                return ret;
 463
 464        mfd = (struct mrw_feature_desc *)&buffer[sizeof(struct feature_header)];
 465        if (be16_to_cpu(mfd->feature_code) != CDF_MRW)
 466                return 1;
 467        *write = mfd->write;
 468
 469        if ((ret = cdrom_mrw_probe_pc(cdi))) {
 470                *write = 0;
 471                return ret;
 472        }
 473
 474        return 0;
 475}
 476
 477static int cdrom_mrw_bgformat(struct cdrom_device_info *cdi, int cont)
 478{
 479        struct packet_command cgc;
 480        unsigned char buffer[12];
 481        int ret;
 482
 483        pr_info("%sstarting format\n", cont ? "Re" : "");
 484
 485        /*
 486         * FmtData bit set (bit 4), format type is 1
 487         */
 488        init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_WRITE);
 489        cgc.cmd[0] = GPCMD_FORMAT_UNIT;
 490        cgc.cmd[1] = (1 << 4) | 1;
 491
 492        cgc.timeout = 5 * 60 * HZ;
 493
 494        /*
 495         * 4 byte format list header, 8 byte format list descriptor
 496         */
 497        buffer[1] = 1 << 1;
 498        buffer[3] = 8;
 499
 500        /*
 501         * nr_blocks field
 502         */
 503        buffer[4] = 0xff;
 504        buffer[5] = 0xff;
 505        buffer[6] = 0xff;
 506        buffer[7] = 0xff;
 507
 508        buffer[8] = 0x24 << 2;
 509        buffer[11] = cont;
 510
 511        ret = cdi->ops->generic_packet(cdi, &cgc);
 512        if (ret)
 513                pr_info("bgformat failed\n");
 514
 515        return ret;
 516}
 517
 518static int cdrom_mrw_bgformat_susp(struct cdrom_device_info *cdi, int immed)
 519{
 520        struct packet_command cgc;
 521
 522        init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
 523        cgc.cmd[0] = GPCMD_CLOSE_TRACK;
 524
 525        /*
 526         * Session = 1, Track = 0
 527         */
 528        cgc.cmd[1] = !!immed;
 529        cgc.cmd[2] = 1 << 1;
 530
 531        cgc.timeout = 5 * 60 * HZ;
 532
 533        return cdi->ops->generic_packet(cdi, &cgc);
 534}
 535
 536static int cdrom_mrw_exit(struct cdrom_device_info *cdi)
 537{
 538        disc_information di;
 539        int ret;
 540
 541        ret = cdrom_get_disc_info(cdi, &di);
 542        if (ret < 0 || ret < (int)offsetof(typeof(di),disc_type))
 543                return 1;
 544
 545        ret = 0;
 546        if (di.mrw_status == CDM_MRW_BGFORMAT_ACTIVE) {
 547                pr_info("issuing MRW background format suspend\n");
 548                ret = cdrom_mrw_bgformat_susp(cdi, 0);
 549        }
 550
 551        if (!ret && cdi->media_written)
 552                ret = cdrom_flush_cache(cdi);
 553
 554        return ret;
 555}
 556
 557static int cdrom_mrw_set_lba_space(struct cdrom_device_info *cdi, int space)
 558{
 559        struct packet_command cgc;
 560        struct mode_page_header *mph;
 561        char buffer[16];
 562        int ret, offset, size;
 563
 564        init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
 565
 566        cgc.buffer = buffer;
 567        cgc.buflen = sizeof(buffer);
 568
 569        ret = cdrom_mode_sense(cdi, &cgc, cdi->mrw_mode_page, 0);
 570        if (ret)
 571                return ret;
 572
 573        mph = (struct mode_page_header *)buffer;
 574        offset = be16_to_cpu(mph->desc_length);
 575        size = be16_to_cpu(mph->mode_data_length) + 2;
 576
 577        buffer[offset + 3] = space;
 578        cgc.buflen = size;
 579
 580        ret = cdrom_mode_select(cdi, &cgc);
 581        if (ret)
 582                return ret;
 583
 584        pr_info("%s: mrw address space %s selected\n",
 585                cdi->name, mrw_address_space[space]);
 586        return 0;
 587}
 588
 589int register_cdrom(struct gendisk *disk, struct cdrom_device_info *cdi)
 590{
 591        static char banner_printed;
 592        const struct cdrom_device_ops *cdo = cdi->ops;
 593
 594        cd_dbg(CD_OPEN, "entering register_cdrom\n");
 595
 596        if (cdo->open == NULL || cdo->release == NULL)
 597                return -EINVAL;
 598        if (!banner_printed) {
 599                pr_info("Uniform CD-ROM driver " REVISION "\n");
 600                banner_printed = 1;
 601                cdrom_sysctl_register();
 602        }
 603
 604        cdi->disk = disk;
 605        disk->cdi = cdi;
 606
 607        ENSURE(cdo, drive_status, CDC_DRIVE_STATUS);
 608        if (cdo->check_events == NULL && cdo->media_changed == NULL)
 609                WARN_ON_ONCE(cdo->capability & (CDC_MEDIA_CHANGED | CDC_SELECT_DISC));
 610        ENSURE(cdo, tray_move, CDC_CLOSE_TRAY | CDC_OPEN_TRAY);
 611        ENSURE(cdo, lock_door, CDC_LOCK);
 612        ENSURE(cdo, select_speed, CDC_SELECT_SPEED);
 613        ENSURE(cdo, get_last_session, CDC_MULTI_SESSION);
 614        ENSURE(cdo, get_mcn, CDC_MCN);
 615        ENSURE(cdo, reset, CDC_RESET);
 616        ENSURE(cdo, generic_packet, CDC_GENERIC_PACKET);
 617        cdi->mc_flags = 0;
 618        cdi->options = CDO_USE_FFLAGS;
 619
 620        if (autoclose == 1 && CDROM_CAN(CDC_CLOSE_TRAY))
 621                cdi->options |= (int) CDO_AUTO_CLOSE;
 622        if (autoeject == 1 && CDROM_CAN(CDC_OPEN_TRAY))
 623                cdi->options |= (int) CDO_AUTO_EJECT;
 624        if (lockdoor == 1)
 625                cdi->options |= (int) CDO_LOCK;
 626        if (check_media_type == 1)
 627                cdi->options |= (int) CDO_CHECK_TYPE;
 628
 629        if (CDROM_CAN(CDC_MRW_W))
 630                cdi->exit = cdrom_mrw_exit;
 631
 632        if (cdi->disk)
 633                cdi->cdda_method = CDDA_BPC_FULL;
 634        else
 635                cdi->cdda_method = CDDA_OLD;
 636
 637        WARN_ON(!cdo->generic_packet);
 638
 639        cd_dbg(CD_REG_UNREG, "drive \"/dev/%s\" registered\n", cdi->name);
 640        mutex_lock(&cdrom_mutex);
 641        list_add(&cdi->list, &cdrom_list);
 642        mutex_unlock(&cdrom_mutex);
 643        return 0;
 644}
 645#undef ENSURE
 646
 647void unregister_cdrom(struct cdrom_device_info *cdi)
 648{
 649        cd_dbg(CD_OPEN, "entering unregister_cdrom\n");
 650
 651        mutex_lock(&cdrom_mutex);
 652        list_del(&cdi->list);
 653        mutex_unlock(&cdrom_mutex);
 654
 655        if (cdi->exit)
 656                cdi->exit(cdi);
 657
 658        cd_dbg(CD_REG_UNREG, "drive \"/dev/%s\" unregistered\n", cdi->name);
 659}
 660
 661int cdrom_get_media_event(struct cdrom_device_info *cdi,
 662                          struct media_event_desc *med)
 663{
 664        struct packet_command cgc;
 665        unsigned char buffer[8];
 666        struct event_header *eh = (struct event_header *)buffer;
 667
 668        init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
 669        cgc.cmd[0] = GPCMD_GET_EVENT_STATUS_NOTIFICATION;
 670        cgc.cmd[1] = 1;         /* IMMED */
 671        cgc.cmd[4] = 1 << 4;    /* media event */
 672        cgc.cmd[8] = sizeof(buffer);
 673        cgc.quiet = 1;
 674
 675        if (cdi->ops->generic_packet(cdi, &cgc))
 676                return 1;
 677
 678        if (be16_to_cpu(eh->data_len) < sizeof(*med))
 679                return 1;
 680
 681        if (eh->nea || eh->notification_class != 0x4)
 682                return 1;
 683
 684        memcpy(med, &buffer[sizeof(*eh)], sizeof(*med));
 685        return 0;
 686}
 687
 688static int cdrom_get_random_writable(struct cdrom_device_info *cdi,
 689                              struct rwrt_feature_desc *rfd)
 690{
 691        struct packet_command cgc;
 692        char buffer[24];
 693        int ret;
 694
 695        init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
 696
 697        cgc.cmd[0] = GPCMD_GET_CONFIGURATION;   /* often 0x46 */
 698        cgc.cmd[3] = CDF_RWRT;                  /* often 0x0020 */
 699        cgc.cmd[8] = sizeof(buffer);            /* often 0x18 */
 700        cgc.quiet = 1;
 701
 702        if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
 703                return ret;
 704
 705        memcpy(rfd, &buffer[sizeof(struct feature_header)], sizeof (*rfd));
 706        return 0;
 707}
 708
 709static int cdrom_has_defect_mgt(struct cdrom_device_info *cdi)
 710{
 711        struct packet_command cgc;
 712        char buffer[16];
 713        __be16 *feature_code;
 714        int ret;
 715
 716        init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
 717
 718        cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
 719        cgc.cmd[3] = CDF_HWDM;
 720        cgc.cmd[8] = sizeof(buffer);
 721        cgc.quiet = 1;
 722
 723        if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
 724                return ret;
 725
 726        feature_code = (__be16 *) &buffer[sizeof(struct feature_header)];
 727        if (be16_to_cpu(*feature_code) == CDF_HWDM)
 728                return 0;
 729
 730        return 1;
 731}
 732
 733
 734static int cdrom_is_random_writable(struct cdrom_device_info *cdi, int *write)
 735{
 736        struct rwrt_feature_desc rfd;
 737        int ret;
 738
 739        *write = 0;
 740
 741        if ((ret = cdrom_get_random_writable(cdi, &rfd)))
 742                return ret;
 743
 744        if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
 745                *write = 1;
 746
 747        return 0;
 748}
 749
 750static int cdrom_media_erasable(struct cdrom_device_info *cdi)
 751{
 752        disc_information di;
 753        int ret;
 754
 755        ret = cdrom_get_disc_info(cdi, &di);
 756        if (ret < 0 || ret < offsetof(typeof(di), n_first_track))
 757                return -1;
 758
 759        return di.erasable;
 760}
 761
 762/*
 763 * FIXME: check RO bit
 764 */
 765static int cdrom_dvdram_open_write(struct cdrom_device_info *cdi)
 766{
 767        int ret = cdrom_media_erasable(cdi);
 768
 769        /*
 770         * allow writable open if media info read worked and media is
 771         * erasable, _or_ if it fails since not all drives support it
 772         */
 773        if (!ret)
 774                return 1;
 775
 776        return 0;
 777}
 778
 779static int cdrom_mrw_open_write(struct cdrom_device_info *cdi)
 780{
 781        disc_information di;
 782        int ret;
 783
 784        /*
 785         * always reset to DMA lba space on open
 786         */
 787        if (cdrom_mrw_set_lba_space(cdi, MRW_LBA_DMA)) {
 788                pr_err("failed setting lba address space\n");
 789                return 1;
 790        }
 791
 792        ret = cdrom_get_disc_info(cdi, &di);
 793        if (ret < 0 || ret < offsetof(typeof(di),disc_type))
 794                return 1;
 795
 796        if (!di.erasable)
 797                return 1;
 798
 799        /*
 800         * mrw_status
 801         * 0    -       not MRW formatted
 802         * 1    -       MRW bgformat started, but not running or complete
 803         * 2    -       MRW bgformat in progress
 804         * 3    -       MRW formatting complete
 805         */
 806        ret = 0;
 807        pr_info("open: mrw_status '%s'\n", mrw_format_status[di.mrw_status]);
 808        if (!di.mrw_status)
 809                ret = 1;
 810        else if (di.mrw_status == CDM_MRW_BGFORMAT_INACTIVE &&
 811                        mrw_format_restart)
 812                ret = cdrom_mrw_bgformat(cdi, 1);
 813
 814        return ret;
 815}
 816
 817static int mo_open_write(struct cdrom_device_info *cdi)
 818{
 819        struct packet_command cgc;
 820        char buffer[255];
 821        int ret;
 822
 823        init_cdrom_command(&cgc, &buffer, 4, CGC_DATA_READ);
 824        cgc.quiet = 1;
 825
 826        /*
 827         * obtain write protect information as per
 828         * drivers/scsi/sd.c:sd_read_write_protect_flag
 829         */
 830
 831        ret = cdrom_mode_sense(cdi, &cgc, GPMODE_ALL_PAGES, 0);
 832        if (ret)
 833                ret = cdrom_mode_sense(cdi, &cgc, GPMODE_VENDOR_PAGE, 0);
 834        if (ret) {
 835                cgc.buflen = 255;
 836                ret = cdrom_mode_sense(cdi, &cgc, GPMODE_ALL_PAGES, 0);
 837        }
 838
 839        /* drive gave us no info, let the user go ahead */
 840        if (ret)
 841                return 0;
 842
 843        return buffer[3] & 0x80;
 844}
 845
 846static int cdrom_ram_open_write(struct cdrom_device_info *cdi)
 847{
 848        struct rwrt_feature_desc rfd;
 849        int ret;
 850
 851        if ((ret = cdrom_has_defect_mgt(cdi)))
 852                return ret;
 853
 854        if ((ret = cdrom_get_random_writable(cdi, &rfd)))
 855                return ret;
 856        else if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
 857                ret = !rfd.curr;
 858
 859        cd_dbg(CD_OPEN, "can open for random write\n");
 860        return ret;
 861}
 862
 863static void cdrom_mmc3_profile(struct cdrom_device_info *cdi)
 864{
 865        struct packet_command cgc;
 866        char buffer[32];
 867        int ret, mmc3_profile;
 868
 869        init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
 870
 871        cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
 872        cgc.cmd[1] = 0;
 873        cgc.cmd[2] = cgc.cmd[3] = 0;            /* Starting Feature Number */
 874        cgc.cmd[8] = sizeof(buffer);            /* Allocation Length */
 875        cgc.quiet = 1;
 876
 877        if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
 878                mmc3_profile = 0xffff;
 879        else
 880                mmc3_profile = (buffer[6] << 8) | buffer[7];
 881
 882        cdi->mmc3_profile = mmc3_profile;
 883}
 884
 885static int cdrom_is_dvd_rw(struct cdrom_device_info *cdi)
 886{
 887        switch (cdi->mmc3_profile) {
 888        case 0x12:      /* DVD-RAM      */
 889        case 0x1A:      /* DVD+RW       */
 890        case 0x43:      /* BD-RE        */
 891                return 0;
 892        default:
 893                return 1;
 894        }
 895}
 896
 897/*
 898 * returns 0 for ok to open write, non-0 to disallow
 899 */
 900static int cdrom_open_write(struct cdrom_device_info *cdi)
 901{
 902        int mrw, mrw_write, ram_write;
 903        int ret = 1;
 904
 905        mrw = 0;
 906        if (!cdrom_is_mrw(cdi, &mrw_write))
 907                mrw = 1;
 908
 909        if (CDROM_CAN(CDC_MO_DRIVE))
 910                ram_write = 1;
 911        else
 912                (void) cdrom_is_random_writable(cdi, &ram_write);
 913        
 914        if (mrw)
 915                cdi->mask &= ~CDC_MRW;
 916        else
 917                cdi->mask |= CDC_MRW;
 918
 919        if (mrw_write)
 920                cdi->mask &= ~CDC_MRW_W;
 921        else
 922                cdi->mask |= CDC_MRW_W;
 923
 924        if (ram_write)
 925                cdi->mask &= ~CDC_RAM;
 926        else
 927                cdi->mask |= CDC_RAM;
 928
 929        if (CDROM_CAN(CDC_MRW_W))
 930                ret = cdrom_mrw_open_write(cdi);
 931        else if (CDROM_CAN(CDC_DVD_RAM))
 932                ret = cdrom_dvdram_open_write(cdi);
 933        else if (CDROM_CAN(CDC_RAM) &&
 934                 !CDROM_CAN(CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_MRW|CDC_MO_DRIVE))
 935                ret = cdrom_ram_open_write(cdi);
 936        else if (CDROM_CAN(CDC_MO_DRIVE))
 937                ret = mo_open_write(cdi);
 938        else if (!cdrom_is_dvd_rw(cdi))
 939                ret = 0;
 940
 941        return ret;
 942}
 943
 944static void cdrom_dvd_rw_close_write(struct cdrom_device_info *cdi)
 945{
 946        struct packet_command cgc;
 947
 948        if (cdi->mmc3_profile != 0x1a) {
 949                cd_dbg(CD_CLOSE, "%s: No DVD+RW\n", cdi->name);
 950                return;
 951        }
 952
 953        if (!cdi->media_written) {
 954                cd_dbg(CD_CLOSE, "%s: DVD+RW media clean\n", cdi->name);
 955                return;
 956        }
 957
 958        pr_info("%s: dirty DVD+RW media, \"finalizing\"\n", cdi->name);
 959
 960        init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
 961        cgc.cmd[0] = GPCMD_FLUSH_CACHE;
 962        cgc.timeout = 30*HZ;
 963        cdi->ops->generic_packet(cdi, &cgc);
 964
 965        init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
 966        cgc.cmd[0] = GPCMD_CLOSE_TRACK;
 967        cgc.timeout = 3000*HZ;
 968        cgc.quiet = 1;
 969        cdi->ops->generic_packet(cdi, &cgc);
 970
 971        init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
 972        cgc.cmd[0] = GPCMD_CLOSE_TRACK;
 973        cgc.cmd[2] = 2;  /* Close session */
 974        cgc.quiet = 1;
 975        cgc.timeout = 3000*HZ;
 976        cdi->ops->generic_packet(cdi, &cgc);
 977
 978        cdi->media_written = 0;
 979}
 980
 981static int cdrom_close_write(struct cdrom_device_info *cdi)
 982{
 983#if 0
 984        return cdrom_flush_cache(cdi);
 985#else
 986        return 0;
 987#endif
 988}
 989
 990/* badly broken, I know. Is due for a fixup anytime. */
 991static void cdrom_count_tracks(struct cdrom_device_info *cdi, tracktype *tracks)
 992{
 993        struct cdrom_tochdr header;
 994        struct cdrom_tocentry entry;
 995        int ret, i;
 996        tracks->data = 0;
 997        tracks->audio = 0;
 998        tracks->cdi = 0;
 999        tracks->xa = 0;
1000        tracks->error = 0;
1001        cd_dbg(CD_COUNT_TRACKS, "entering cdrom_count_tracks\n");
1002
1003        if (!CDROM_CAN(CDC_PLAY_AUDIO)) {
1004                tracks->error = CDS_NO_INFO;
1005                return;
1006        }
1007
1008        /* Grab the TOC header so we can see how many tracks there are */
1009        ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header);
1010        if (ret) {
1011                if (ret == -ENOMEDIUM)
1012                        tracks->error = CDS_NO_DISC;
1013                else
1014                        tracks->error = CDS_NO_INFO;
1015                return;
1016        }
1017        /* check what type of tracks are on this disc */
1018        entry.cdte_format = CDROM_MSF;
1019        for (i = header.cdth_trk0; i <= header.cdth_trk1; i++) {
1020                entry.cdte_track = i;
1021                if (cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &entry)) {
1022                        tracks->error = CDS_NO_INFO;
1023                        return;
1024                }
1025                if (entry.cdte_ctrl & CDROM_DATA_TRACK) {
1026                        if (entry.cdte_format == 0x10)
1027                                tracks->cdi++;
1028                        else if (entry.cdte_format == 0x20)
1029                                tracks->xa++;
1030                        else
1031                                tracks->data++;
1032                } else {
1033                        tracks->audio++;
1034                }
1035                cd_dbg(CD_COUNT_TRACKS, "track %d: format=%d, ctrl=%d\n",
1036                       i, entry.cdte_format, entry.cdte_ctrl);
1037        }
1038        cd_dbg(CD_COUNT_TRACKS, "disc has %d tracks: %d=audio %d=data %d=Cd-I %d=XA\n",
1039               header.cdth_trk1, tracks->audio, tracks->data,
1040               tracks->cdi, tracks->xa);
1041}
1042
1043static
1044int open_for_data(struct cdrom_device_info *cdi)
1045{
1046        int ret;
1047        const struct cdrom_device_ops *cdo = cdi->ops;
1048        tracktype tracks;
1049        cd_dbg(CD_OPEN, "entering open_for_data\n");
1050        /* Check if the driver can report drive status.  If it can, we
1051           can do clever things.  If it can't, well, we at least tried! */
1052        if (cdo->drive_status != NULL) {
1053                ret = cdo->drive_status(cdi, CDSL_CURRENT);
1054                cd_dbg(CD_OPEN, "drive_status=%d\n", ret);
1055                if (ret == CDS_TRAY_OPEN) {
1056                        cd_dbg(CD_OPEN, "the tray is open...\n");
1057                        /* can/may i close it? */
1058                        if (CDROM_CAN(CDC_CLOSE_TRAY) &&
1059                            cdi->options & CDO_AUTO_CLOSE) {
1060                                cd_dbg(CD_OPEN, "trying to close the tray\n");
1061                                ret=cdo->tray_move(cdi,0);
1062                                if (ret) {
1063                                        cd_dbg(CD_OPEN, "bummer. tried to close the tray but failed.\n");
1064                                        /* Ignore the error from the low
1065                                        level driver.  We don't care why it
1066                                        couldn't close the tray.  We only care 
1067                                        that there is no disc in the drive, 
1068                                        since that is the _REAL_ problem here.*/
1069                                        ret=-ENOMEDIUM;
1070                                        goto clean_up_and_return;
1071                                }
1072                        } else {
1073                                cd_dbg(CD_OPEN, "bummer. this drive can't close the tray.\n");
1074                                ret=-ENOMEDIUM;
1075                                goto clean_up_and_return;
1076                        }
1077                        /* Ok, the door should be closed now.. Check again */
1078                        ret = cdo->drive_status(cdi, CDSL_CURRENT);
1079                        if ((ret == CDS_NO_DISC) || (ret==CDS_TRAY_OPEN)) {
1080                                cd_dbg(CD_OPEN, "bummer. the tray is still not closed.\n");
1081                                cd_dbg(CD_OPEN, "tray might not contain a medium\n");
1082                                ret=-ENOMEDIUM;
1083                                goto clean_up_and_return;
1084                        }
1085                        cd_dbg(CD_OPEN, "the tray is now closed\n");
1086                }
1087                /* the door should be closed now, check for the disc */
1088                ret = cdo->drive_status(cdi, CDSL_CURRENT);
1089                if (ret!=CDS_DISC_OK) {
1090                        ret = -ENOMEDIUM;
1091                        goto clean_up_and_return;
1092                }
1093        }
1094        cdrom_count_tracks(cdi, &tracks);
1095        if (tracks.error == CDS_NO_DISC) {
1096                cd_dbg(CD_OPEN, "bummer. no disc.\n");
1097                ret=-ENOMEDIUM;
1098                goto clean_up_and_return;
1099        }
1100        /* CD-Players which don't use O_NONBLOCK, workman
1101         * for example, need bit CDO_CHECK_TYPE cleared! */
1102        if (tracks.data==0) {
1103                if (cdi->options & CDO_CHECK_TYPE) {
1104                    /* give people a warning shot, now that CDO_CHECK_TYPE
1105                       is the default case! */
1106                    cd_dbg(CD_OPEN, "bummer. wrong media type.\n");
1107                    cd_dbg(CD_WARNING, "pid %d must open device O_NONBLOCK!\n",
1108                           (unsigned int)task_pid_nr(current));
1109                    ret=-EMEDIUMTYPE;
1110                    goto clean_up_and_return;
1111                }
1112                else {
1113                    cd_dbg(CD_OPEN, "wrong media type, but CDO_CHECK_TYPE not set\n");
1114                }
1115        }
1116
1117        cd_dbg(CD_OPEN, "all seems well, opening the devicen");
1118
1119        /* all seems well, we can open the device */
1120        ret = cdo->open(cdi, 0); /* open for data */
1121        cd_dbg(CD_OPEN, "opening the device gave me %d\n", ret);
1122        /* After all this careful checking, we shouldn't have problems
1123           opening the device, but we don't want the device locked if 
1124           this somehow fails... */
1125        if (ret) {
1126                cd_dbg(CD_OPEN, "open device failed\n");
1127                goto clean_up_and_return;
1128        }
1129        if (CDROM_CAN(CDC_LOCK) && (cdi->options & CDO_LOCK)) {
1130                        cdo->lock_door(cdi, 1);
1131                        cd_dbg(CD_OPEN, "door locked\n");
1132        }
1133        cd_dbg(CD_OPEN, "device opened successfully\n");
1134        return ret;
1135
1136        /* Something failed.  Try to unlock the drive, because some drivers
1137        (notably ide-cd) lock the drive after every command.  This produced
1138        a nasty bug where after mount failed, the drive would remain locked!  
1139        This ensures that the drive gets unlocked after a mount fails.  This 
1140        is a goto to avoid bloating the driver with redundant code. */ 
1141clean_up_and_return:
1142        cd_dbg(CD_OPEN, "open failed\n");
1143        if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) {
1144                        cdo->lock_door(cdi, 0);
1145                        cd_dbg(CD_OPEN, "door unlocked\n");
1146        }
1147        return ret;
1148}
1149
1150/* We use the open-option O_NONBLOCK to indicate that the
1151 * purpose of opening is only for subsequent ioctl() calls; no device
1152 * integrity checks are performed.
1153 *
1154 * We hope that all cd-player programs will adopt this convention. It
1155 * is in their own interest: device control becomes a lot easier
1156 * this way.
1157 */
1158int cdrom_open(struct cdrom_device_info *cdi, struct block_device *bdev,
1159               fmode_t mode)
1160{
1161        int ret;
1162
1163        cd_dbg(CD_OPEN, "entering cdrom_open\n");
1164
1165        /* if this was a O_NONBLOCK open and we should honor the flags,
1166         * do a quick open without drive/disc integrity checks. */
1167        cdi->use_count++;
1168        if ((mode & FMODE_NDELAY) && (cdi->options & CDO_USE_FFLAGS)) {
1169                ret = cdi->ops->open(cdi, 1);
1170        } else {
1171                ret = open_for_data(cdi);
1172                if (ret)
1173                        goto err;
1174                if (CDROM_CAN(CDC_GENERIC_PACKET))
1175                        cdrom_mmc3_profile(cdi);
1176                if (mode & FMODE_WRITE) {
1177                        ret = -EROFS;
1178                        if (cdrom_open_write(cdi))
1179                                goto err_release;
1180                        if (!CDROM_CAN(CDC_RAM))
1181                                goto err_release;
1182                        ret = 0;
1183                        cdi->media_written = 0;
1184                }
1185        }
1186
1187        if (ret)
1188                goto err;
1189
1190        cd_dbg(CD_OPEN, "Use count for \"/dev/%s\" now %d\n",
1191               cdi->name, cdi->use_count);
1192        return 0;
1193err_release:
1194        if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) {
1195                cdi->ops->lock_door(cdi, 0);
1196                cd_dbg(CD_OPEN, "door unlocked\n");
1197        }
1198        cdi->ops->release(cdi);
1199err:
1200        cdi->use_count--;
1201        return ret;
1202}
1203
1204/* This code is similar to that in open_for_data. The routine is called
1205   whenever an audio play operation is requested.
1206*/
1207static int check_for_audio_disc(struct cdrom_device_info *cdi,
1208                                const struct cdrom_device_ops *cdo)
1209{
1210        int ret;
1211        tracktype tracks;
1212        cd_dbg(CD_OPEN, "entering check_for_audio_disc\n");
1213        if (!(cdi->options & CDO_CHECK_TYPE))
1214                return 0;
1215        if (cdo->drive_status != NULL) {
1216                ret = cdo->drive_status(cdi, CDSL_CURRENT);
1217                cd_dbg(CD_OPEN, "drive_status=%d\n", ret);
1218                if (ret == CDS_TRAY_OPEN) {
1219                        cd_dbg(CD_OPEN, "the tray is open...\n");
1220                        /* can/may i close it? */
1221                        if (CDROM_CAN(CDC_CLOSE_TRAY) &&
1222                            cdi->options & CDO_AUTO_CLOSE) {
1223                                cd_dbg(CD_OPEN, "trying to close the tray\n");
1224                                ret=cdo->tray_move(cdi,0);
1225                                if (ret) {
1226                                        cd_dbg(CD_OPEN, "bummer. tried to close tray but failed.\n");
1227                                        /* Ignore the error from the low
1228                                        level driver.  We don't care why it
1229                                        couldn't close the tray.  We only care 
1230                                        that there is no disc in the drive, 
1231                                        since that is the _REAL_ problem here.*/
1232                                        return -ENOMEDIUM;
1233                                }
1234                        } else {
1235                                cd_dbg(CD_OPEN, "bummer. this driver can't close the tray.\n");
1236                                return -ENOMEDIUM;
1237                        }
1238                        /* Ok, the door should be closed now.. Check again */
1239                        ret = cdo->drive_status(cdi, CDSL_CURRENT);
1240                        if ((ret == CDS_NO_DISC) || (ret==CDS_TRAY_OPEN)) {
1241                                cd_dbg(CD_OPEN, "bummer. the tray is still not closed.\n");
1242                                return -ENOMEDIUM;
1243                        }       
1244                        if (ret!=CDS_DISC_OK) {
1245                                cd_dbg(CD_OPEN, "bummer. disc isn't ready.\n");
1246                                return -EIO;
1247                        }       
1248                        cd_dbg(CD_OPEN, "the tray is now closed\n");
1249                }       
1250        }
1251        cdrom_count_tracks(cdi, &tracks);
1252        if (tracks.error) 
1253                return(tracks.error);
1254
1255        if (tracks.audio==0)
1256                return -EMEDIUMTYPE;
1257
1258        return 0;
1259}
1260
1261void cdrom_release(struct cdrom_device_info *cdi, fmode_t mode)
1262{
1263        const struct cdrom_device_ops *cdo = cdi->ops;
1264        int opened_for_data;
1265
1266        cd_dbg(CD_CLOSE, "entering cdrom_release\n");
1267
1268        if (cdi->use_count > 0)
1269                cdi->use_count--;
1270
1271        if (cdi->use_count == 0) {
1272                cd_dbg(CD_CLOSE, "Use count for \"/dev/%s\" now zero\n",
1273                       cdi->name);
1274                cdrom_dvd_rw_close_write(cdi);
1275
1276                if ((cdo->capability & CDC_LOCK) && !cdi->keeplocked) {
1277                        cd_dbg(CD_CLOSE, "Unlocking door!\n");
1278                        cdo->lock_door(cdi, 0);
1279                }
1280        }
1281
1282        opened_for_data = !(cdi->options & CDO_USE_FFLAGS) ||
1283                !(mode & FMODE_NDELAY);
1284
1285        /*
1286         * flush cache on last write release
1287         */
1288        if (CDROM_CAN(CDC_RAM) && !cdi->use_count && cdi->for_data)
1289                cdrom_close_write(cdi);
1290
1291        cdo->release(cdi);
1292        if (cdi->use_count == 0) {      /* last process that closes dev*/
1293                if (opened_for_data &&
1294                    cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY))
1295                        cdo->tray_move(cdi, 1);
1296        }
1297}
1298
1299static int cdrom_read_mech_status(struct cdrom_device_info *cdi, 
1300                                  struct cdrom_changer_info *buf)
1301{
1302        struct packet_command cgc;
1303        const struct cdrom_device_ops *cdo = cdi->ops;
1304        int length;
1305
1306        /*
1307         * Sanyo changer isn't spec compliant (doesn't use regular change
1308         * LOAD_UNLOAD command, and it doesn't implement the mech status
1309         * command below
1310         */
1311        if (cdi->sanyo_slot) {
1312                buf->hdr.nslots = 3;
1313                buf->hdr.curslot = cdi->sanyo_slot == 3 ? 0 : cdi->sanyo_slot;
1314                for (length = 0; length < 3; length++) {
1315                        buf->slots[length].disc_present = 1;
1316                        buf->slots[length].change = 0;
1317                }
1318                return 0;
1319        }
1320
1321        length = sizeof(struct cdrom_mechstat_header) +
1322                 cdi->capacity * sizeof(struct cdrom_slot);
1323
1324        init_cdrom_command(&cgc, buf, length, CGC_DATA_READ);
1325        cgc.cmd[0] = GPCMD_MECHANISM_STATUS;
1326        cgc.cmd[8] = (length >> 8) & 0xff;
1327        cgc.cmd[9] = length & 0xff;
1328        return cdo->generic_packet(cdi, &cgc);
1329}
1330
1331static int cdrom_slot_status(struct cdrom_device_info *cdi, int slot)
1332{
1333        struct cdrom_changer_info *info;
1334        int ret;
1335
1336        cd_dbg(CD_CHANGER, "entering cdrom_slot_status()\n");
1337        if (cdi->sanyo_slot)
1338                return CDS_NO_INFO;
1339        
1340        info = kmalloc(sizeof(*info), GFP_KERNEL);
1341        if (!info)
1342                return -ENOMEM;
1343
1344        if ((ret = cdrom_read_mech_status(cdi, info)))
1345                goto out_free;
1346
1347        if (info->slots[slot].disc_present)
1348                ret = CDS_DISC_OK;
1349        else
1350                ret = CDS_NO_DISC;
1351
1352out_free:
1353        kfree(info);
1354        return ret;
1355}
1356
1357/* Return the number of slots for an ATAPI/SCSI cdrom, 
1358 * return 1 if not a changer. 
1359 */
1360int cdrom_number_of_slots(struct cdrom_device_info *cdi) 
1361{
1362        int status;
1363        int nslots = 1;
1364        struct cdrom_changer_info *info;
1365
1366        cd_dbg(CD_CHANGER, "entering cdrom_number_of_slots()\n");
1367        /* cdrom_read_mech_status requires a valid value for capacity: */
1368        cdi->capacity = 0; 
1369
1370        info = kmalloc(sizeof(*info), GFP_KERNEL);
1371        if (!info)
1372                return -ENOMEM;
1373
1374        if ((status = cdrom_read_mech_status(cdi, info)) == 0)
1375                nslots = info->hdr.nslots;
1376
1377        kfree(info);
1378        return nslots;
1379}
1380
1381
1382/* If SLOT < 0, unload the current slot.  Otherwise, try to load SLOT. */
1383static int cdrom_load_unload(struct cdrom_device_info *cdi, int slot) 
1384{
1385        struct packet_command cgc;
1386
1387        cd_dbg(CD_CHANGER, "entering cdrom_load_unload()\n");
1388        if (cdi->sanyo_slot && slot < 0)
1389                return 0;
1390
1391        init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
1392        cgc.cmd[0] = GPCMD_LOAD_UNLOAD;
1393        cgc.cmd[4] = 2 + (slot >= 0);
1394        cgc.cmd[8] = slot;
1395        cgc.timeout = 60 * HZ;
1396
1397        /* The Sanyo 3 CD changer uses byte 7 of the 
1398        GPCMD_TEST_UNIT_READY to command to switch CDs instead of
1399        using the GPCMD_LOAD_UNLOAD opcode. */
1400        if (cdi->sanyo_slot && -1 < slot) {
1401                cgc.cmd[0] = GPCMD_TEST_UNIT_READY;
1402                cgc.cmd[7] = slot;
1403                cgc.cmd[4] = cgc.cmd[8] = 0;
1404                cdi->sanyo_slot = slot ? slot : 3;
1405        }
1406
1407        return cdi->ops->generic_packet(cdi, &cgc);
1408}
1409
1410static int cdrom_select_disc(struct cdrom_device_info *cdi, int slot)
1411{
1412        struct cdrom_changer_info *info;
1413        int curslot;
1414        int ret;
1415
1416        cd_dbg(CD_CHANGER, "entering cdrom_select_disc()\n");
1417        if (!CDROM_CAN(CDC_SELECT_DISC))
1418                return -EDRIVE_CANT_DO_THIS;
1419
1420        if (cdi->ops->check_events)
1421                cdi->ops->check_events(cdi, 0, slot);
1422        else
1423                cdi->ops->media_changed(cdi, slot);
1424
1425        if (slot == CDSL_NONE) {
1426                /* set media changed bits, on both queues */
1427                cdi->mc_flags = 0x3;
1428                return cdrom_load_unload(cdi, -1);
1429        }
1430
1431        info = kmalloc(sizeof(*info), GFP_KERNEL);
1432        if (!info)
1433                return -ENOMEM;
1434
1435        if ((ret = cdrom_read_mech_status(cdi, info))) {
1436                kfree(info);
1437                return ret;
1438        }
1439
1440        curslot = info->hdr.curslot;
1441        kfree(info);
1442
1443        if (cdi->use_count > 1 || cdi->keeplocked) {
1444                if (slot == CDSL_CURRENT) {
1445                        return curslot;
1446                } else {
1447                        return -EBUSY;
1448                }
1449        }
1450
1451        /* Specifying CDSL_CURRENT will attempt to load the currnet slot,
1452        which is useful if it had been previously unloaded.
1453        Whether it can or not, it returns the current slot. 
1454        Similarly,  if slot happens to be the current one, we still
1455        try and load it. */
1456        if (slot == CDSL_CURRENT)
1457                slot = curslot;
1458
1459        /* set media changed bits on both queues */
1460        cdi->mc_flags = 0x3;
1461        if ((ret = cdrom_load_unload(cdi, slot)))
1462                return ret;
1463
1464        return slot;
1465}
1466
1467/*
1468 * As cdrom implements an extra ioctl consumer for media changed
1469 * event, it needs to buffer ->check_events() output, such that event
1470 * is not lost for both the usual VFS and ioctl paths.
1471 * cdi->{vfs|ioctl}_events are used to buffer pending events for each
1472 * path.
1473 *
1474 * XXX: Locking is non-existent.  cdi->ops->check_events() can be
1475 * called in parallel and buffering fields are accessed without any
1476 * exclusion.  The original media_changed code had the same problem.
1477 * It might be better to simply deprecate CDROM_MEDIA_CHANGED ioctl
1478 * and remove this cruft altogether.  It doesn't have much usefulness
1479 * at this point.
1480 */
1481static void cdrom_update_events(struct cdrom_device_info *cdi,
1482                                unsigned int clearing)
1483{
1484        unsigned int events;
1485
1486        events = cdi->ops->check_events(cdi, clearing, CDSL_CURRENT);
1487        cdi->vfs_events |= events;
1488        cdi->ioctl_events |= events;
1489}
1490
1491unsigned int cdrom_check_events(struct cdrom_device_info *cdi,
1492                                unsigned int clearing)
1493{
1494        unsigned int events;
1495
1496        cdrom_update_events(cdi, clearing);
1497        events = cdi->vfs_events;
1498        cdi->vfs_events = 0;
1499        return events;
1500}
1501EXPORT_SYMBOL(cdrom_check_events);
1502
1503/* We want to make media_changed accessible to the user through an
1504 * ioctl. The main problem now is that we must double-buffer the
1505 * low-level implementation, to assure that the VFS and the user both
1506 * see a medium change once.
1507 */
1508
1509static
1510int media_changed(struct cdrom_device_info *cdi, int queue)
1511{
1512        unsigned int mask = (1 << (queue & 1));
1513        int ret = !!(cdi->mc_flags & mask);
1514        bool changed;
1515
1516        if (!CDROM_CAN(CDC_MEDIA_CHANGED))
1517                return ret;
1518
1519        /* changed since last call? */
1520        if (cdi->ops->check_events) {
1521                BUG_ON(!queue); /* shouldn't be called from VFS path */
1522                cdrom_update_events(cdi, DISK_EVENT_MEDIA_CHANGE);
1523                changed = cdi->ioctl_events & DISK_EVENT_MEDIA_CHANGE;
1524                cdi->ioctl_events = 0;
1525        } else
1526                changed = cdi->ops->media_changed(cdi, CDSL_CURRENT);
1527
1528        if (changed) {
1529                cdi->mc_flags = 0x3;    /* set bit on both queues */
1530                ret |= 1;
1531                cdi->media_written = 0;
1532        }
1533
1534        cdi->mc_flags &= ~mask;         /* clear bit */
1535        return ret;
1536}
1537
1538int cdrom_media_changed(struct cdrom_device_info *cdi)
1539{
1540        /* This talks to the VFS, which doesn't like errors - just 1 or 0.  
1541         * Returning "0" is always safe (media hasn't been changed). Do that 
1542         * if the low-level cdrom driver dosn't support media changed. */ 
1543        if (cdi == NULL || cdi->ops->media_changed == NULL)
1544                return 0;
1545        if (!CDROM_CAN(CDC_MEDIA_CHANGED))
1546                return 0;
1547        return media_changed(cdi, 0);
1548}
1549
1550/* Requests to the low-level drivers will /always/ be done in the
1551   following format convention:
1552
1553   CDROM_LBA: all data-related requests.
1554   CDROM_MSF: all audio-related requests.
1555
1556   However, a low-level implementation is allowed to refuse this
1557   request, and return information in its own favorite format.
1558
1559   It doesn't make sense /at all/ to ask for a play_audio in LBA
1560   format, or ask for multi-session info in MSF format. However, for
1561   backward compatibility these format requests will be satisfied, but
1562   the requests to the low-level drivers will be sanitized in the more
1563   meaningful format indicated above.
1564 */
1565
1566static
1567void sanitize_format(union cdrom_addr *addr,
1568                     u_char * curr, u_char requested)
1569{
1570        if (*curr == requested)
1571                return;                 /* nothing to be done! */
1572        if (requested == CDROM_LBA) {
1573                addr->lba = (int) addr->msf.frame +
1574                        75 * (addr->msf.second - 2 + 60 * addr->msf.minute);
1575        } else {                        /* CDROM_MSF */
1576                int lba = addr->lba;
1577                addr->msf.frame = lba % 75;
1578                lba /= 75;
1579                lba += 2;
1580                addr->msf.second = lba % 60;
1581                addr->msf.minute = lba / 60;
1582        }
1583        *curr = requested;
1584}
1585
1586void init_cdrom_command(struct packet_command *cgc, void *buf, int len,
1587                        int type)
1588{
1589        memset(cgc, 0, sizeof(struct packet_command));
1590        if (buf)
1591                memset(buf, 0, len);
1592        cgc->buffer = (char *) buf;
1593        cgc->buflen = len;
1594        cgc->data_direction = type;
1595        cgc->timeout = CDROM_DEF_TIMEOUT;
1596}
1597
1598/* DVD handling */
1599
1600#define copy_key(dest,src)      memcpy((dest), (src), sizeof(dvd_key))
1601#define copy_chal(dest,src)     memcpy((dest), (src), sizeof(dvd_challenge))
1602
1603static void setup_report_key(struct packet_command *cgc, unsigned agid, unsigned type)
1604{
1605        cgc->cmd[0] = GPCMD_REPORT_KEY;
1606        cgc->cmd[10] = type | (agid << 6);
1607        switch (type) {
1608                case 0: case 8: case 5: {
1609                        cgc->buflen = 8;
1610                        break;
1611                }
1612                case 1: {
1613                        cgc->buflen = 16;
1614                        break;
1615                }
1616                case 2: case 4: {
1617                        cgc->buflen = 12;
1618                        break;
1619                }
1620        }
1621        cgc->cmd[9] = cgc->buflen;
1622        cgc->data_direction = CGC_DATA_READ;
1623}
1624
1625static void setup_send_key(struct packet_command *cgc, unsigned agid, unsigned type)
1626{
1627        cgc->cmd[0] = GPCMD_SEND_KEY;
1628        cgc->cmd[10] = type | (agid << 6);
1629        switch (type) {
1630                case 1: {
1631                        cgc->buflen = 16;
1632                        break;
1633                }
1634                case 3: {
1635                        cgc->buflen = 12;
1636                        break;
1637                }
1638                case 6: {
1639                        cgc->buflen = 8;
1640                        break;
1641                }
1642        }
1643        cgc->cmd[9] = cgc->buflen;
1644        cgc->data_direction = CGC_DATA_WRITE;
1645}
1646
1647static int dvd_do_auth(struct cdrom_device_info *cdi, dvd_authinfo *ai)
1648{
1649        int ret;
1650        u_char buf[20];
1651        struct packet_command cgc;
1652        const struct cdrom_device_ops *cdo = cdi->ops;
1653        rpc_state_t rpc_state;
1654
1655        memset(buf, 0, sizeof(buf));
1656        init_cdrom_command(&cgc, buf, 0, CGC_DATA_READ);
1657
1658        switch (ai->type) {
1659        /* LU data send */
1660        case DVD_LU_SEND_AGID:
1661                cd_dbg(CD_DVD, "entering DVD_LU_SEND_AGID\n");
1662                cgc.quiet = 1;
1663                setup_report_key(&cgc, ai->lsa.agid, 0);
1664
1665                if ((ret = cdo->generic_packet(cdi, &cgc)))
1666                        return ret;
1667
1668                ai->lsa.agid = buf[7] >> 6;
1669                /* Returning data, let host change state */
1670                break;
1671
1672        case DVD_LU_SEND_KEY1:
1673                cd_dbg(CD_DVD, "entering DVD_LU_SEND_KEY1\n");
1674                setup_report_key(&cgc, ai->lsk.agid, 2);
1675
1676                if ((ret = cdo->generic_packet(cdi, &cgc)))
1677                        return ret;
1678
1679                copy_key(ai->lsk.key, &buf[4]);
1680                /* Returning data, let host change state */
1681                break;
1682
1683        case DVD_LU_SEND_CHALLENGE:
1684                cd_dbg(CD_DVD, "entering DVD_LU_SEND_CHALLENGE\n");
1685                setup_report_key(&cgc, ai->lsc.agid, 1);
1686
1687                if ((ret = cdo->generic_packet(cdi, &cgc)))
1688                        return ret;
1689
1690                copy_chal(ai->lsc.chal, &buf[4]);
1691                /* Returning data, let host change state */
1692                break;
1693
1694        /* Post-auth key */
1695        case DVD_LU_SEND_TITLE_KEY:
1696                cd_dbg(CD_DVD, "entering DVD_LU_SEND_TITLE_KEY\n");
1697                cgc.quiet = 1;
1698                setup_report_key(&cgc, ai->lstk.agid, 4);
1699                cgc.cmd[5] = ai->lstk.lba;
1700                cgc.cmd[4] = ai->lstk.lba >> 8;
1701                cgc.cmd[3] = ai->lstk.lba >> 16;
1702                cgc.cmd[2] = ai->lstk.lba >> 24;
1703
1704                if ((ret = cdo->generic_packet(cdi, &cgc)))
1705                        return ret;
1706
1707                ai->lstk.cpm = (buf[4] >> 7) & 1;
1708                ai->lstk.cp_sec = (buf[4] >> 6) & 1;
1709                ai->lstk.cgms = (buf[4] >> 4) & 3;
1710                copy_key(ai->lstk.title_key, &buf[5]);
1711                /* Returning data, let host change state */
1712                break;
1713
1714        case DVD_LU_SEND_ASF:
1715                cd_dbg(CD_DVD, "entering DVD_LU_SEND_ASF\n");
1716                setup_report_key(&cgc, ai->lsasf.agid, 5);
1717                
1718                if ((ret = cdo->generic_packet(cdi, &cgc)))
1719                        return ret;
1720
1721                ai->lsasf.asf = buf[7] & 1;
1722                break;
1723
1724        /* LU data receive (LU changes state) */
1725        case DVD_HOST_SEND_CHALLENGE:
1726                cd_dbg(CD_DVD, "entering DVD_HOST_SEND_CHALLENGE\n");
1727                setup_send_key(&cgc, ai->hsc.agid, 1);
1728                buf[1] = 0xe;
1729                copy_chal(&buf[4], ai->hsc.chal);
1730
1731                if ((ret = cdo->generic_packet(cdi, &cgc)))
1732                        return ret;
1733
1734                ai->type = DVD_LU_SEND_KEY1;
1735                break;
1736
1737        case DVD_HOST_SEND_KEY2:
1738                cd_dbg(CD_DVD, "entering DVD_HOST_SEND_KEY2\n");
1739                setup_send_key(&cgc, ai->hsk.agid, 3);
1740                buf[1] = 0xa;
1741                copy_key(&buf[4], ai->hsk.key);
1742
1743                if ((ret = cdo->generic_packet(cdi, &cgc))) {
1744                        ai->type = DVD_AUTH_FAILURE;
1745                        return ret;
1746                }
1747                ai->type = DVD_AUTH_ESTABLISHED;
1748                break;
1749
1750        /* Misc */
1751        case DVD_INVALIDATE_AGID:
1752                cgc.quiet = 1;
1753                cd_dbg(CD_DVD, "entering DVD_INVALIDATE_AGID\n");
1754                setup_report_key(&cgc, ai->lsa.agid, 0x3f);
1755                if ((ret = cdo->generic_packet(cdi, &cgc)))
1756                        return ret;
1757                break;
1758
1759        /* Get region settings */
1760        case DVD_LU_SEND_RPC_STATE:
1761                cd_dbg(CD_DVD, "entering DVD_LU_SEND_RPC_STATE\n");
1762                setup_report_key(&cgc, 0, 8);
1763                memset(&rpc_state, 0, sizeof(rpc_state_t));
1764                cgc.buffer = (char *) &rpc_state;
1765
1766                if ((ret = cdo->generic_packet(cdi, &cgc)))
1767                        return ret;
1768
1769                ai->lrpcs.type = rpc_state.type_code;
1770                ai->lrpcs.vra = rpc_state.vra;
1771                ai->lrpcs.ucca = rpc_state.ucca;
1772                ai->lrpcs.region_mask = rpc_state.region_mask;
1773                ai->lrpcs.rpc_scheme = rpc_state.rpc_scheme;
1774                break;
1775
1776        /* Set region settings */
1777        case DVD_HOST_SEND_RPC_STATE:
1778                cd_dbg(CD_DVD, "entering DVD_HOST_SEND_RPC_STATE\n");
1779                setup_send_key(&cgc, 0, 6);
1780                buf[1] = 6;
1781                buf[4] = ai->hrpcs.pdrc;
1782
1783                if ((ret = cdo->generic_packet(cdi, &cgc)))
1784                        return ret;
1785                break;
1786
1787        default:
1788                cd_dbg(CD_WARNING, "Invalid DVD key ioctl (%d)\n", ai->type);
1789                return -ENOTTY;
1790        }
1791
1792        return 0;
1793}
1794
1795static int dvd_read_physical(struct cdrom_device_info *cdi, dvd_struct *s,
1796                                struct packet_command *cgc)
1797{
1798        unsigned char buf[21], *base;
1799        struct dvd_layer *layer;
1800        const struct cdrom_device_ops *cdo = cdi->ops;
1801        int ret, layer_num = s->physical.layer_num;
1802
1803        if (layer_num >= DVD_LAYERS)
1804                return -EINVAL;
1805
1806        init_cdrom_command(cgc, buf, sizeof(buf), CGC_DATA_READ);
1807        cgc->cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1808        cgc->cmd[6] = layer_num;
1809        cgc->cmd[7] = s->type;
1810        cgc->cmd[9] = cgc->buflen & 0xff;
1811
1812        /*
1813         * refrain from reporting errors on non-existing layers (mainly)
1814         */
1815        cgc->quiet = 1;
1816
1817        ret = cdo->generic_packet(cdi, cgc);
1818        if (ret)
1819                return ret;
1820
1821        base = &buf[4];
1822        layer = &s->physical.layer[layer_num];
1823
1824        /*
1825         * place the data... really ugly, but at least we won't have to
1826         * worry about endianess in userspace.
1827         */
1828        memset(layer, 0, sizeof(*layer));
1829        layer->book_version = base[0] & 0xf;
1830        layer->book_type = base[0] >> 4;
1831        layer->min_rate = base[1] & 0xf;
1832        layer->disc_size = base[1] >> 4;
1833        layer->layer_type = base[2] & 0xf;
1834        layer->track_path = (base[2] >> 4) & 1;
1835        layer->nlayers = (base[2] >> 5) & 3;
1836        layer->track_density = base[3] & 0xf;
1837        layer->linear_density = base[3] >> 4;
1838        layer->start_sector = base[5] << 16 | base[6] << 8 | base[7];
1839        layer->end_sector = base[9] << 16 | base[10] << 8 | base[11];
1840        layer->end_sector_l0 = base[13] << 16 | base[14] << 8 | base[15];
1841        layer->bca = base[16] >> 7;
1842
1843        return 0;
1844}
1845
1846static int dvd_read_copyright(struct cdrom_device_info *cdi, dvd_struct *s,
1847                                struct packet_command *cgc)
1848{
1849        int ret;
1850        u_char buf[8];
1851        const struct cdrom_device_ops *cdo = cdi->ops;
1852
1853        init_cdrom_command(cgc, buf, sizeof(buf), CGC_DATA_READ);
1854        cgc->cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1855        cgc->cmd[6] = s->copyright.layer_num;
1856        cgc->cmd[7] = s->type;
1857        cgc->cmd[8] = cgc->buflen >> 8;
1858        cgc->cmd[9] = cgc->buflen & 0xff;
1859
1860        ret = cdo->generic_packet(cdi, cgc);
1861        if (ret)
1862                return ret;
1863
1864        s->copyright.cpst = buf[4];
1865        s->copyright.rmi = buf[5];
1866
1867        return 0;
1868}
1869
1870static int dvd_read_disckey(struct cdrom_device_info *cdi, dvd_struct *s,
1871                                struct packet_command *cgc)
1872{
1873        int ret, size;
1874        u_char *buf;
1875        const struct cdrom_device_ops *cdo = cdi->ops;
1876
1877        size = sizeof(s->disckey.value) + 4;
1878
1879        buf = kmalloc(size, GFP_KERNEL);
1880        if (!buf)
1881                return -ENOMEM;
1882
1883        init_cdrom_command(cgc, buf, size, CGC_DATA_READ);
1884        cgc->cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1885        cgc->cmd[7] = s->type;
1886        cgc->cmd[8] = size >> 8;
1887        cgc->cmd[9] = size & 0xff;
1888        cgc->cmd[10] = s->disckey.agid << 6;
1889
1890        ret = cdo->generic_packet(cdi, cgc);
1891        if (!ret)
1892                memcpy(s->disckey.value, &buf[4], sizeof(s->disckey.value));
1893
1894        kfree(buf);
1895        return ret;
1896}
1897
1898static int dvd_read_bca(struct cdrom_device_info *cdi, dvd_struct *s,
1899                        struct packet_command *cgc)
1900{
1901        int ret, size = 4 + 188;
1902        u_char *buf;
1903        const struct cdrom_device_ops *cdo = cdi->ops;
1904
1905        buf = kmalloc(size, GFP_KERNEL);
1906        if (!buf)
1907                return -ENOMEM;
1908
1909        init_cdrom_command(cgc, buf, size, CGC_DATA_READ);
1910        cgc->cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1911        cgc->cmd[7] = s->type;
1912        cgc->cmd[9] = cgc->buflen & 0xff;
1913
1914        ret = cdo->generic_packet(cdi, cgc);
1915        if (ret)
1916                goto out;
1917
1918        s->bca.len = buf[0] << 8 | buf[1];
1919        if (s->bca.len < 12 || s->bca.len > 188) {
1920                cd_dbg(CD_WARNING, "Received invalid BCA length (%d)\n",
1921                       s->bca.len);
1922                ret = -EIO;
1923                goto out;
1924        }
1925        memcpy(s->bca.value, &buf[4], s->bca.len);
1926        ret = 0;
1927out:
1928        kfree(buf);
1929        return ret;
1930}
1931
1932static int dvd_read_manufact(struct cdrom_device_info *cdi, dvd_struct *s,
1933                                struct packet_command *cgc)
1934{
1935        int ret = 0, size;
1936        u_char *buf;
1937        const struct cdrom_device_ops *cdo = cdi->ops;
1938
1939        size = sizeof(s->manufact.value) + 4;
1940
1941        buf = kmalloc(size, GFP_KERNEL);
1942        if (!buf)
1943                return -ENOMEM;
1944
1945        init_cdrom_command(cgc, buf, size, CGC_DATA_READ);
1946        cgc->cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1947        cgc->cmd[7] = s->type;
1948        cgc->cmd[8] = size >> 8;
1949        cgc->cmd[9] = size & 0xff;
1950
1951        ret = cdo->generic_packet(cdi, cgc);
1952        if (ret)
1953                goto out;
1954
1955        s->manufact.len = buf[0] << 8 | buf[1];
1956        if (s->manufact.len < 0) {
1957                cd_dbg(CD_WARNING, "Received invalid manufacture info length (%d)\n",
1958                       s->manufact.len);
1959                ret = -EIO;
1960        } else {
1961                if (s->manufact.len > 2048) {
1962                        cd_dbg(CD_WARNING, "Received invalid manufacture info length (%d): truncating to 2048\n",
1963                               s->manufact.len);
1964                        s->manufact.len = 2048;
1965                }
1966                memcpy(s->manufact.value, &buf[4], s->manufact.len);
1967        }
1968
1969out:
1970        kfree(buf);
1971        return ret;
1972}
1973
1974static int dvd_read_struct(struct cdrom_device_info *cdi, dvd_struct *s,
1975                                struct packet_command *cgc)
1976{
1977        switch (s->type) {
1978        case DVD_STRUCT_PHYSICAL:
1979                return dvd_read_physical(cdi, s, cgc);
1980
1981        case DVD_STRUCT_COPYRIGHT:
1982                return dvd_read_copyright(cdi, s, cgc);
1983
1984        case DVD_STRUCT_DISCKEY:
1985                return dvd_read_disckey(cdi, s, cgc);
1986
1987        case DVD_STRUCT_BCA:
1988                return dvd_read_bca(cdi, s, cgc);
1989
1990        case DVD_STRUCT_MANUFACT:
1991                return dvd_read_manufact(cdi, s, cgc);
1992                
1993        default:
1994                cd_dbg(CD_WARNING, ": Invalid DVD structure read requested (%d)\n",
1995                       s->type);
1996                return -EINVAL;
1997        }
1998}
1999
2000int cdrom_mode_sense(struct cdrom_device_info *cdi,
2001                     struct packet_command *cgc,
2002                     int page_code, int page_control)
2003{
2004        const struct cdrom_device_ops *cdo = cdi->ops;
2005
2006        memset(cgc->cmd, 0, sizeof(cgc->cmd));
2007
2008        cgc->cmd[0] = GPCMD_MODE_SENSE_10;
2009        cgc->cmd[2] = page_code | (page_control << 6);
2010        cgc->cmd[7] = cgc->buflen >> 8;
2011        cgc->cmd[8] = cgc->buflen & 0xff;
2012        cgc->data_direction = CGC_DATA_READ;
2013        return cdo->generic_packet(cdi, cgc);
2014}
2015
2016int cdrom_mode_select(struct cdrom_device_info *cdi,
2017                      struct packet_command *cgc)
2018{
2019        const struct cdrom_device_ops *cdo = cdi->ops;
2020
2021        memset(cgc->cmd, 0, sizeof(cgc->cmd));
2022        memset(cgc->buffer, 0, 2);
2023        cgc->cmd[0] = GPCMD_MODE_SELECT_10;
2024        cgc->cmd[1] = 0x10;             /* PF */
2025        cgc->cmd[7] = cgc->buflen >> 8;
2026        cgc->cmd[8] = cgc->buflen & 0xff;
2027        cgc->data_direction = CGC_DATA_WRITE;
2028        return cdo->generic_packet(cdi, cgc);
2029}
2030
2031static int cdrom_read_subchannel(struct cdrom_device_info *cdi,
2032                                 struct cdrom_subchnl *subchnl, int mcn)
2033{
2034        const struct cdrom_device_ops *cdo = cdi->ops;
2035        struct packet_command cgc;
2036        char buffer[32];
2037        int ret;
2038
2039        init_cdrom_command(&cgc, buffer, 16, CGC_DATA_READ);
2040        cgc.cmd[0] = GPCMD_READ_SUBCHANNEL;
2041        cgc.cmd[1] = subchnl->cdsc_format;/* MSF or LBA addressing */
2042        cgc.cmd[2] = 0x40;  /* request subQ data */
2043        cgc.cmd[3] = mcn ? 2 : 1;
2044        cgc.cmd[8] = 16;
2045
2046        if ((ret = cdo->generic_packet(cdi, &cgc)))
2047                return ret;
2048
2049        subchnl->cdsc_audiostatus = cgc.buffer[1];
2050        subchnl->cdsc_ctrl = cgc.buffer[5] & 0xf;
2051        subchnl->cdsc_trk = cgc.buffer[6];
2052        subchnl->cdsc_ind = cgc.buffer[7];
2053
2054        if (subchnl->cdsc_format == CDROM_LBA) {
2055                subchnl->cdsc_absaddr.lba = ((cgc.buffer[8] << 24) |
2056                                                (cgc.buffer[9] << 16) |
2057                                                (cgc.buffer[10] << 8) |
2058                                                (cgc.buffer[11]));
2059                subchnl->cdsc_reladdr.lba = ((cgc.buffer[12] << 24) |
2060                                                (cgc.buffer[13] << 16) |
2061                                                (cgc.buffer[14] << 8) |
2062                                                (cgc.buffer[15]));
2063        } else {
2064                subchnl->cdsc_reladdr.msf.minute = cgc.buffer[13];
2065                subchnl->cdsc_reladdr.msf.second = cgc.buffer[14];
2066                subchnl->cdsc_reladdr.msf.frame = cgc.buffer[15];
2067                subchnl->cdsc_absaddr.msf.minute = cgc.buffer[9];
2068                subchnl->cdsc_absaddr.msf.second = cgc.buffer[10];
2069                subchnl->cdsc_absaddr.msf.frame = cgc.buffer[11];
2070        }
2071
2072        return 0;
2073}
2074
2075/*
2076 * Specific READ_10 interface
2077 */
2078static int cdrom_read_cd(struct cdrom_device_info *cdi,
2079                         struct packet_command *cgc, int lba,
2080                         int blocksize, int nblocks)
2081{
2082        const struct cdrom_device_ops *cdo = cdi->ops;
2083
2084        memset(&cgc->cmd, 0, sizeof(cgc->cmd));
2085        cgc->cmd[0] = GPCMD_READ_10;
2086        cgc->cmd[2] = (lba >> 24) & 0xff;
2087        cgc->cmd[3] = (lba >> 16) & 0xff;
2088        cgc->cmd[4] = (lba >>  8) & 0xff;
2089        cgc->cmd[5] = lba & 0xff;
2090        cgc->cmd[6] = (nblocks >> 16) & 0xff;
2091        cgc->cmd[7] = (nblocks >>  8) & 0xff;
2092        cgc->cmd[8] = nblocks & 0xff;
2093        cgc->buflen = blocksize * nblocks;
2094        return cdo->generic_packet(cdi, cgc);
2095}
2096
2097/* very generic interface for reading the various types of blocks */
2098static int cdrom_read_block(struct cdrom_device_info *cdi,
2099                            struct packet_command *cgc,
2100                            int lba, int nblocks, int format, int blksize)
2101{
2102        const struct cdrom_device_ops *cdo = cdi->ops;
2103
2104        memset(&cgc->cmd, 0, sizeof(cgc->cmd));
2105        cgc->cmd[0] = GPCMD_READ_CD;
2106        /* expected sector size - cdda,mode1,etc. */
2107        cgc->cmd[1] = format << 2;
2108        /* starting address */
2109        cgc->cmd[2] = (lba >> 24) & 0xff;
2110        cgc->cmd[3] = (lba >> 16) & 0xff;
2111        cgc->cmd[4] = (lba >>  8) & 0xff;
2112        cgc->cmd[5] = lba & 0xff;
2113        /* number of blocks */
2114        cgc->cmd[6] = (nblocks >> 16) & 0xff;
2115        cgc->cmd[7] = (nblocks >>  8) & 0xff;
2116        cgc->cmd[8] = nblocks & 0xff;
2117        cgc->buflen = blksize * nblocks;
2118        
2119        /* set the header info returned */
2120        switch (blksize) {
2121        case CD_FRAMESIZE_RAW0  : cgc->cmd[9] = 0x58; break;
2122        case CD_FRAMESIZE_RAW1  : cgc->cmd[9] = 0x78; break;
2123        case CD_FRAMESIZE_RAW   : cgc->cmd[9] = 0xf8; break;
2124        default                 : cgc->cmd[9] = 0x10;
2125        }
2126        
2127        return cdo->generic_packet(cdi, cgc);
2128}
2129
2130static int cdrom_read_cdda_old(struct cdrom_device_info *cdi, __u8 __user *ubuf,
2131                               int lba, int nframes)
2132{
2133        struct packet_command cgc;
2134        int ret = 0;
2135        int nr;
2136
2137        cdi->last_sense = 0;
2138
2139        memset(&cgc, 0, sizeof(cgc));
2140
2141        /*
2142         * start with will ra.nframes size, back down if alloc fails
2143         */
2144        nr = nframes;
2145        do {
2146                cgc.buffer = kmalloc_array(nr, CD_FRAMESIZE_RAW, GFP_KERNEL);
2147                if (cgc.buffer)
2148                        break;
2149
2150                nr >>= 1;
2151        } while (nr);
2152
2153        if (!nr)
2154                return -ENOMEM;
2155
2156        cgc.data_direction = CGC_DATA_READ;
2157        while (nframes > 0) {
2158                if (nr > nframes)
2159                        nr = nframes;
2160
2161                ret = cdrom_read_block(cdi, &cgc, lba, nr, 1, CD_FRAMESIZE_RAW);
2162                if (ret)
2163                        break;
2164                if (copy_to_user(ubuf, cgc.buffer, CD_FRAMESIZE_RAW * nr)) {
2165                        ret = -EFAULT;
2166                        break;
2167                }
2168                ubuf += CD_FRAMESIZE_RAW * nr;
2169                nframes -= nr;
2170                lba += nr;
2171        }
2172        kfree(cgc.buffer);
2173        return ret;
2174}
2175
2176static int cdrom_read_cdda_bpc(struct cdrom_device_info *cdi, __u8 __user *ubuf,
2177                               int lba, int nframes)
2178{
2179        struct request_queue *q = cdi->disk->queue;
2180        struct request *rq;
2181        struct scsi_request *req;
2182        struct bio *bio;
2183        unsigned int len;
2184        int nr, ret = 0;
2185
2186        if (!q)
2187                return -ENXIO;
2188
2189        if (!blk_queue_scsi_passthrough(q)) {
2190                WARN_ONCE(true,
2191                          "Attempt read CDDA info through a non-SCSI queue\n");
2192                return -EINVAL;
2193        }
2194
2195        cdi->last_sense = 0;
2196
2197        while (nframes) {
2198                nr = nframes;
2199                if (cdi->cdda_method == CDDA_BPC_SINGLE)
2200                        nr = 1;
2201                if (nr * CD_FRAMESIZE_RAW > (queue_max_sectors(q) << 9))
2202                        nr = (queue_max_sectors(q) << 9) / CD_FRAMESIZE_RAW;
2203
2204                len = nr * CD_FRAMESIZE_RAW;
2205
2206                rq = blk_get_request(q, REQ_OP_SCSI_IN, 0);
2207                if (IS_ERR(rq)) {
2208                        ret = PTR_ERR(rq);
2209                        break;
2210                }
2211                req = scsi_req(rq);
2212
2213                ret = blk_rq_map_user(q, rq, NULL, ubuf, len, GFP_KERNEL);
2214                if (ret) {
2215                        blk_put_request(rq);
2216                        break;
2217                }
2218
2219                req->cmd[0] = GPCMD_READ_CD;
2220                req->cmd[1] = 1 << 2;
2221                req->cmd[2] = (lba >> 24) & 0xff;
2222                req->cmd[3] = (lba >> 16) & 0xff;
2223                req->cmd[4] = (lba >>  8) & 0xff;
2224                req->cmd[5] = lba & 0xff;
2225                req->cmd[6] = (nr >> 16) & 0xff;
2226                req->cmd[7] = (nr >>  8) & 0xff;
2227                req->cmd[8] = nr & 0xff;
2228                req->cmd[9] = 0xf8;
2229
2230                req->cmd_len = 12;
2231                rq->timeout = 60 * HZ;
2232                bio = rq->bio;
2233
2234                blk_execute_rq(q, cdi->disk, rq, 0);
2235                if (scsi_req(rq)->result) {
2236                        struct scsi_sense_hdr sshdr;
2237
2238                        ret = -EIO;
2239                        scsi_normalize_sense(req->sense, req->sense_len,
2240                                             &sshdr);
2241                        cdi->last_sense = sshdr.sense_key;
2242                }
2243
2244                if (blk_rq_unmap_user(bio))
2245                        ret = -EFAULT;
2246                blk_put_request(rq);
2247
2248                if (ret)
2249                        break;
2250
2251                nframes -= nr;
2252                lba += nr;
2253                ubuf += len;
2254        }
2255
2256        return ret;
2257}
2258
2259static int cdrom_read_cdda(struct cdrom_device_info *cdi, __u8 __user *ubuf,
2260                           int lba, int nframes)
2261{
2262        int ret;
2263
2264        if (cdi->cdda_method == CDDA_OLD)
2265                return cdrom_read_cdda_old(cdi, ubuf, lba, nframes);
2266
2267retry:
2268        /*
2269         * for anything else than success and io error, we need to retry
2270         */
2271        ret = cdrom_read_cdda_bpc(cdi, ubuf, lba, nframes);
2272        if (!ret || ret != -EIO)
2273                return ret;
2274
2275        /*
2276         * I've seen drives get sense 4/8/3 udma crc errors on multi
2277         * frame dma, so drop to single frame dma if we need to
2278         */
2279        if (cdi->cdda_method == CDDA_BPC_FULL && nframes > 1) {
2280                pr_info("dropping to single frame dma\n");
2281                cdi->cdda_method = CDDA_BPC_SINGLE;
2282                goto retry;
2283        }
2284
2285        /*
2286         * so we have an io error of some sort with multi frame dma. if the
2287         * condition wasn't a hardware error
2288         * problems, not for any error
2289         */
2290        if (cdi->last_sense != 0x04 && cdi->last_sense != 0x0b)
2291                return ret;
2292
2293        pr_info("dropping to old style cdda (sense=%x)\n", cdi->last_sense);
2294        cdi->cdda_method = CDDA_OLD;
2295        return cdrom_read_cdda_old(cdi, ubuf, lba, nframes);    
2296}
2297
2298int cdrom_multisession(struct cdrom_device_info *cdi,
2299                struct cdrom_multisession *info)
2300{
2301        u8 requested_format;
2302        int ret;
2303
2304        if (!(cdi->ops->capability & CDC_MULTI_SESSION))
2305                return -ENOSYS;
2306
2307        requested_format = info->addr_format;
2308        if (requested_format != CDROM_MSF && requested_format != CDROM_LBA)
2309                return -EINVAL;
2310        info->addr_format = CDROM_LBA;
2311
2312        ret = cdi->ops->get_last_session(cdi, info);
2313        if (!ret)
2314                sanitize_format(&info->addr, &info->addr_format,
2315                                requested_format);
2316        return ret;
2317}
2318EXPORT_SYMBOL_GPL(cdrom_multisession);
2319
2320static int cdrom_ioctl_multisession(struct cdrom_device_info *cdi,
2321                void __user *argp)
2322{
2323        struct cdrom_multisession info;
2324        int ret;
2325
2326        cd_dbg(CD_DO_IOCTL, "entering CDROMMULTISESSION\n");
2327
2328        if (copy_from_user(&info, argp, sizeof(info)))
2329                return -EFAULT;
2330        ret = cdrom_multisession(cdi, &info);
2331        if (ret)
2332                return ret;
2333        if (copy_to_user(argp, &info, sizeof(info)))
2334                return -EFAULT;
2335
2336        cd_dbg(CD_DO_IOCTL, "CDROMMULTISESSION successful\n");
2337        return ret;
2338}
2339
2340static int cdrom_ioctl_eject(struct cdrom_device_info *cdi)
2341{
2342        cd_dbg(CD_DO_IOCTL, "entering CDROMEJECT\n");
2343
2344        if (!CDROM_CAN(CDC_OPEN_TRAY))
2345                return -ENOSYS;
2346        if (cdi->use_count != 1 || cdi->keeplocked)
2347                return -EBUSY;
2348        if (CDROM_CAN(CDC_LOCK)) {
2349                int ret = cdi->ops->lock_door(cdi, 0);
2350                if (ret)
2351                        return ret;
2352        }
2353
2354        return cdi->ops->tray_move(cdi, 1);
2355}
2356
2357static int cdrom_ioctl_closetray(struct cdrom_device_info *cdi)
2358{
2359        cd_dbg(CD_DO_IOCTL, "entering CDROMCLOSETRAY\n");
2360
2361        if (!CDROM_CAN(CDC_CLOSE_TRAY))
2362                return -ENOSYS;
2363        return cdi->ops->tray_move(cdi, 0);
2364}
2365
2366static int cdrom_ioctl_eject_sw(struct cdrom_device_info *cdi,
2367                unsigned long arg)
2368{
2369        cd_dbg(CD_DO_IOCTL, "entering CDROMEJECT_SW\n");
2370
2371        if (!CDROM_CAN(CDC_OPEN_TRAY))
2372                return -ENOSYS;
2373        if (cdi->keeplocked)
2374                return -EBUSY;
2375
2376        cdi->options &= ~(CDO_AUTO_CLOSE | CDO_AUTO_EJECT);
2377        if (arg)
2378                cdi->options |= CDO_AUTO_CLOSE | CDO_AUTO_EJECT;
2379        return 0;
2380}
2381
2382static int cdrom_ioctl_media_changed(struct cdrom_device_info *cdi,
2383                unsigned long arg)
2384{
2385        struct cdrom_changer_info *info;
2386        int ret;
2387
2388        cd_dbg(CD_DO_IOCTL, "entering CDROM_MEDIA_CHANGED\n");
2389
2390        if (!CDROM_CAN(CDC_MEDIA_CHANGED))
2391                return -ENOSYS;
2392
2393        /* cannot select disc or select current disc */
2394        if (!CDROM_CAN(CDC_SELECT_DISC) || arg == CDSL_CURRENT)
2395                return media_changed(cdi, 1);
2396
2397        if (arg >= cdi->capacity)
2398                return -EINVAL;
2399
2400        info = kmalloc(sizeof(*info), GFP_KERNEL);
2401        if (!info)
2402                return -ENOMEM;
2403
2404        ret = cdrom_read_mech_status(cdi, info);
2405        if (!ret)
2406                ret = info->slots[arg].change;
2407        kfree(info);
2408        return ret;
2409}
2410
2411static int cdrom_ioctl_set_options(struct cdrom_device_info *cdi,
2412                unsigned long arg)
2413{
2414        cd_dbg(CD_DO_IOCTL, "entering CDROM_SET_OPTIONS\n");
2415
2416        /*
2417         * Options need to be in sync with capability.
2418         * Too late for that, so we have to check each one separately.
2419         */
2420        switch (arg) {
2421        case CDO_USE_FFLAGS:
2422        case CDO_CHECK_TYPE:
2423                break;
2424        case CDO_LOCK:
2425                if (!CDROM_CAN(CDC_LOCK))
2426                        return -ENOSYS;
2427                break;
2428        case 0:
2429                return cdi->options;
2430        /* default is basically CDO_[AUTO_CLOSE|AUTO_EJECT] */
2431        default:
2432                if (!CDROM_CAN(arg))
2433                        return -ENOSYS;
2434        }
2435        cdi->options |= (int) arg;
2436        return cdi->options;
2437}
2438
2439static int cdrom_ioctl_clear_options(struct cdrom_device_info *cdi,
2440                unsigned long arg)
2441{
2442        cd_dbg(CD_DO_IOCTL, "entering CDROM_CLEAR_OPTIONS\n");
2443
2444        cdi->options &= ~(int) arg;
2445        return cdi->options;
2446}
2447
2448static int cdrom_ioctl_select_speed(struct cdrom_device_info *cdi,
2449                unsigned long arg)
2450{
2451        cd_dbg(CD_DO_IOCTL, "entering CDROM_SELECT_SPEED\n");
2452
2453        if (!CDROM_CAN(CDC_SELECT_SPEED))
2454                return -ENOSYS;
2455        return cdi->ops->select_speed(cdi, arg);
2456}
2457
2458static int cdrom_ioctl_select_disc(struct cdrom_device_info *cdi,
2459                unsigned long arg)
2460{
2461        cd_dbg(CD_DO_IOCTL, "entering CDROM_SELECT_DISC\n");
2462
2463        if (!CDROM_CAN(CDC_SELECT_DISC))
2464                return -ENOSYS;
2465
2466        if (arg != CDSL_CURRENT && arg != CDSL_NONE) {
2467                if (arg >= cdi->capacity)
2468                        return -EINVAL;
2469        }
2470
2471        /*
2472         * ->select_disc is a hook to allow a driver-specific way of
2473         * seleting disc.  However, since there is no equivalent hook for
2474         * cdrom_slot_status this may not actually be useful...
2475         */
2476        if (cdi->ops->select_disc)
2477                return cdi->ops->select_disc(cdi, arg);
2478
2479        cd_dbg(CD_CHANGER, "Using generic cdrom_select_disc()\n");
2480        return cdrom_select_disc(cdi, arg);
2481}
2482
2483static int cdrom_ioctl_reset(struct cdrom_device_info *cdi,
2484                struct block_device *bdev)
2485{
2486        cd_dbg(CD_DO_IOCTL, "entering CDROM_RESET\n");
2487
2488        if (!capable(CAP_SYS_ADMIN))
2489                return -EACCES;
2490        if (!CDROM_CAN(CDC_RESET))
2491                return -ENOSYS;
2492        invalidate_bdev(bdev);
2493        return cdi->ops->reset(cdi);
2494}
2495
2496static int cdrom_ioctl_lock_door(struct cdrom_device_info *cdi,
2497                unsigned long arg)
2498{
2499        cd_dbg(CD_DO_IOCTL, "%socking door\n", arg ? "L" : "Unl");
2500
2501        if (!CDROM_CAN(CDC_LOCK))
2502                return -EDRIVE_CANT_DO_THIS;
2503
2504        cdi->keeplocked = arg ? 1 : 0;
2505
2506        /*
2507         * Don't unlock the door on multiple opens by default, but allow
2508         * root to do so.
2509         */
2510        if (cdi->use_count != 1 && !arg && !capable(CAP_SYS_ADMIN))
2511                return -EBUSY;
2512        return cdi->ops->lock_door(cdi, arg);
2513}
2514
2515static int cdrom_ioctl_debug(struct cdrom_device_info *cdi,
2516                unsigned long arg)
2517{
2518        cd_dbg(CD_DO_IOCTL, "%sabling debug\n", arg ? "En" : "Dis");
2519
2520        if (!capable(CAP_SYS_ADMIN))
2521                return -EACCES;
2522        debug = arg ? 1 : 0;
2523        return debug;
2524}
2525
2526static int cdrom_ioctl_get_capability(struct cdrom_device_info *cdi)
2527{
2528        cd_dbg(CD_DO_IOCTL, "entering CDROM_GET_CAPABILITY\n");
2529        return (cdi->ops->capability & ~cdi->mask);
2530}
2531
2532/*
2533 * The following function is implemented, although very few audio
2534 * discs give Universal Product Code information, which should just be
2535 * the Medium Catalog Number on the box.  Note, that the way the code
2536 * is written on the CD is /not/ uniform across all discs!
2537 */
2538static int cdrom_ioctl_get_mcn(struct cdrom_device_info *cdi,
2539                void __user *argp)
2540{
2541        struct cdrom_mcn mcn;
2542        int ret;
2543
2544        cd_dbg(CD_DO_IOCTL, "entering CDROM_GET_MCN\n");
2545
2546        if (!(cdi->ops->capability & CDC_MCN))
2547                return -ENOSYS;
2548        ret = cdi->ops->get_mcn(cdi, &mcn);
2549        if (ret)
2550                return ret;
2551
2552        if (copy_to_user(argp, &mcn, sizeof(mcn)))
2553                return -EFAULT;
2554        cd_dbg(CD_DO_IOCTL, "CDROM_GET_MCN successful\n");
2555        return 0;
2556}
2557
2558static int cdrom_ioctl_drive_status(struct cdrom_device_info *cdi,
2559                unsigned long arg)
2560{
2561        cd_dbg(CD_DO_IOCTL, "entering CDROM_DRIVE_STATUS\n");
2562
2563        if (!(cdi->ops->capability & CDC_DRIVE_STATUS))
2564                return -ENOSYS;
2565        if (!CDROM_CAN(CDC_SELECT_DISC) ||
2566            (arg == CDSL_CURRENT || arg == CDSL_NONE))
2567                return cdi->ops->drive_status(cdi, CDSL_CURRENT);
2568        if (arg >= cdi->capacity)
2569                return -EINVAL;
2570        return cdrom_slot_status(cdi, arg);
2571}
2572
2573/*
2574 * Ok, this is where problems start.  The current interface for the
2575 * CDROM_DISC_STATUS ioctl is flawed.  It makes the false assumption that
2576 * CDs are all CDS_DATA_1 or all CDS_AUDIO, etc.  Unfortunately, while this
2577 * is often the case, it is also very common for CDs to have some tracks
2578 * with data, and some tracks with audio.  Just because I feel like it,
2579 * I declare the following to be the best way to cope.  If the CD has ANY
2580 * data tracks on it, it will be returned as a data CD.  If it has any XA
2581 * tracks, I will return it as that.  Now I could simplify this interface
2582 * by combining these  returns with the above, but this more clearly
2583 * demonstrates the problem with the current interface.  Too bad this
2584 * wasn't designed to use bitmasks...         -Erik
2585 *
2586 * Well, now we have the option CDS_MIXED: a mixed-type CD.
2587 * User level programmers might feel the ioctl is not very useful.
2588 *                                      ---david
2589 */
2590static int cdrom_ioctl_disc_status(struct cdrom_device_info *cdi)
2591{
2592        tracktype tracks;
2593
2594        cd_dbg(CD_DO_IOCTL, "entering CDROM_DISC_STATUS\n");
2595
2596        cdrom_count_tracks(cdi, &tracks);
2597        if (tracks.error)
2598                return tracks.error;
2599
2600        /* Policy mode on */
2601        if (tracks.audio > 0) {
2602                if (!tracks.data && !tracks.cdi && !tracks.xa)
2603                        return CDS_AUDIO;
2604                else
2605                        return CDS_MIXED;
2606        }
2607
2608        if (tracks.cdi > 0)
2609                return CDS_XA_2_2;
2610        if (tracks.xa > 0)
2611                return CDS_XA_2_1;
2612        if (tracks.data > 0)
2613                return CDS_DATA_1;
2614        /* Policy mode off */
2615
2616        cd_dbg(CD_WARNING, "This disc doesn't have any tracks I recognize!\n");
2617        return CDS_NO_INFO;
2618}
2619
2620static int cdrom_ioctl_changer_nslots(struct cdrom_device_info *cdi)
2621{
2622        cd_dbg(CD_DO_IOCTL, "entering CDROM_CHANGER_NSLOTS\n");
2623        return cdi->capacity;
2624}
2625
2626static int cdrom_ioctl_get_subchnl(struct cdrom_device_info *cdi,
2627                void __user *argp)
2628{
2629        struct cdrom_subchnl q;
2630        u8 requested, back;
2631        int ret;
2632
2633        /* cd_dbg(CD_DO_IOCTL,"entering CDROMSUBCHNL\n");*/
2634
2635        if (copy_from_user(&q, argp, sizeof(q)))
2636                return -EFAULT;
2637
2638        requested = q.cdsc_format;
2639        if (requested != CDROM_MSF && requested != CDROM_LBA)
2640                return -EINVAL;
2641        q.cdsc_format = CDROM_MSF;
2642
2643        ret = cdi->ops->audio_ioctl(cdi, CDROMSUBCHNL, &q);
2644        if (ret)
2645                return ret;
2646
2647        back = q.cdsc_format; /* local copy */
2648        sanitize_format(&q.cdsc_absaddr, &back, requested);
2649        sanitize_format(&q.cdsc_reladdr, &q.cdsc_format, requested);
2650
2651        if (copy_to_user(argp, &q, sizeof(q)))
2652                return -EFAULT;
2653        /* cd_dbg(CD_DO_IOCTL, "CDROMSUBCHNL successful\n"); */
2654        return 0;
2655}
2656
2657static int cdrom_ioctl_read_tochdr(struct cdrom_device_info *cdi,
2658                void __user *argp)
2659{
2660        struct cdrom_tochdr header;
2661        int ret;
2662
2663        /* cd_dbg(CD_DO_IOCTL, "entering CDROMREADTOCHDR\n"); */
2664
2665        if (copy_from_user(&header, argp, sizeof(header)))
2666                return -EFAULT;
2667
2668        ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header);
2669        if (ret)
2670                return ret;
2671
2672        if (copy_to_user(argp, &header, sizeof(header)))
2673                return -EFAULT;
2674        /* cd_dbg(CD_DO_IOCTL, "CDROMREADTOCHDR successful\n"); */
2675        return 0;
2676}
2677
2678int cdrom_read_tocentry(struct cdrom_device_info *cdi,
2679                struct cdrom_tocentry *entry)
2680{
2681        u8 requested_format = entry->cdte_format;
2682        int ret;
2683
2684        if (requested_format != CDROM_MSF && requested_format != CDROM_LBA)
2685                return -EINVAL;
2686
2687        /* make interface to low-level uniform */
2688        entry->cdte_format = CDROM_MSF;
2689        ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, entry);
2690        if (!ret)
2691                sanitize_format(&entry->cdte_addr, &entry->cdte_format,
2692                                requested_format);
2693        return ret;
2694}
2695EXPORT_SYMBOL_GPL(cdrom_read_tocentry);
2696
2697static int cdrom_ioctl_read_tocentry(struct cdrom_device_info *cdi,
2698                void __user *argp)
2699{
2700        struct cdrom_tocentry entry;
2701        int ret;
2702
2703        if (copy_from_user(&entry, argp, sizeof(entry)))
2704                return -EFAULT;
2705        ret = cdrom_read_tocentry(cdi, &entry);
2706        if (!ret && copy_to_user(argp, &entry, sizeof(entry)))
2707                return -EFAULT;
2708        return ret;
2709}
2710
2711static int cdrom_ioctl_play_msf(struct cdrom_device_info *cdi,
2712                void __user *argp)
2713{
2714        struct cdrom_msf msf;
2715
2716        cd_dbg(CD_DO_IOCTL, "entering CDROMPLAYMSF\n");
2717
2718        if (!CDROM_CAN(CDC_PLAY_AUDIO))
2719                return -ENOSYS;
2720        if (copy_from_user(&msf, argp, sizeof(msf)))
2721                return -EFAULT;
2722        return cdi->ops->audio_ioctl(cdi, CDROMPLAYMSF, &msf);
2723}
2724
2725static int cdrom_ioctl_play_trkind(struct cdrom_device_info *cdi,
2726                void __user *argp)
2727{
2728        struct cdrom_ti ti;
2729        int ret;
2730
2731        cd_dbg(CD_DO_IOCTL, "entering CDROMPLAYTRKIND\n");
2732
2733        if (!CDROM_CAN(CDC_PLAY_AUDIO))
2734                return -ENOSYS;
2735        if (copy_from_user(&ti, argp, sizeof(ti)))
2736                return -EFAULT;
2737
2738        ret = check_for_audio_disc(cdi, cdi->ops);
2739        if (ret)
2740                return ret;
2741        return cdi->ops->audio_ioctl(cdi, CDROMPLAYTRKIND, &ti);
2742}
2743static int cdrom_ioctl_volctrl(struct cdrom_device_info *cdi,
2744                void __user *argp)
2745{
2746        struct cdrom_volctrl volume;
2747
2748        cd_dbg(CD_DO_IOCTL, "entering CDROMVOLCTRL\n");
2749
2750        if (!CDROM_CAN(CDC_PLAY_AUDIO))
2751                return -ENOSYS;
2752        if (copy_from_user(&volume, argp, sizeof(volume)))
2753                return -EFAULT;
2754        return cdi->ops->audio_ioctl(cdi, CDROMVOLCTRL, &volume);
2755}
2756
2757static int cdrom_ioctl_volread(struct cdrom_device_info *cdi,
2758                void __user *argp)
2759{
2760        struct cdrom_volctrl volume;
2761        int ret;
2762
2763        cd_dbg(CD_DO_IOCTL, "entering CDROMVOLREAD\n");
2764
2765        if (!CDROM_CAN(CDC_PLAY_AUDIO))
2766                return -ENOSYS;
2767
2768        ret = cdi->ops->audio_ioctl(cdi, CDROMVOLREAD, &volume);
2769        if (ret)
2770                return ret;
2771
2772        if (copy_to_user(argp, &volume, sizeof(volume)))
2773                return -EFAULT;
2774        return 0;
2775}
2776
2777static int cdrom_ioctl_audioctl(struct cdrom_device_info *cdi,
2778                unsigned int cmd)
2779{
2780        int ret;
2781
2782        cd_dbg(CD_DO_IOCTL, "doing audio ioctl (start/stop/pause/resume)\n");
2783
2784        if (!CDROM_CAN(CDC_PLAY_AUDIO))
2785                return -ENOSYS;
2786        ret = check_for_audio_disc(cdi, cdi->ops);
2787        if (ret)
2788                return ret;
2789        return cdi->ops->audio_ioctl(cdi, cmd, NULL);
2790}
2791
2792/*
2793 * Required when we need to use READ_10 to issue other than 2048 block
2794 * reads
2795 */
2796static int cdrom_switch_blocksize(struct cdrom_device_info *cdi, int size)
2797{
2798        const struct cdrom_device_ops *cdo = cdi->ops;
2799        struct packet_command cgc;
2800        struct modesel_head mh;
2801
2802        memset(&mh, 0, sizeof(mh));
2803        mh.block_desc_length = 0x08;
2804        mh.block_length_med = (size >> 8) & 0xff;
2805        mh.block_length_lo = size & 0xff;
2806
2807        memset(&cgc, 0, sizeof(cgc));
2808        cgc.cmd[0] = 0x15;
2809        cgc.cmd[1] = 1 << 4;
2810        cgc.cmd[4] = 12;
2811        cgc.buflen = sizeof(mh);
2812        cgc.buffer = (char *) &mh;
2813        cgc.data_direction = CGC_DATA_WRITE;
2814        mh.block_desc_length = 0x08;
2815        mh.block_length_med = (size >> 8) & 0xff;
2816        mh.block_length_lo = size & 0xff;
2817
2818        return cdo->generic_packet(cdi, &cgc);
2819}
2820
2821static int cdrom_get_track_info(struct cdrom_device_info *cdi,
2822                                __u16 track, __u8 type, track_information *ti)
2823{
2824        const struct cdrom_device_ops *cdo = cdi->ops;
2825        struct packet_command cgc;
2826        int ret, buflen;
2827
2828        init_cdrom_command(&cgc, ti, 8, CGC_DATA_READ);
2829        cgc.cmd[0] = GPCMD_READ_TRACK_RZONE_INFO;
2830        cgc.cmd[1] = type & 3;
2831        cgc.cmd[4] = (track & 0xff00) >> 8;
2832        cgc.cmd[5] = track & 0xff;
2833        cgc.cmd[8] = 8;
2834        cgc.quiet = 1;
2835
2836        ret = cdo->generic_packet(cdi, &cgc);
2837        if (ret)
2838                return ret;
2839
2840        buflen = be16_to_cpu(ti->track_information_length) +
2841                sizeof(ti->track_information_length);
2842
2843        if (buflen > sizeof(track_information))
2844                buflen = sizeof(track_information);
2845
2846        cgc.cmd[8] = cgc.buflen = buflen;
2847        ret = cdo->generic_packet(cdi, &cgc);
2848        if (ret)
2849                return ret;
2850
2851        /* return actual fill size */
2852        return buflen;
2853}
2854
2855/* return the last written block on the CD-R media. this is for the udf
2856   file system. */
2857int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written)
2858{
2859        struct cdrom_tocentry toc;
2860        disc_information di;
2861        track_information ti;
2862        __u32 last_track;
2863        int ret = -1, ti_size;
2864
2865        if (!CDROM_CAN(CDC_GENERIC_PACKET))
2866                goto use_toc;
2867
2868        ret = cdrom_get_disc_info(cdi, &di);
2869        if (ret < (int)(offsetof(typeof(di), last_track_lsb)
2870                        + sizeof(di.last_track_lsb)))
2871                goto use_toc;
2872
2873        /* if unit didn't return msb, it's zeroed by cdrom_get_disc_info */
2874        last_track = (di.last_track_msb << 8) | di.last_track_lsb;
2875        ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
2876        if (ti_size < (int)offsetof(typeof(ti), track_start))
2877                goto use_toc;
2878
2879        /* if this track is blank, try the previous. */
2880        if (ti.blank) {
2881                if (last_track == 1)
2882                        goto use_toc;
2883                last_track--;
2884                ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
2885        }
2886
2887        if (ti_size < (int)(offsetof(typeof(ti), track_size)
2888                                + sizeof(ti.track_size)))
2889                goto use_toc;
2890
2891        /* if last recorded field is valid, return it. */
2892        if (ti.lra_v && ti_size >= (int)(offsetof(typeof(ti), last_rec_address)
2893                                + sizeof(ti.last_rec_address))) {
2894                *last_written = be32_to_cpu(ti.last_rec_address);
2895        } else {
2896                /* make it up instead */
2897                *last_written = be32_to_cpu(ti.track_start) +
2898                                be32_to_cpu(ti.track_size);
2899                if (ti.free_blocks)
2900                        *last_written -= (be32_to_cpu(ti.free_blocks) + 7);
2901        }
2902        return 0;
2903
2904        /* this is where we end up if the drive either can't do a
2905           GPCMD_READ_DISC_INFO or GPCMD_READ_TRACK_RZONE_INFO or if
2906           it doesn't give enough information or fails. then we return
2907           the toc contents. */
2908use_toc:
2909        if (!CDROM_CAN(CDC_PLAY_AUDIO))
2910                return -ENOSYS;
2911
2912        toc.cdte_format = CDROM_MSF;
2913        toc.cdte_track = CDROM_LEADOUT;
2914        if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &toc)))
2915                return ret;
2916        sanitize_format(&toc.cdte_addr, &toc.cdte_format, CDROM_LBA);
2917        *last_written = toc.cdte_addr.lba;
2918        return 0;
2919}
2920
2921/* return the next writable block. also for udf file system. */
2922static int cdrom_get_next_writable(struct cdrom_device_info *cdi,
2923                                   long *next_writable)
2924{
2925        disc_information di;
2926        track_information ti;
2927        __u16 last_track;
2928        int ret, ti_size;
2929
2930        if (!CDROM_CAN(CDC_GENERIC_PACKET))
2931                goto use_last_written;
2932
2933        ret = cdrom_get_disc_info(cdi, &di);
2934        if (ret < 0 || ret < offsetof(typeof(di), last_track_lsb)
2935                                + sizeof(di.last_track_lsb))
2936                goto use_last_written;
2937
2938        /* if unit didn't return msb, it's zeroed by cdrom_get_disc_info */
2939        last_track = (di.last_track_msb << 8) | di.last_track_lsb;
2940        ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
2941        if (ti_size < 0 || ti_size < offsetof(typeof(ti), track_start))
2942                goto use_last_written;
2943
2944        /* if this track is blank, try the previous. */
2945        if (ti.blank) {
2946                if (last_track == 1)
2947                        goto use_last_written;
2948                last_track--;
2949                ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
2950                if (ti_size < 0)
2951                        goto use_last_written;
2952        }
2953
2954        /* if next recordable address field is valid, use it. */
2955        if (ti.nwa_v && ti_size >= offsetof(typeof(ti), next_writable)
2956                                + sizeof(ti.next_writable)) {
2957                *next_writable = be32_to_cpu(ti.next_writable);
2958                return 0;
2959        }
2960
2961use_last_written:
2962        ret = cdrom_get_last_written(cdi, next_writable);
2963        if (ret) {
2964                *next_writable = 0;
2965                return ret;
2966        } else {
2967                *next_writable += 7;
2968                return 0;
2969        }
2970}
2971
2972static noinline int mmc_ioctl_cdrom_read_data(struct cdrom_device_info *cdi,
2973                                              void __user *arg,
2974                                              struct packet_command *cgc,
2975                                              int cmd)
2976{
2977        struct scsi_sense_hdr sshdr;
2978        struct cdrom_msf msf;
2979        int blocksize = 0, format = 0, lba;
2980        int ret;
2981
2982        switch (cmd) {
2983        case CDROMREADRAW:
2984                blocksize = CD_FRAMESIZE_RAW;
2985                break;
2986        case CDROMREADMODE1:
2987                blocksize = CD_FRAMESIZE;
2988                format = 2;
2989                break;
2990        case CDROMREADMODE2:
2991                blocksize = CD_FRAMESIZE_RAW0;
2992                break;
2993        }
2994        if (copy_from_user(&msf, (struct cdrom_msf __user *)arg, sizeof(msf)))
2995                return -EFAULT;
2996        lba = msf_to_lba(msf.cdmsf_min0, msf.cdmsf_sec0, msf.cdmsf_frame0);
2997        /* FIXME: we need upper bound checking, too!! */
2998        if (lba < 0)
2999                return -EINVAL;
3000
3001        cgc->buffer = kzalloc(blocksize, GFP_KERNEL);
3002        if (cgc->buffer == NULL)
3003                return -ENOMEM;
3004
3005        memset(&sshdr, 0, sizeof(sshdr));
3006        cgc->sshdr = &sshdr;
3007        cgc->data_direction = CGC_DATA_READ;
3008        ret = cdrom_read_block(cdi, cgc, lba, 1, format, blocksize);
3009        if (ret && sshdr.sense_key == 0x05 &&
3010            sshdr.asc == 0x20 &&
3011            sshdr.ascq == 0x00) {
3012                /*
3013                 * SCSI-II devices are not required to support
3014                 * READ_CD, so let's try switching block size
3015                 */
3016                /* FIXME: switch back again... */
3017                ret = cdrom_switch_blocksize(cdi, blocksize);
3018                if (ret)
3019                        goto out;
3020                cgc->sshdr = NULL;
3021                ret = cdrom_read_cd(cdi, cgc, lba, blocksize, 1);
3022                ret |= cdrom_switch_blocksize(cdi, blocksize);
3023        }
3024        if (!ret && copy_to_user(arg, cgc->buffer, blocksize))
3025                ret = -EFAULT;
3026out:
3027        kfree(cgc->buffer);
3028        return ret;
3029}
3030
3031static noinline int mmc_ioctl_cdrom_read_audio(struct cdrom_device_info *cdi,
3032                                               void __user *arg)
3033{
3034        struct cdrom_read_audio ra;
3035        int lba;
3036
3037#ifdef CONFIG_COMPAT
3038        if (in_compat_syscall()) {
3039                struct compat_cdrom_read_audio {
3040                        union cdrom_addr        addr;
3041                        u8                      addr_format;
3042                        compat_int_t            nframes;
3043                        compat_caddr_t          buf;
3044                } ra32;
3045
3046                if (copy_from_user(&ra32, arg, sizeof(ra32)))
3047                        return -EFAULT;
3048
3049                ra = (struct cdrom_read_audio) {
3050                        .addr           = ra32.addr,
3051                        .addr_format    = ra32.addr_format,
3052                        .nframes        = ra32.nframes,
3053                        .buf            = compat_ptr(ra32.buf),
3054                };
3055        } else
3056#endif
3057        {
3058                if (copy_from_user(&ra, (struct cdrom_read_audio __user *)arg,
3059                                   sizeof(ra)))
3060                        return -EFAULT;
3061        }
3062
3063        if (ra.addr_format == CDROM_MSF)
3064                lba = msf_to_lba(ra.addr.msf.minute,
3065                                 ra.addr.msf.second,
3066                                 ra.addr.msf.frame);
3067        else if (ra.addr_format == CDROM_LBA)
3068                lba = ra.addr.lba;
3069        else
3070                return -EINVAL;
3071
3072        /* FIXME: we need upper bound checking, too!! */
3073        if (lba < 0 || ra.nframes <= 0 || ra.nframes > CD_FRAMES)
3074                return -EINVAL;
3075
3076        return cdrom_read_cdda(cdi, ra.buf, lba, ra.nframes);
3077}
3078
3079static noinline int mmc_ioctl_cdrom_subchannel(struct cdrom_device_info *cdi,
3080                                               void __user *arg)
3081{
3082        int ret;
3083        struct cdrom_subchnl q;
3084        u_char requested, back;
3085        if (copy_from_user(&q, (struct cdrom_subchnl __user *)arg, sizeof(q)))
3086                return -EFAULT;
3087        requested = q.cdsc_format;
3088        if (!((requested == CDROM_MSF) ||
3089              (requested == CDROM_LBA)))
3090                return -EINVAL;
3091
3092        ret = cdrom_read_subchannel(cdi, &q, 0);
3093        if (ret)
3094                return ret;
3095        back = q.cdsc_format; /* local copy */
3096        sanitize_format(&q.cdsc_absaddr, &back, requested);
3097        sanitize_format(&q.cdsc_reladdr, &q.cdsc_format, requested);
3098        if (copy_to_user((struct cdrom_subchnl __user *)arg, &q, sizeof(q)))
3099                return -EFAULT;
3100        /* cd_dbg(CD_DO_IOCTL, "CDROMSUBCHNL successful\n"); */
3101        return 0;
3102}
3103
3104static noinline int mmc_ioctl_cdrom_play_msf(struct cdrom_device_info *cdi,
3105                                             void __user *arg,
3106                                             struct packet_command *cgc)
3107{
3108        const struct cdrom_device_ops *cdo = cdi->ops;
3109        struct cdrom_msf msf;
3110        cd_dbg(CD_DO_IOCTL, "entering CDROMPLAYMSF\n");
3111        if (copy_from_user(&msf, (struct cdrom_msf __user *)arg, sizeof(msf)))
3112                return -EFAULT;
3113        cgc->cmd[0] = GPCMD_PLAY_AUDIO_MSF;
3114        cgc->cmd[3] = msf.cdmsf_min0;
3115        cgc->cmd[4] = msf.cdmsf_sec0;
3116        cgc->cmd[5] = msf.cdmsf_frame0;
3117        cgc->cmd[6] = msf.cdmsf_min1;
3118        cgc->cmd[7] = msf.cdmsf_sec1;
3119        cgc->cmd[8] = msf.cdmsf_frame1;
3120        cgc->data_direction = CGC_DATA_NONE;
3121        return cdo->generic_packet(cdi, cgc);
3122}
3123
3124static noinline int mmc_ioctl_cdrom_play_blk(struct cdrom_device_info *cdi,
3125                                             void __user *arg,
3126                                             struct packet_command *cgc)
3127{
3128        const struct cdrom_device_ops *cdo = cdi->ops;
3129        struct cdrom_blk blk;
3130        cd_dbg(CD_DO_IOCTL, "entering CDROMPLAYBLK\n");
3131        if (copy_from_user(&blk, (struct cdrom_blk __user *)arg, sizeof(blk)))
3132                return -EFAULT;
3133        cgc->cmd[0] = GPCMD_PLAY_AUDIO_10;
3134        cgc->cmd[2] = (blk.from >> 24) & 0xff;
3135        cgc->cmd[3] = (blk.from >> 16) & 0xff;
3136        cgc->cmd[4] = (blk.from >>  8) & 0xff;
3137        cgc->cmd[5] = blk.from & 0xff;
3138        cgc->cmd[7] = (blk.len >> 8) & 0xff;
3139        cgc->cmd[8] = blk.len & 0xff;
3140        cgc->data_direction = CGC_DATA_NONE;
3141        return cdo->generic_packet(cdi, cgc);
3142}
3143
3144static noinline int mmc_ioctl_cdrom_volume(struct cdrom_device_info *cdi,
3145                                           void __user *arg,
3146                                           struct packet_command *cgc,
3147                                           unsigned int cmd)
3148{
3149        struct cdrom_volctrl volctrl;
3150        unsigned char buffer[32];
3151        char mask[sizeof(buffer)];
3152        unsigned short offset;
3153        int ret;
3154
3155        cd_dbg(CD_DO_IOCTL, "entering CDROMVOLUME\n");
3156
3157        if (copy_from_user(&volctrl, (struct cdrom_volctrl __user *)arg,
3158                           sizeof(volctrl)))
3159                return -EFAULT;
3160
3161        cgc->buffer = buffer;
3162        cgc->buflen = 24;
3163        ret = cdrom_mode_sense(cdi, cgc, GPMODE_AUDIO_CTL_PAGE, 0);
3164        if (ret)
3165                return ret;
3166                
3167        /* originally the code depended on buffer[1] to determine
3168           how much data is available for transfer. buffer[1] is
3169           unfortunately ambigious and the only reliable way seem
3170           to be to simply skip over the block descriptor... */
3171        offset = 8 + be16_to_cpu(*(__be16 *)(buffer + 6));
3172
3173        if (offset + 16 > sizeof(buffer))
3174                return -E2BIG;
3175
3176        if (offset + 16 > cgc->buflen) {
3177                cgc->buflen = offset + 16;
3178                ret = cdrom_mode_sense(cdi, cgc,
3179                                       GPMODE_AUDIO_CTL_PAGE, 0);
3180                if (ret)
3181                        return ret;
3182        }
3183
3184        /* sanity check */
3185        if ((buffer[offset] & 0x3f) != GPMODE_AUDIO_CTL_PAGE ||
3186            buffer[offset + 1] < 14)
3187                return -EINVAL;
3188
3189        /* now we have the current volume settings. if it was only
3190           a CDROMVOLREAD, return these values */
3191        if (cmd == CDROMVOLREAD) {
3192                volctrl.channel0 = buffer[offset+9];
3193                volctrl.channel1 = buffer[offset+11];
3194                volctrl.channel2 = buffer[offset+13];
3195                volctrl.channel3 = buffer[offset+15];
3196                if (copy_to_user((struct cdrom_volctrl __user *)arg, &volctrl,
3197                                 sizeof(volctrl)))
3198                        return -EFAULT;
3199                return 0;
3200        }
3201                
3202        /* get the volume mask */
3203        cgc->buffer = mask;
3204        ret = cdrom_mode_sense(cdi, cgc, GPMODE_AUDIO_CTL_PAGE, 1);
3205        if (ret)
3206                return ret;
3207
3208        buffer[offset + 9]  = volctrl.channel0 & mask[offset + 9];
3209        buffer[offset + 11] = volctrl.channel1 & mask[offset + 11];
3210        buffer[offset + 13] = volctrl.channel2 & mask[offset + 13];
3211        buffer[offset + 15] = volctrl.channel3 & mask[offset + 15];
3212
3213        /* set volume */
3214        cgc->buffer = buffer + offset - 8;
3215        memset(cgc->buffer, 0, 8);
3216        return cdrom_mode_select(cdi, cgc);
3217}
3218
3219static noinline int mmc_ioctl_cdrom_start_stop(struct cdrom_device_info *cdi,
3220                                               struct packet_command *cgc,
3221                                               int cmd)
3222{
3223        const struct cdrom_device_ops *cdo = cdi->ops;
3224        cd_dbg(CD_DO_IOCTL, "entering CDROMSTART/CDROMSTOP\n");
3225        cgc->cmd[0] = GPCMD_START_STOP_UNIT;
3226        cgc->cmd[1] = 1;
3227        cgc->cmd[4] = (cmd == CDROMSTART) ? 1 : 0;
3228        cgc->data_direction = CGC_DATA_NONE;
3229        return cdo->generic_packet(cdi, cgc);
3230}
3231
3232static noinline int mmc_ioctl_cdrom_pause_resume(struct cdrom_device_info *cdi,
3233                                                 struct packet_command *cgc,
3234                                                 int cmd)
3235{
3236        const struct cdrom_device_ops *cdo = cdi->ops;
3237        cd_dbg(CD_DO_IOCTL, "entering CDROMPAUSE/CDROMRESUME\n");
3238        cgc->cmd[0] = GPCMD_PAUSE_RESUME;
3239        cgc->cmd[8] = (cmd == CDROMRESUME) ? 1 : 0;
3240        cgc->data_direction = CGC_DATA_NONE;
3241        return cdo->generic_packet(cdi, cgc);
3242}
3243
3244static noinline int mmc_ioctl_dvd_read_struct(struct cdrom_device_info *cdi,
3245                                              void __user *arg,
3246                                              struct packet_command *cgc)
3247{
3248        int ret;
3249        dvd_struct *s;
3250        int size = sizeof(dvd_struct);
3251
3252        if (!CDROM_CAN(CDC_DVD))
3253                return -ENOSYS;
3254
3255        s = memdup_user(arg, size);
3256        if (IS_ERR(s))
3257                return PTR_ERR(s);
3258
3259        cd_dbg(CD_DO_IOCTL, "entering DVD_READ_STRUCT\n");
3260
3261        ret = dvd_read_struct(cdi, s, cgc);
3262        if (ret)
3263                goto out;
3264
3265        if (copy_to_user(arg, s, size))
3266                ret = -EFAULT;
3267out:
3268        kfree(s);
3269        return ret;
3270}
3271
3272static noinline int mmc_ioctl_dvd_auth(struct cdrom_device_info *cdi,
3273                                       void __user *arg)
3274{
3275        int ret;
3276        dvd_authinfo ai;
3277        if (!CDROM_CAN(CDC_DVD))
3278                return -ENOSYS;
3279        cd_dbg(CD_DO_IOCTL, "entering DVD_AUTH\n");
3280        if (copy_from_user(&ai, (dvd_authinfo __user *)arg, sizeof(ai)))
3281                return -EFAULT;
3282        ret = dvd_do_auth(cdi, &ai);
3283        if (ret)
3284                return ret;
3285        if (copy_to_user((dvd_authinfo __user *)arg, &ai, sizeof(ai)))
3286                return -EFAULT;
3287        return 0;
3288}
3289
3290static noinline int mmc_ioctl_cdrom_next_writable(struct cdrom_device_info *cdi,
3291                                                  void __user *arg)
3292{
3293        int ret;
3294        long next = 0;
3295        cd_dbg(CD_DO_IOCTL, "entering CDROM_NEXT_WRITABLE\n");
3296        ret = cdrom_get_next_writable(cdi, &next);
3297        if (ret)
3298                return ret;
3299        if (copy_to_user((long __user *)arg, &next, sizeof(next)))
3300                return -EFAULT;
3301        return 0;
3302}
3303
3304static noinline int mmc_ioctl_cdrom_last_written(struct cdrom_device_info *cdi,
3305                                                 void __user *arg)
3306{
3307        int ret;
3308        long last = 0;
3309        cd_dbg(CD_DO_IOCTL, "entering CDROM_LAST_WRITTEN\n");
3310        ret = cdrom_get_last_written(cdi, &last);
3311        if (ret)
3312                return ret;
3313        if (in_compat_syscall())
3314                return put_user(last, (__s32 __user *)arg);
3315
3316        return put_user(last, (long __user *)arg);
3317}
3318
3319static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
3320                     unsigned long arg)
3321{
3322        struct packet_command cgc;
3323        void __user *userptr = (void __user *)arg;
3324
3325        memset(&cgc, 0, sizeof(cgc));
3326
3327        /* build a unified command and queue it through
3328           cdo->generic_packet() */
3329        switch (cmd) {
3330        case CDROMREADRAW:
3331        case CDROMREADMODE1:
3332        case CDROMREADMODE2:
3333                return mmc_ioctl_cdrom_read_data(cdi, userptr, &cgc, cmd);
3334        case CDROMREADAUDIO:
3335                return mmc_ioctl_cdrom_read_audio(cdi, userptr);
3336        case CDROMSUBCHNL:
3337                return mmc_ioctl_cdrom_subchannel(cdi, userptr);
3338        case CDROMPLAYMSF:
3339                return mmc_ioctl_cdrom_play_msf(cdi, userptr, &cgc);
3340        case CDROMPLAYBLK:
3341                return mmc_ioctl_cdrom_play_blk(cdi, userptr, &cgc);
3342        case CDROMVOLCTRL:
3343        case CDROMVOLREAD:
3344                return mmc_ioctl_cdrom_volume(cdi, userptr, &cgc, cmd);
3345        case CDROMSTART:
3346        case CDROMSTOP:
3347                return mmc_ioctl_cdrom_start_stop(cdi, &cgc, cmd);
3348        case CDROMPAUSE:
3349        case CDROMRESUME:
3350                return mmc_ioctl_cdrom_pause_resume(cdi, &cgc, cmd);
3351        case DVD_READ_STRUCT:
3352                return mmc_ioctl_dvd_read_struct(cdi, userptr, &cgc);
3353        case DVD_AUTH:
3354                return mmc_ioctl_dvd_auth(cdi, userptr);
3355        case CDROM_NEXT_WRITABLE:
3356                return mmc_ioctl_cdrom_next_writable(cdi, userptr);
3357        case CDROM_LAST_WRITTEN:
3358                return mmc_ioctl_cdrom_last_written(cdi, userptr);
3359        }
3360
3361        return -ENOTTY;
3362}
3363
3364/*
3365 * Just about every imaginable ioctl is supported in the Uniform layer
3366 * these days.
3367 * ATAPI / SCSI specific code now mainly resides in mmc_ioctl().
3368 */
3369int cdrom_ioctl(struct cdrom_device_info *cdi, struct block_device *bdev,
3370                fmode_t mode, unsigned int cmd, unsigned long arg)
3371{
3372        void __user *argp = (void __user *)arg;
3373        int ret;
3374
3375        /*
3376         * Try the generic SCSI command ioctl's first.
3377         */
3378        ret = scsi_cmd_blk_ioctl(bdev, mode, cmd, argp);
3379        if (ret != -ENOTTY)
3380                return ret;
3381
3382        switch (cmd) {
3383        case CDROMMULTISESSION:
3384                return cdrom_ioctl_multisession(cdi, argp);
3385        case CDROMEJECT:
3386                return cdrom_ioctl_eject(cdi);
3387        case CDROMCLOSETRAY:
3388                return cdrom_ioctl_closetray(cdi);
3389        case CDROMEJECT_SW:
3390                return cdrom_ioctl_eject_sw(cdi, arg);
3391        case CDROM_MEDIA_CHANGED:
3392                return cdrom_ioctl_media_changed(cdi, arg);
3393        case CDROM_SET_OPTIONS:
3394                return cdrom_ioctl_set_options(cdi, arg);
3395        case CDROM_CLEAR_OPTIONS:
3396                return cdrom_ioctl_clear_options(cdi, arg);
3397        case CDROM_SELECT_SPEED:
3398                return cdrom_ioctl_select_speed(cdi, arg);
3399        case CDROM_SELECT_DISC:
3400                return cdrom_ioctl_select_disc(cdi, arg);
3401        case CDROMRESET:
3402                return cdrom_ioctl_reset(cdi, bdev);
3403        case CDROM_LOCKDOOR:
3404                return cdrom_ioctl_lock_door(cdi, arg);
3405        case CDROM_DEBUG:
3406                return cdrom_ioctl_debug(cdi, arg);
3407        case CDROM_GET_CAPABILITY:
3408                return cdrom_ioctl_get_capability(cdi);
3409        case CDROM_GET_MCN:
3410                return cdrom_ioctl_get_mcn(cdi, argp);
3411        case CDROM_DRIVE_STATUS:
3412                return cdrom_ioctl_drive_status(cdi, arg);
3413        case CDROM_DISC_STATUS:
3414                return cdrom_ioctl_disc_status(cdi);
3415        case CDROM_CHANGER_NSLOTS:
3416                return cdrom_ioctl_changer_nslots(cdi);
3417        }
3418
3419        /*
3420         * Use the ioctls that are implemented through the generic_packet()
3421         * interface. this may look at bit funny, but if -ENOTTY is
3422         * returned that particular ioctl is not implemented and we
3423         * let it go through the device specific ones.
3424         */
3425        if (CDROM_CAN(CDC_GENERIC_PACKET)) {
3426                ret = mmc_ioctl(cdi, cmd, arg);
3427                if (ret != -ENOTTY)
3428                        return ret;
3429        }
3430
3431        /*
3432         * Note: most of the cd_dbg() calls are commented out here,
3433         * because they fill up the sys log when CD players poll
3434         * the drive.
3435         */
3436        switch (cmd) {
3437        case CDROMSUBCHNL:
3438                return cdrom_ioctl_get_subchnl(cdi, argp);
3439        case CDROMREADTOCHDR:
3440                return cdrom_ioctl_read_tochdr(cdi, argp);
3441        case CDROMREADTOCENTRY:
3442                return cdrom_ioctl_read_tocentry(cdi, argp);
3443        case CDROMPLAYMSF:
3444                return cdrom_ioctl_play_msf(cdi, argp);
3445        case CDROMPLAYTRKIND:
3446                return cdrom_ioctl_play_trkind(cdi, argp);
3447        case CDROMVOLCTRL:
3448                return cdrom_ioctl_volctrl(cdi, argp);
3449        case CDROMVOLREAD:
3450                return cdrom_ioctl_volread(cdi, argp);
3451        case CDROMSTART:
3452        case CDROMSTOP:
3453        case CDROMPAUSE:
3454        case CDROMRESUME:
3455                return cdrom_ioctl_audioctl(cdi, cmd);
3456        }
3457
3458        return -ENOSYS;
3459}
3460
3461EXPORT_SYMBOL(cdrom_get_last_written);
3462EXPORT_SYMBOL(register_cdrom);
3463EXPORT_SYMBOL(unregister_cdrom);
3464EXPORT_SYMBOL(cdrom_open);
3465EXPORT_SYMBOL(cdrom_release);
3466EXPORT_SYMBOL(cdrom_ioctl);
3467EXPORT_SYMBOL(cdrom_media_changed);
3468EXPORT_SYMBOL(cdrom_number_of_slots);
3469EXPORT_SYMBOL(cdrom_mode_select);
3470EXPORT_SYMBOL(cdrom_mode_sense);
3471EXPORT_SYMBOL(init_cdrom_command);
3472EXPORT_SYMBOL(cdrom_get_media_event);
3473
3474#ifdef CONFIG_SYSCTL
3475
3476#define CDROM_STR_SIZE 1000
3477
3478static struct cdrom_sysctl_settings {
3479        char    info[CDROM_STR_SIZE];   /* general info */
3480        int     autoclose;              /* close tray upon mount, etc */
3481        int     autoeject;              /* eject on umount */
3482        int     debug;                  /* turn on debugging messages */
3483        int     lock;                   /* lock the door on device open */
3484        int     check;                  /* check media type */
3485} cdrom_sysctl_settings;
3486
3487enum cdrom_print_option {
3488        CTL_NAME,
3489        CTL_SPEED,
3490        CTL_SLOTS,
3491        CTL_CAPABILITY
3492};
3493
3494static int cdrom_print_info(const char *header, int val, char *info,
3495                                int *pos, enum cdrom_print_option option)
3496{
3497        const int max_size = sizeof(cdrom_sysctl_settings.info);
3498        struct cdrom_device_info *cdi;
3499        int ret;
3500
3501        ret = scnprintf(info + *pos, max_size - *pos, header);
3502        if (!ret)
3503                return 1;
3504
3505        *pos += ret;
3506
3507        list_for_each_entry(cdi, &cdrom_list, list) {
3508                switch (option) {
3509                case CTL_NAME:
3510                        ret = scnprintf(info + *pos, max_size - *pos,
3511                                        "\t%s", cdi->name);
3512                        break;
3513                case CTL_SPEED:
3514                        ret = scnprintf(info + *pos, max_size - *pos,
3515                                        "\t%d", cdi->speed);
3516                        break;
3517                case CTL_SLOTS:
3518                        ret = scnprintf(info + *pos, max_size - *pos,
3519                                        "\t%d", cdi->capacity);
3520                        break;
3521                case CTL_CAPABILITY:
3522                        ret = scnprintf(info + *pos, max_size - *pos,
3523                                        "\t%d", CDROM_CAN(val) != 0);
3524                        break;
3525                default:
3526                        pr_info("invalid option%d\n", option);
3527                        return 1;
3528                }
3529                if (!ret)
3530                        return 1;
3531                *pos += ret;
3532        }
3533
3534        return 0;
3535}
3536
3537static int cdrom_sysctl_info(struct ctl_table *ctl, int write,
3538                           void *buffer, size_t *lenp, loff_t *ppos)
3539{
3540        int pos;
3541        char *info = cdrom_sysctl_settings.info;
3542        const int max_size = sizeof(cdrom_sysctl_settings.info);
3543        
3544        if (!*lenp || (*ppos && !write)) {
3545                *lenp = 0;
3546                return 0;
3547        }
3548
3549        mutex_lock(&cdrom_mutex);
3550
3551        pos = sprintf(info, "CD-ROM information, " VERSION "\n");
3552        
3553        if (cdrom_print_info("\ndrive name:\t", 0, info, &pos, CTL_NAME))
3554                goto done;
3555        if (cdrom_print_info("\ndrive speed:\t", 0, info, &pos, CTL_SPEED))
3556                goto done;
3557        if (cdrom_print_info("\ndrive # of slots:", 0, info, &pos, CTL_SLOTS))
3558                goto done;
3559        if (cdrom_print_info("\nCan close tray:\t",
3560                                CDC_CLOSE_TRAY, info, &pos, CTL_CAPABILITY))
3561                goto done;
3562        if (cdrom_print_info("\nCan open tray:\t",
3563                                CDC_OPEN_TRAY, info, &pos, CTL_CAPABILITY))
3564                goto done;
3565        if (cdrom_print_info("\nCan lock tray:\t",
3566                                CDC_LOCK, info, &pos, CTL_CAPABILITY))
3567                goto done;
3568        if (cdrom_print_info("\nCan change speed:",
3569                                CDC_SELECT_SPEED, info, &pos, CTL_CAPABILITY))
3570                goto done;
3571        if (cdrom_print_info("\nCan select disk:",
3572                                CDC_SELECT_DISC, info, &pos, CTL_CAPABILITY))
3573                goto done;
3574        if (cdrom_print_info("\nCan read multisession:",
3575                                CDC_MULTI_SESSION, info, &pos, CTL_CAPABILITY))
3576                goto done;
3577        if (cdrom_print_info("\nCan read MCN:\t",
3578                                CDC_MCN, info, &pos, CTL_CAPABILITY))
3579                goto done;
3580        if (cdrom_print_info("\nReports media changed:",
3581                                CDC_MEDIA_CHANGED, info, &pos, CTL_CAPABILITY))
3582                goto done;
3583        if (cdrom_print_info("\nCan play audio:\t",
3584                                CDC_PLAY_AUDIO, info, &pos, CTL_CAPABILITY))
3585                goto done;
3586        if (cdrom_print_info("\nCan write CD-R:\t",
3587                                CDC_CD_R, info, &pos, CTL_CAPABILITY))
3588                goto done;
3589        if (cdrom_print_info("\nCan write CD-RW:",
3590                                CDC_CD_RW, info, &pos, CTL_CAPABILITY))
3591                goto done;
3592        if (cdrom_print_info("\nCan read DVD:\t",
3593                                CDC_DVD, info, &pos, CTL_CAPABILITY))
3594                goto done;
3595        if (cdrom_print_info("\nCan write DVD-R:",
3596                                CDC_DVD_R, info, &pos, CTL_CAPABILITY))
3597                goto done;
3598        if (cdrom_print_info("\nCan write DVD-RAM:",
3599                                CDC_DVD_RAM, info, &pos, CTL_CAPABILITY))
3600                goto done;
3601        if (cdrom_print_info("\nCan read MRW:\t",
3602                                CDC_MRW, info, &pos, CTL_CAPABILITY))
3603                goto done;
3604        if (cdrom_print_info("\nCan write MRW:\t",
3605                                CDC_MRW_W, info, &pos, CTL_CAPABILITY))
3606                goto done;
3607        if (cdrom_print_info("\nCan write RAM:\t",
3608                                CDC_RAM, info, &pos, CTL_CAPABILITY))
3609                goto done;
3610        if (!scnprintf(info + pos, max_size - pos, "\n\n"))
3611                goto done;
3612doit:
3613        mutex_unlock(&cdrom_mutex);
3614        return proc_dostring(ctl, write, buffer, lenp, ppos);
3615done:
3616        pr_info("info buffer too small\n");
3617        goto doit;
3618}
3619
3620/* Unfortunately, per device settings are not implemented through
3621   procfs/sysctl yet. When they are, this will naturally disappear. For now
3622   just update all drives. Later this will become the template on which
3623   new registered drives will be based. */
3624static void cdrom_update_settings(void)
3625{
3626        struct cdrom_device_info *cdi;
3627
3628        mutex_lock(&cdrom_mutex);
3629        list_for_each_entry(cdi, &cdrom_list, list) {
3630                if (autoclose && CDROM_CAN(CDC_CLOSE_TRAY))
3631                        cdi->options |= CDO_AUTO_CLOSE;
3632                else if (!autoclose)
3633                        cdi->options &= ~CDO_AUTO_CLOSE;
3634                if (autoeject && CDROM_CAN(CDC_OPEN_TRAY))
3635                        cdi->options |= CDO_AUTO_EJECT;
3636                else if (!autoeject)
3637                        cdi->options &= ~CDO_AUTO_EJECT;
3638                if (lockdoor && CDROM_CAN(CDC_LOCK))
3639                        cdi->options |= CDO_LOCK;
3640                else if (!lockdoor)
3641                        cdi->options &= ~CDO_LOCK;
3642                if (check_media_type)
3643                        cdi->options |= CDO_CHECK_TYPE;
3644                else
3645                        cdi->options &= ~CDO_CHECK_TYPE;
3646        }
3647        mutex_unlock(&cdrom_mutex);
3648}
3649
3650static int cdrom_sysctl_handler(struct ctl_table *ctl, int write,
3651                                void *buffer, size_t *lenp, loff_t *ppos)
3652{
3653        int ret;
3654        
3655        ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
3656
3657        if (write) {
3658        
3659                /* we only care for 1 or 0. */
3660                autoclose        = !!cdrom_sysctl_settings.autoclose;
3661                autoeject        = !!cdrom_sysctl_settings.autoeject;
3662                debug            = !!cdrom_sysctl_settings.debug;
3663                lockdoor         = !!cdrom_sysctl_settings.lock;
3664                check_media_type = !!cdrom_sysctl_settings.check;
3665
3666                /* update the option flags according to the changes. we
3667                   don't have per device options through sysctl yet,
3668                   but we will have and then this will disappear. */
3669                cdrom_update_settings();
3670        }
3671
3672        return ret;
3673}
3674
3675/* Place files in /proc/sys/dev/cdrom */
3676static struct ctl_table cdrom_table[] = {
3677        {
3678                .procname       = "info",
3679                .data           = &cdrom_sysctl_settings.info, 
3680                .maxlen         = CDROM_STR_SIZE,
3681                .mode           = 0444,
3682                .proc_handler   = cdrom_sysctl_info,
3683        },
3684        {
3685                .procname       = "autoclose",
3686                .data           = &cdrom_sysctl_settings.autoclose,
3687                .maxlen         = sizeof(int),
3688                .mode           = 0644,
3689                .proc_handler   = cdrom_sysctl_handler,
3690        },
3691        {
3692                .procname       = "autoeject",
3693                .data           = &cdrom_sysctl_settings.autoeject,
3694                .maxlen         = sizeof(int),
3695                .mode           = 0644,
3696                .proc_handler   = cdrom_sysctl_handler,
3697        },
3698        {
3699                .procname       = "debug",
3700                .data           = &cdrom_sysctl_settings.debug,
3701                .maxlen         = sizeof(int),
3702                .mode           = 0644,
3703                .proc_handler   = cdrom_sysctl_handler,
3704        },
3705        {
3706                .procname       = "lock",
3707                .data           = &cdrom_sysctl_settings.lock,
3708                .maxlen         = sizeof(int),
3709                .mode           = 0644,
3710                .proc_handler   = cdrom_sysctl_handler,
3711        },
3712        {
3713                .procname       = "check_media",
3714                .data           = &cdrom_sysctl_settings.check,
3715                .maxlen         = sizeof(int),
3716                .mode           = 0644,
3717                .proc_handler   = cdrom_sysctl_handler
3718        },
3719        { }
3720};
3721
3722static struct ctl_table cdrom_cdrom_table[] = {
3723        {
3724                .procname       = "cdrom",
3725                .maxlen         = 0,
3726                .mode           = 0555,
3727                .child          = cdrom_table,
3728        },
3729        { }
3730};
3731
3732/* Make sure that /proc/sys/dev is there */
3733static struct ctl_table cdrom_root_table[] = {
3734        {
3735                .procname       = "dev",
3736                .maxlen         = 0,
3737                .mode           = 0555,
3738                .child          = cdrom_cdrom_table,
3739        },
3740        { }
3741};
3742static struct ctl_table_header *cdrom_sysctl_header;
3743
3744static void cdrom_sysctl_register(void)
3745{
3746        static atomic_t initialized = ATOMIC_INIT(0);
3747
3748        if (!atomic_add_unless(&initialized, 1, 1))
3749                return;
3750
3751        cdrom_sysctl_header = register_sysctl_table(cdrom_root_table);
3752
3753        /* set the defaults */
3754        cdrom_sysctl_settings.autoclose = autoclose;
3755        cdrom_sysctl_settings.autoeject = autoeject;
3756        cdrom_sysctl_settings.debug = debug;
3757        cdrom_sysctl_settings.lock = lockdoor;
3758        cdrom_sysctl_settings.check = check_media_type;
3759}
3760
3761static void cdrom_sysctl_unregister(void)
3762{
3763        if (cdrom_sysctl_header)
3764                unregister_sysctl_table(cdrom_sysctl_header);
3765}
3766
3767#else /* CONFIG_SYSCTL */
3768
3769static void cdrom_sysctl_register(void)
3770{
3771}
3772
3773static void cdrom_sysctl_unregister(void)
3774{
3775}
3776
3777#endif /* CONFIG_SYSCTL */
3778
3779static int __init cdrom_init(void)
3780{
3781        cdrom_sysctl_register();
3782
3783        return 0;
3784}
3785
3786static void __exit cdrom_exit(void)
3787{
3788        pr_info("Uniform CD-ROM driver unloaded\n");
3789        cdrom_sysctl_unregister();
3790}
3791
3792module_init(cdrom_init);
3793module_exit(cdrom_exit);
3794MODULE_LICENSE("GPL");
3795