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