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