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