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