linux-old/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 activly
  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 loose the index part, however.
 176  -- Small modifications to accomodate 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-------------------------------------------------------------------------*/
 232
 233#define REVISION "Revision: 3.12"
 234#define VERSION "Id: cdrom.c 3.12 2000/10/18"
 235
 236/* I use an error-log mask to give fine grain control over the type of
 237   messages dumped to the system logs.  The available masks include: */
 238#define CD_NOTHING      0x0
 239#define CD_WARNING      0x1
 240#define CD_REG_UNREG    0x2
 241#define CD_DO_IOCTL     0x4
 242#define CD_OPEN         0x8
 243#define CD_CLOSE        0x10
 244#define CD_COUNT_TRACKS 0x20
 245#define CD_CHANGER      0x40
 246#define CD_DVD          0x80
 247
 248/* Define this to remove _all_ the debugging messages */
 249/* #define ERRLOGMASK CD_NOTHING */
 250#define ERRLOGMASK (CD_WARNING)
 251/* #define ERRLOGMASK (CD_WARNING|CD_OPEN|CD_COUNT_TRACKS|CD_CLOSE) */
 252/* #define ERRLOGMASK (CD_WARNING|CD_REG_UNREG|CD_DO_IOCTL|CD_OPEN|CD_CLOSE|CD_COUNT_TRACKS) */
 253
 254#include <linux/config.h>
 255#include <linux/module.h>
 256#include <linux/fs.h>
 257#include <linux/major.h>
 258#include <linux/types.h>
 259#include <linux/errno.h>
 260#include <linux/kernel.h>
 261#include <linux/mm.h>
 262#include <linux/slab.h> 
 263#include <linux/cdrom.h>
 264#include <linux/sysctl.h>
 265#include <linux/proc_fs.h>
 266#include <linux/init.h>
 267
 268#include <asm/fcntl.h>
 269#include <asm/segment.h>
 270#include <asm/uaccess.h>
 271
 272/* used to tell the module to turn on full debugging messages */
 273static int debug;
 274/* used to keep tray locked at all times */
 275static int keeplocked;
 276/* default compatibility mode */
 277static int autoclose=1;
 278static int autoeject;
 279static int lockdoor = 1;
 280/* will we ever get to use this... sigh. */
 281static int check_media_type;
 282MODULE_PARM(debug, "i");
 283MODULE_PARM(autoclose, "i");
 284MODULE_PARM(autoeject, "i");
 285MODULE_PARM(lockdoor, "i");
 286MODULE_PARM(check_media_type, "i");
 287
 288#if (ERRLOGMASK!=CD_NOTHING)
 289#define cdinfo(type, fmt, args...) \
 290        if ((ERRLOGMASK & type) || debug==1 ) \
 291            printk(KERN_INFO "cdrom: " fmt, ## args)
 292#else
 293#define cdinfo(type, fmt, args...) 
 294#endif
 295
 296/* These are used to simplify getting data in from and back to user land */
 297#define IOCTL_IN(arg, type, in)                                 \
 298        if (copy_from_user(&(in), (type *) (arg), sizeof (in))) \
 299                return -EFAULT;
 300
 301#define IOCTL_OUT(arg, type, out) \
 302        if (copy_to_user((type *) (arg), &(out), sizeof (out))) \
 303                return -EFAULT;
 304
 305/* The (cdo->capability & ~cdi->mask & CDC_XXX) construct was used in
 306   a lot of places. This macro makes the code more clear. */
 307#define CDROM_CAN(type) (cdi->ops->capability & ~cdi->mask & (type))
 308
 309/* used in the audio ioctls */
 310#define CHECKAUDIO if ((ret=check_for_audio_disc(cdi, cdo))) return ret
 311
 312/* Not-exported routines. */
 313static int open_for_data(struct cdrom_device_info * cdi);
 314static int check_for_audio_disc(struct cdrom_device_info * cdi,
 315                         struct cdrom_device_ops * cdo);
 316static void sanitize_format(union cdrom_addr *addr, 
 317                u_char * curr, u_char requested);
 318static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
 319                     unsigned long arg);
 320
 321int cdrom_get_last_written(kdev_t dev, long *last_written);
 322int cdrom_get_next_writable(kdev_t dev, long *next_writable);
 323
 324#ifdef CONFIG_SYSCTL
 325static void cdrom_sysctl_register(void);
 326#endif /* CONFIG_SYSCTL */ 
 327static struct cdrom_device_info *topCdromPtr;
 328static devfs_handle_t devfs_handle;
 329static struct unique_numspace cdrom_numspace = UNIQUE_NUMBERSPACE_INITIALISER;
 330
 331/* This macro makes sure we don't have to check on cdrom_device_ops
 332 * existence in the run-time routines below. Change_capability is a
 333 * hack to have the capability flags defined const, while we can still
 334 * change it here without gcc complaining at every line.
 335 */
 336#define ENSURE(call, bits) if (cdo->call == NULL) *change_capability &= ~(bits)
 337
 338int register_cdrom(struct cdrom_device_info *cdi)
 339{
 340        static char banner_printed;
 341        int major = MAJOR(cdi->dev);
 342        struct cdrom_device_ops *cdo = cdi->ops;
 343        int *change_capability = (int *)&cdo->capability; /* hack */
 344
 345        cdinfo(CD_OPEN, "entering register_cdrom\n"); 
 346
 347        if (major < 0 || major >= MAX_BLKDEV)
 348                return -1;
 349        if (cdo->open == NULL || cdo->release == NULL)
 350                return -2;
 351        if ( !banner_printed ) {
 352                printk(KERN_INFO "Uniform CD-ROM driver " REVISION "\n");
 353                banner_printed = 1;
 354#ifdef CONFIG_SYSCTL
 355                cdrom_sysctl_register();
 356#endif /* CONFIG_SYSCTL */ 
 357        }
 358        ENSURE(drive_status, CDC_DRIVE_STATUS );
 359        ENSURE(media_changed, CDC_MEDIA_CHANGED);
 360        ENSURE(tray_move, CDC_CLOSE_TRAY | CDC_OPEN_TRAY);
 361        ENSURE(lock_door, CDC_LOCK);
 362        ENSURE(select_speed, CDC_SELECT_SPEED);
 363        ENSURE(get_last_session, CDC_MULTI_SESSION);
 364        ENSURE(get_mcn, CDC_MCN);
 365        ENSURE(reset, CDC_RESET);
 366        ENSURE(audio_ioctl, CDC_PLAY_AUDIO);
 367        ENSURE(dev_ioctl, CDC_IOCTLS);
 368        ENSURE(generic_packet, CDC_GENERIC_PACKET);
 369        cdi->mc_flags = 0;
 370        cdo->n_minors = 0;
 371        cdi->options = CDO_USE_FFLAGS;
 372        
 373        if (autoclose==1 && CDROM_CAN(CDC_CLOSE_TRAY))
 374                cdi->options |= (int) CDO_AUTO_CLOSE;
 375        if (autoeject==1 && CDROM_CAN(CDC_OPEN_TRAY))
 376                cdi->options |= (int) CDO_AUTO_EJECT;
 377        if (lockdoor==1)
 378                cdi->options |= (int) CDO_LOCK;
 379        if (check_media_type==1)
 380                cdi->options |= (int) CDO_CHECK_TYPE;
 381
 382        if (!devfs_handle)
 383                devfs_handle = devfs_mk_dir (NULL, "cdroms", NULL);
 384        cdi->number = devfs_alloc_unique_number (&cdrom_numspace);
 385        if (cdi->de) {
 386                int pos;
 387                devfs_handle_t slave;
 388                char rname[64];
 389
 390                pos = devfs_generate_path (cdi->de, rname + 3,
 391                                           sizeof rname - 3);
 392                if (pos >= 0) {
 393                        char vname[16];
 394                        sprintf (vname, "cdrom%d", cdi->number);
 395                        strncpy (rname + pos, "../", 3);
 396                        devfs_mk_symlink (devfs_handle, vname,
 397                                          DEVFS_FL_DEFAULT,
 398                                          rname + pos, &slave, NULL);
 399                        devfs_auto_unregister (cdi->de, slave);
 400                }
 401        }
 402        cdinfo(CD_REG_UNREG, "drive \"/dev/%s\" registered\n", cdi->name);
 403        cdi->next = topCdromPtr;        
 404        topCdromPtr = cdi;
 405        return 0;
 406}
 407#undef ENSURE
 408
 409int unregister_cdrom(struct cdrom_device_info *unreg)
 410{
 411        struct cdrom_device_info *cdi, *prev;
 412        int major = MAJOR(unreg->dev);
 413
 414        cdinfo(CD_OPEN, "entering unregister_cdrom\n"); 
 415
 416        if (major < 0 || major >= MAX_BLKDEV)
 417                return -1;
 418
 419        prev = NULL;
 420        cdi = topCdromPtr;
 421        while (cdi != NULL && cdi->dev != unreg->dev) {
 422                prev = cdi;
 423                cdi = cdi->next;
 424        }
 425
 426        if (cdi == NULL)
 427                return -2;
 428        if (prev)
 429                prev->next = cdi->next;
 430        else
 431                topCdromPtr = cdi->next;
 432        cdi->ops->n_minors--;
 433        devfs_unregister (cdi->de);
 434        devfs_dealloc_unique_number (&cdrom_numspace, cdi->number);
 435        cdinfo(CD_REG_UNREG, "drive \"/dev/%s\" unregistered\n", cdi->name);
 436        return 0;
 437}
 438
 439struct cdrom_device_info *cdrom_find_device(kdev_t dev)
 440{
 441        struct cdrom_device_info *cdi;
 442
 443        cdi = topCdromPtr;
 444        while (cdi != NULL && cdi->dev != dev)
 445                cdi = cdi->next;
 446
 447        return cdi;
 448}
 449
 450/* We use the open-option O_NONBLOCK to indicate that the
 451 * purpose of opening is only for subsequent ioctl() calls; no device
 452 * integrity checks are performed.
 453 *
 454 * We hope that all cd-player programs will adopt this convention. It
 455 * is in their own interest: device control becomes a lot easier
 456 * this way.
 457 */
 458int cdrom_open(struct inode *ip, struct file *fp)
 459{
 460        struct cdrom_device_info *cdi;
 461        kdev_t dev = ip->i_rdev;
 462        int ret;
 463
 464        cdinfo(CD_OPEN, "entering cdrom_open\n"); 
 465        if ((cdi = cdrom_find_device(dev)) == NULL)
 466                return -ENODEV;
 467
 468        if ((fp->f_mode & FMODE_WRITE) && !CDROM_CAN(CDC_DVD_RAM))
 469                return -EROFS;
 470
 471        /* if this was a O_NONBLOCK open and we should honor the flags,
 472         * do a quick open without drive/disc integrity checks. */
 473        if ((fp->f_flags & O_NONBLOCK) && (cdi->options & CDO_USE_FFLAGS))
 474                ret = cdi->ops->open(cdi, 1);
 475        else
 476                ret = open_for_data(cdi);
 477
 478        if (!ret) cdi->use_count++;
 479
 480        cdinfo(CD_OPEN, "Use count for \"/dev/%s\" now %d\n", cdi->name, cdi->use_count);
 481        /* Do this on open.  Don't wait for mount, because they might
 482            not be mounting, but opening with O_NONBLOCK */
 483        check_disk_change(dev);
 484        return ret;
 485}
 486
 487static
 488int open_for_data(struct cdrom_device_info * cdi)
 489{
 490        int ret;
 491        struct cdrom_device_ops *cdo = cdi->ops;
 492        tracktype tracks;
 493        cdinfo(CD_OPEN, "entering open_for_data\n");
 494        /* Check if the driver can report drive status.  If it can, we
 495           can do clever things.  If it can't, well, we at least tried! */
 496        if (cdo->drive_status != NULL) {
 497                ret = cdo->drive_status(cdi, CDSL_CURRENT);
 498                cdinfo(CD_OPEN, "drive_status=%d\n", ret); 
 499                if (ret == CDS_TRAY_OPEN) {
 500                        cdinfo(CD_OPEN, "the tray is open...\n"); 
 501                        /* can/may i close it? */
 502                        if (CDROM_CAN(CDC_CLOSE_TRAY) &&
 503                            cdi->options & CDO_AUTO_CLOSE) {
 504                                cdinfo(CD_OPEN, "trying to close the tray.\n"); 
 505                                ret=cdo->tray_move(cdi,0);
 506                                if (ret) {
 507                                        cdinfo(CD_OPEN, "bummer. tried to close the tray but failed.\n"); 
 508                                        /* Ignore the error from the low
 509                                        level driver.  We don't care why it
 510                                        couldn't close the tray.  We only care 
 511                                        that there is no disc in the drive, 
 512                                        since that is the _REAL_ problem here.*/
 513                                        ret=-ENOMEDIUM;
 514                                        goto clean_up_and_return;
 515                                }
 516                        } else {
 517                                cdinfo(CD_OPEN, "bummer. this drive can't close the tray.\n"); 
 518                                ret=-ENOMEDIUM;
 519                                goto clean_up_and_return;
 520                        }
 521                        /* Ok, the door should be closed now.. Check again */
 522                        ret = cdo->drive_status(cdi, CDSL_CURRENT);
 523                        if ((ret == CDS_NO_DISC) || (ret==CDS_TRAY_OPEN)) {
 524                                cdinfo(CD_OPEN, "bummer. the tray is still not closed.\n"); 
 525                                cdinfo(CD_OPEN, "tray might not contain a medium.\n");
 526                                ret=-ENOMEDIUM;
 527                                goto clean_up_and_return;
 528                        }
 529                        cdinfo(CD_OPEN, "the tray is now closed.\n"); 
 530                }
 531                if (ret!=CDS_DISC_OK) {
 532                        ret = -ENOMEDIUM;
 533                        goto clean_up_and_return;
 534                }
 535        }
 536        cdrom_count_tracks(cdi, &tracks);
 537        if (tracks.error == CDS_NO_DISC) {
 538                cdinfo(CD_OPEN, "bummer. no disc.\n");
 539                ret=-ENOMEDIUM;
 540                goto clean_up_and_return;
 541        }
 542        /* CD-Players which don't use O_NONBLOCK, workman
 543         * for example, need bit CDO_CHECK_TYPE cleared! */
 544        if (tracks.data==0) {
 545                if (cdi->options & CDO_CHECK_TYPE) {
 546                    /* give people a warning shot, now that CDO_CHECK_TYPE
 547                       is the default case! */
 548                    cdinfo(CD_OPEN, "bummer. wrong media type.\n"); 
 549                    cdinfo(CD_WARNING, "pid %d must open device O_NONBLOCK!\n",
 550                                        (unsigned int)current->pid); 
 551                    ret=-EMEDIUMTYPE;
 552                    goto clean_up_and_return;
 553                }
 554                else {
 555                    cdinfo(CD_OPEN, "wrong media type, but CDO_CHECK_TYPE not set.\n");
 556                }
 557        }
 558
 559        cdinfo(CD_OPEN, "all seems well, opening the device.\n"); 
 560
 561        /* all seems well, we can open the device */
 562        ret = cdo->open(cdi, 0); /* open for data */
 563        cdinfo(CD_OPEN, "opening the device gave me %d.\n", ret); 
 564        /* After all this careful checking, we shouldn't have problems
 565           opening the device, but we don't want the device locked if 
 566           this somehow fails... */
 567        if (ret) {
 568                cdinfo(CD_OPEN, "open device failed.\n"); 
 569                goto clean_up_and_return;
 570        }
 571        if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) {
 572                        cdo->lock_door(cdi, 1);
 573                        cdinfo(CD_OPEN, "door locked.\n");
 574        }
 575        cdinfo(CD_OPEN, "device opened successfully.\n"); 
 576        return ret;
 577
 578        /* Something failed.  Try to unlock the drive, because some drivers
 579        (notably ide-cd) lock the drive after every command.  This produced
 580        a nasty bug where after mount failed, the drive would remain locked!  
 581        This ensures that the drive gets unlocked after a mount fails.  This 
 582        is a goto to avoid bloating the driver with redundant code. */ 
 583clean_up_and_return:
 584        cdinfo(CD_WARNING, "open failed.\n"); 
 585        if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) {
 586                        cdo->lock_door(cdi, 0);
 587                        cdinfo(CD_OPEN, "door unlocked.\n");
 588        }
 589        return ret;
 590}
 591
 592/* This code is similar to that in open_for_data. The routine is called
 593   whenever an audio play operation is requested.
 594*/
 595int check_for_audio_disc(struct cdrom_device_info * cdi,
 596                         struct cdrom_device_ops * cdo)
 597{
 598        int ret;
 599        tracktype tracks;
 600        cdinfo(CD_OPEN, "entering check_for_audio_disc\n");
 601        if (!(cdi->options & CDO_CHECK_TYPE))
 602                return 0;
 603        if (cdo->drive_status != NULL) {
 604                ret = cdo->drive_status(cdi, CDSL_CURRENT);
 605                cdinfo(CD_OPEN, "drive_status=%d\n", ret); 
 606                if (ret == CDS_TRAY_OPEN) {
 607                        cdinfo(CD_OPEN, "the tray is open...\n"); 
 608                        /* can/may i close it? */
 609                        if (CDROM_CAN(CDC_CLOSE_TRAY) &&
 610                            cdi->options & CDO_AUTO_CLOSE) {
 611                                cdinfo(CD_OPEN, "trying to close the tray.\n"); 
 612                                ret=cdo->tray_move(cdi,0);
 613                                if (ret) {
 614                                        cdinfo(CD_OPEN, "bummer. tried to close tray but failed.\n"); 
 615                                        /* Ignore the error from the low
 616                                        level driver.  We don't care why it
 617                                        couldn't close the tray.  We only care 
 618                                        that there is no disc in the drive, 
 619                                        since that is the _REAL_ problem here.*/
 620                                        return -ENOMEDIUM;
 621                                }
 622                        } else {
 623                                cdinfo(CD_OPEN, "bummer. this driver can't close the tray.\n"); 
 624                                return -ENOMEDIUM;
 625                        }
 626                        /* Ok, the door should be closed now.. Check again */
 627                        ret = cdo->drive_status(cdi, CDSL_CURRENT);
 628                        if ((ret == CDS_NO_DISC) || (ret==CDS_TRAY_OPEN)) {
 629                                cdinfo(CD_OPEN, "bummer. the tray is still not closed.\n"); 
 630                                return -ENOMEDIUM;
 631                        }       
 632                        if (ret!=CDS_DISC_OK) {
 633                                cdinfo(CD_OPEN, "bummer. disc isn't ready.\n"); 
 634                                return -EIO;
 635                        }       
 636                        cdinfo(CD_OPEN, "the tray is now closed.\n"); 
 637                }       
 638        }
 639        cdrom_count_tracks(cdi, &tracks);
 640        if (tracks.error) 
 641                return(tracks.error);
 642
 643        if (tracks.audio==0)
 644                return -EMEDIUMTYPE;
 645
 646        return 0;
 647}
 648
 649
 650/* Admittedly, the logic below could be performed in a nicer way. */
 651int cdrom_release(struct inode *ip, struct file *fp)
 652{
 653        kdev_t dev = ip->i_rdev;
 654        struct cdrom_device_info *cdi = cdrom_find_device(dev);
 655        struct cdrom_device_ops *cdo = cdi->ops;
 656        int opened_for_data;
 657
 658        cdinfo(CD_CLOSE, "entering cdrom_release\n"); 
 659
 660        if (cdi->use_count > 0)
 661                cdi->use_count--;
 662        if (cdi->use_count == 0)
 663                cdinfo(CD_CLOSE, "Use count for \"/dev/%s\" now zero\n", cdi->name);
 664        if (cdi->use_count == 0 &&
 665            cdo->capability & CDC_LOCK && !keeplocked) {
 666                cdinfo(CD_CLOSE, "Unlocking door!\n");
 667                cdo->lock_door(cdi, 0);
 668        }
 669        opened_for_data = !(cdi->options & CDO_USE_FFLAGS) ||
 670                !(fp && fp->f_flags & O_NONBLOCK);
 671        cdo->release(cdi);
 672        if (cdi->use_count == 0) {      /* last process that closes dev*/
 673                if (opened_for_data &&
 674                    cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY))
 675                        cdo->tray_move(cdi, 1);
 676        }
 677        return 0;
 678}
 679
 680static int cdrom_read_mech_status(struct cdrom_device_info *cdi, 
 681                                  struct cdrom_changer_info *buf)
 682{
 683        struct cdrom_generic_command cgc;
 684        struct cdrom_device_ops *cdo = cdi->ops;
 685        int length;
 686
 687        /*
 688         * Sanyo changer isn't spec compliant (doesn't use regular change
 689         * LOAD_UNLOAD command, and it doesn't implement the mech status
 690         * command below
 691         */
 692        if (cdi->sanyo_slot) {
 693                buf->hdr.nslots = 3;
 694                buf->hdr.curslot = cdi->sanyo_slot == 3 ? 0 : cdi->sanyo_slot;
 695                for (length = 0; length < 3; length++) {
 696                        buf->slots[length].disc_present = 1;
 697                        buf->slots[length].change = 0;
 698                }
 699                return 0;
 700        }
 701
 702        length = sizeof(struct cdrom_mechstat_header) +
 703                 cdi->capacity * sizeof(struct cdrom_slot);
 704
 705        init_cdrom_command(&cgc, buf, length, CGC_DATA_READ);
 706        cgc.cmd[0] = GPCMD_MECHANISM_STATUS;
 707        cgc.cmd[8] = (length >> 8) & 0xff;
 708        cgc.cmd[9] = length & 0xff;
 709        return cdo->generic_packet(cdi, &cgc);
 710}
 711
 712static int cdrom_slot_status(struct cdrom_device_info *cdi, int slot)
 713{
 714        struct cdrom_changer_info info;
 715        int ret;
 716
 717        cdinfo(CD_CHANGER, "entering cdrom_slot_status()\n"); 
 718        if (cdi->sanyo_slot)
 719                return CDS_NO_INFO;
 720        
 721        if ((ret = cdrom_read_mech_status(cdi, &info)))
 722                return ret;
 723
 724        if (info.slots[slot].disc_present)
 725                return CDS_DISC_OK;
 726        else
 727                return CDS_NO_DISC;
 728
 729}
 730
 731/* Return the number of slots for an ATAPI/SCSI cdrom, 
 732 * return 1 if not a changer. 
 733 */
 734int cdrom_number_of_slots(struct cdrom_device_info *cdi) 
 735{
 736        int status;
 737        int nslots = 1;
 738        struct cdrom_changer_info info;
 739
 740        cdinfo(CD_CHANGER, "entering cdrom_number_of_slots()\n"); 
 741        /* cdrom_read_mech_status requires a valid value for capacity: */
 742        cdi->capacity = 0; 
 743
 744        if ((status = cdrom_read_mech_status(cdi, &info)) == 0)
 745                nslots = info.hdr.nslots;
 746
 747        return nslots;
 748}
 749
 750
 751/* If SLOT < 0, unload the current slot.  Otherwise, try to load SLOT. */
 752static int cdrom_load_unload(struct cdrom_device_info *cdi, int slot) 
 753{
 754        struct cdrom_generic_command cgc;
 755
 756        cdinfo(CD_CHANGER, "entering cdrom_load_unload()\n"); 
 757        if (cdi->sanyo_slot && slot < 0)
 758                return 0;
 759
 760        init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
 761        cgc.cmd[0] = GPCMD_LOAD_UNLOAD;
 762        cgc.cmd[4] = 2 + (slot >= 0);
 763        cgc.cmd[8] = slot;
 764        cgc.timeout = 60 * HZ;
 765
 766        /* The Sanyo 3 CD changer uses byte 7 of the 
 767        GPCMD_TEST_UNIT_READY to command to switch CDs instead of
 768        using the GPCMD_LOAD_UNLOAD opcode. */
 769        if (cdi->sanyo_slot && -1 < slot) {
 770                cgc.cmd[0] = GPCMD_TEST_UNIT_READY;
 771                cgc.cmd[7] = slot;
 772                cgc.cmd[4] = cgc.cmd[8] = 0;
 773                cdi->sanyo_slot = slot ? slot : 3;
 774        }
 775
 776        return cdi->ops->generic_packet(cdi, &cgc);
 777}
 778
 779int cdrom_select_disc(struct cdrom_device_info *cdi, int slot)
 780{
 781        struct cdrom_changer_info info;
 782        int curslot;
 783        int ret;
 784
 785        cdinfo(CD_CHANGER, "entering cdrom_select_disc()\n"); 
 786        if (!CDROM_CAN(CDC_SELECT_DISC))
 787                return -EDRIVE_CANT_DO_THIS;
 788
 789        (void) cdi->ops->media_changed(cdi, slot);
 790
 791        if (slot == CDSL_NONE) {
 792                /* set media changed bits, on both queues */
 793                cdi->mc_flags = 0x3;
 794                return cdrom_load_unload(cdi, -1);
 795        }
 796
 797        if ((ret = cdrom_read_mech_status(cdi, &info)))
 798                return ret;
 799
 800        curslot = info.hdr.curslot;
 801
 802        if (cdi->use_count > 1 || keeplocked) {
 803                if (slot == CDSL_CURRENT) {
 804                        return curslot;
 805                } else {
 806                        return -EBUSY;
 807                }
 808        }
 809
 810        /* Specifying CDSL_CURRENT will attempt to load the currnet slot,
 811        which is useful if it had been previously unloaded.
 812        Whether it can or not, it returns the current slot. 
 813        Similarly,  if slot happens to be the current one, we still
 814        try and load it. */
 815        if (slot == CDSL_CURRENT)
 816                slot = curslot;
 817
 818        /* set media changed bits on both queues */
 819        cdi->mc_flags = 0x3;
 820        if ((ret = cdrom_load_unload(cdi, slot)))
 821                return ret;
 822
 823        return slot;
 824}
 825
 826/* We want to make media_changed accessible to the user through an
 827 * ioctl. The main problem now is that we must double-buffer the
 828 * low-level implementation, to assure that the VFS and the user both
 829 * see a medium change once.
 830 */
 831
 832static
 833int media_changed(struct cdrom_device_info *cdi, int queue)
 834{
 835        unsigned int mask = (1 << (queue & 1));
 836        int ret = !!(cdi->mc_flags & mask);
 837
 838        if (!CDROM_CAN(CDC_MEDIA_CHANGED))
 839            return ret;
 840        /* changed since last call? */
 841        if (cdi->ops->media_changed(cdi, CDSL_CURRENT)) {
 842                cdi->mc_flags = 0x3;    /* set bit on both queues */
 843                ret |= 1;
 844        }
 845        cdi->mc_flags &= ~mask;         /* clear bit */
 846        return ret;
 847}
 848
 849int cdrom_media_changed(kdev_t dev)
 850{
 851        struct cdrom_device_info *cdi = cdrom_find_device(dev);
 852        /* This talks to the VFS, which doesn't like errors - just 1 or 0.  
 853         * Returning "0" is always safe (media hasn't been changed). Do that 
 854         * if the low-level cdrom driver dosn't support media changed. */ 
 855        if (cdi == NULL || cdi->ops->media_changed == NULL)
 856                return 0;
 857        if (!CDROM_CAN(CDC_MEDIA_CHANGED))
 858                return 0;
 859        return media_changed(cdi, 0);
 860}
 861
 862/* badly broken, I know. Is due for a fixup anytime. */
 863void cdrom_count_tracks(struct cdrom_device_info *cdi, tracktype* tracks)
 864{
 865        struct cdrom_tochdr header;
 866        struct cdrom_tocentry entry;
 867        int ret, i;
 868        tracks->data=0;
 869        tracks->audio=0;
 870        tracks->cdi=0;
 871        tracks->xa=0;
 872        tracks->error=0;
 873        cdinfo(CD_COUNT_TRACKS, "entering cdrom_count_tracks\n"); 
 874        if (!CDROM_CAN(CDC_PLAY_AUDIO)) { 
 875                tracks->error=CDS_NO_INFO;
 876                return;
 877        }        
 878        /* Grab the TOC header so we can see how many tracks there are */
 879        if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header))) {
 880                if (ret == -ENOMEDIUM)
 881                        tracks->error = CDS_NO_DISC;
 882                else
 883                        tracks->error = CDS_NO_INFO;
 884                return;
 885        }       
 886        /* check what type of tracks are on this disc */
 887        entry.cdte_format = CDROM_MSF;
 888        for (i = header.cdth_trk0; i <= header.cdth_trk1; i++) {
 889                entry.cdte_track  = i;
 890                if (cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &entry)) {
 891                        tracks->error=CDS_NO_INFO;
 892                        return;
 893                }       
 894                if (entry.cdte_ctrl & CDROM_DATA_TRACK) {
 895                    if (entry.cdte_format == 0x10)
 896                        tracks->cdi++;
 897                    else if (entry.cdte_format == 0x20) 
 898                        tracks->xa++;
 899                    else
 900                        tracks->data++;
 901                } else
 902                    tracks->audio++;
 903                cdinfo(CD_COUNT_TRACKS, "track %d: format=%d, ctrl=%d\n",
 904                       i, entry.cdte_format, entry.cdte_ctrl);
 905        }       
 906        cdinfo(CD_COUNT_TRACKS, "disc has %d tracks: %d=audio %d=data %d=Cd-I %d=XA\n", 
 907                header.cdth_trk1, tracks->audio, tracks->data, 
 908                tracks->cdi, tracks->xa);
 909}       
 910
 911/* Requests to the low-level drivers will /always/ be done in the
 912   following format convention:
 913
 914   CDROM_LBA: all data-related requests.
 915   CDROM_MSF: all audio-related requests.
 916
 917   However, a low-level implementation is allowed to refuse this
 918   request, and return information in its own favorite format.
 919
 920   It doesn't make sense /at all/ to ask for a play_audio in LBA
 921   format, or ask for multi-session info in MSF format. However, for
 922   backward compatibility these format requests will be satisfied, but
 923   the requests to the low-level drivers will be sanitized in the more
 924   meaningful format indicated above.
 925 */
 926
 927static
 928void sanitize_format(union cdrom_addr *addr,
 929                     u_char * curr, u_char requested)
 930{
 931        if (*curr == requested)
 932                return;                 /* nothing to be done! */
 933        if (requested == CDROM_LBA) {
 934                addr->lba = (int) addr->msf.frame +
 935                        75 * (addr->msf.second - 2 + 60 * addr->msf.minute);
 936        } else {                        /* CDROM_MSF */
 937                int lba = addr->lba;
 938                addr->msf.frame = lba % 75;
 939                lba /= 75;
 940                lba += 2;
 941                addr->msf.second = lba % 60;
 942                addr->msf.minute = lba / 60;
 943        }
 944        *curr = requested;
 945}
 946
 947void init_cdrom_command(struct cdrom_generic_command *cgc, void *buf, int len,
 948                        int type)
 949{
 950        memset(cgc, 0, sizeof(struct cdrom_generic_command));
 951        if (buf)
 952                memset(buf, 0, len);
 953        cgc->buffer = (char *) buf;
 954        cgc->buflen = len;
 955        cgc->data_direction = type;
 956        cgc->timeout = 5*HZ;
 957}
 958
 959/* DVD handling */
 960
 961#define copy_key(dest,src)      memcpy((dest), (src), sizeof(dvd_key))
 962#define copy_chal(dest,src)     memcpy((dest), (src), sizeof(dvd_challenge))
 963
 964static void setup_report_key(struct cdrom_generic_command *cgc, unsigned agid, unsigned type)
 965{
 966        cgc->cmd[0] = GPCMD_REPORT_KEY;
 967        cgc->cmd[10] = type | (agid << 6);
 968        switch (type) {
 969                case 0: case 8: case 5: {
 970                        cgc->buflen = 8;
 971                        break;
 972                }
 973                case 1: {
 974                        cgc->buflen = 16;
 975                        break;
 976                }
 977                case 2: case 4: {
 978                        cgc->buflen = 12;
 979                        break;
 980                }
 981        }
 982        cgc->cmd[9] = cgc->buflen;
 983        cgc->data_direction = CGC_DATA_READ;
 984}
 985
 986static void setup_send_key(struct cdrom_generic_command *cgc, unsigned agid, unsigned type)
 987{
 988        cgc->cmd[0] = GPCMD_SEND_KEY;
 989        cgc->cmd[10] = type | (agid << 6);
 990        switch (type) {
 991                case 1: {
 992                        cgc->buflen = 16;
 993                        break;
 994                }
 995                case 3: {
 996                        cgc->buflen = 12;
 997                        break;
 998                }
 999                case 6: {
1000                        cgc->buflen = 8;
1001                        break;
1002                }
1003        }
1004        cgc->cmd[9] = cgc->buflen;
1005        cgc->data_direction = CGC_DATA_WRITE;
1006}
1007
1008static int dvd_do_auth(struct cdrom_device_info *cdi, dvd_authinfo *ai)
1009{
1010        int ret;
1011        u_char buf[20];
1012        struct cdrom_generic_command cgc;
1013        struct cdrom_device_ops *cdo = cdi->ops;
1014        rpc_state_t rpc_state;
1015
1016        memset(buf, 0, sizeof(buf));
1017        init_cdrom_command(&cgc, buf, 0, CGC_DATA_READ);
1018
1019        switch (ai->type) {
1020        /* LU data send */
1021        case DVD_LU_SEND_AGID:
1022                cdinfo(CD_DVD, "entering DVD_LU_SEND_AGID\n"); 
1023                setup_report_key(&cgc, ai->lsa.agid, 0);
1024
1025                if ((ret = cdo->generic_packet(cdi, &cgc)))
1026                        return ret;
1027
1028                ai->lsa.agid = buf[7] >> 6;
1029                /* Returning data, let host change state */
1030                break;
1031
1032        case DVD_LU_SEND_KEY1:
1033                cdinfo(CD_DVD, "entering DVD_LU_SEND_KEY1\n"); 
1034                setup_report_key(&cgc, ai->lsk.agid, 2);
1035
1036                if ((ret = cdo->generic_packet(cdi, &cgc)))
1037                        return ret;
1038
1039                copy_key(ai->lsk.key, &buf[4]);
1040                /* Returning data, let host change state */
1041                break;
1042
1043        case DVD_LU_SEND_CHALLENGE:
1044                cdinfo(CD_DVD, "entering DVD_LU_SEND_CHALLENGE\n"); 
1045                setup_report_key(&cgc, ai->lsc.agid, 1);
1046
1047                if ((ret = cdo->generic_packet(cdi, &cgc)))
1048                        return ret;
1049
1050                copy_chal(ai->lsc.chal, &buf[4]);
1051                /* Returning data, let host change state */
1052                break;
1053
1054        /* Post-auth key */
1055        case DVD_LU_SEND_TITLE_KEY:
1056                cdinfo(CD_DVD, "entering DVD_LU_SEND_TITLE_KEY\n"); 
1057                setup_report_key(&cgc, ai->lstk.agid, 4);
1058                cgc.cmd[5] = ai->lstk.lba;
1059                cgc.cmd[4] = ai->lstk.lba >> 8;
1060                cgc.cmd[3] = ai->lstk.lba >> 16;
1061                cgc.cmd[2] = ai->lstk.lba >> 24;
1062
1063                if ((ret = cdo->generic_packet(cdi, &cgc)))
1064                        return ret;
1065
1066                ai->lstk.cpm = (buf[4] >> 7) & 1;
1067                ai->lstk.cp_sec = (buf[4] >> 6) & 1;
1068                ai->lstk.cgms = (buf[4] >> 4) & 3;
1069                copy_key(ai->lstk.title_key, &buf[5]);
1070                /* Returning data, let host change state */
1071                break;
1072
1073        case DVD_LU_SEND_ASF:
1074                cdinfo(CD_DVD, "entering DVD_LU_SEND_ASF\n"); 
1075                setup_report_key(&cgc, ai->lsasf.agid, 5);
1076                
1077                if ((ret = cdo->generic_packet(cdi, &cgc)))
1078                        return ret;
1079
1080                ai->lsasf.asf = buf[7] & 1;
1081                break;
1082
1083        /* LU data receive (LU changes state) */
1084        case DVD_HOST_SEND_CHALLENGE:
1085                cdinfo(CD_DVD, "entering DVD_HOST_SEND_CHALLENGE\n"); 
1086                setup_send_key(&cgc, ai->hsc.agid, 1);
1087                buf[1] = 0xe;
1088                copy_chal(&buf[4], ai->hsc.chal);
1089
1090                if ((ret = cdo->generic_packet(cdi, &cgc)))
1091                        return ret;
1092
1093                ai->type = DVD_LU_SEND_KEY1;
1094                break;
1095
1096        case DVD_HOST_SEND_KEY2:
1097                cdinfo(CD_DVD, "entering DVD_HOST_SEND_KEY2\n"); 
1098                setup_send_key(&cgc, ai->hsk.agid, 3);
1099                buf[1] = 0xa;
1100                copy_key(&buf[4], ai->hsk.key);
1101
1102                if ((ret = cdo->generic_packet(cdi, &cgc))) {
1103                        ai->type = DVD_AUTH_FAILURE;
1104                        return ret;
1105                }
1106                ai->type = DVD_AUTH_ESTABLISHED;
1107                break;
1108
1109        /* Misc */
1110        case DVD_INVALIDATE_AGID:
1111                cdinfo(CD_DVD, "entering DVD_INVALIDATE_AGID\n"); 
1112                setup_report_key(&cgc, ai->lsa.agid, 0x3f);
1113                if ((ret = cdo->generic_packet(cdi, &cgc)))
1114                        return ret;
1115                break;
1116
1117        /* Get region settings */
1118        case DVD_LU_SEND_RPC_STATE:
1119                cdinfo(CD_DVD, "entering DVD_LU_SEND_RPC_STATE\n");
1120                setup_report_key(&cgc, 0, 8);
1121                memset(&rpc_state, 0, sizeof(rpc_state_t));
1122                cgc.buffer = (char *) &rpc_state;
1123
1124                if ((ret = cdo->generic_packet(cdi, &cgc)))
1125                        return ret;
1126
1127                ai->lrpcs.type = rpc_state.type_code;
1128                ai->lrpcs.vra = rpc_state.vra;
1129                ai->lrpcs.ucca = rpc_state.ucca;
1130                ai->lrpcs.region_mask = rpc_state.region_mask;
1131                ai->lrpcs.rpc_scheme = rpc_state.rpc_scheme;
1132                break;
1133
1134        /* Set region settings */
1135        case DVD_HOST_SEND_RPC_STATE:
1136                cdinfo(CD_DVD, "entering DVD_HOST_SEND_RPC_STATE\n");
1137                setup_send_key(&cgc, 0, 6);
1138                buf[1] = 6;
1139                buf[4] = ai->hrpcs.pdrc;
1140
1141                if ((ret = cdo->generic_packet(cdi, &cgc)))
1142                        return ret;
1143                break;
1144
1145        default:
1146                cdinfo(CD_WARNING, "Invalid DVD key ioctl (%d)\n", ai->type);
1147                return -ENOTTY;
1148        }
1149
1150        return 0;
1151}
1152
1153static int dvd_read_physical(struct cdrom_device_info *cdi, dvd_struct *s)
1154{
1155        unsigned char buf[20], *base;
1156        struct dvd_layer *layer;
1157        struct cdrom_generic_command cgc;
1158        struct cdrom_device_ops *cdo = cdi->ops;
1159        int ret, layer_num = s->physical.layer_num;
1160
1161        if (layer_num >= DVD_LAYERS)
1162                return -EINVAL;
1163
1164        init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ);
1165        cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1166        cgc.cmd[6] = layer_num;
1167        cgc.cmd[7] = s->type;
1168        cgc.cmd[9] = cgc.buflen & 0xff;
1169
1170        /*
1171         * refrain from reporting errors on non-existing layers (mainly)
1172         */
1173        cgc.quiet = 1;
1174
1175        if ((ret = cdo->generic_packet(cdi, &cgc)))
1176                return ret;
1177
1178        base = &buf[4];
1179        layer = &s->physical.layer[layer_num];
1180
1181        /*
1182         * place the data... really ugly, but at least we won't have to
1183         * worry about endianess in userspace.
1184         */
1185        memset(layer, 0, sizeof(*layer));
1186        layer->book_version = base[0] & 0xf;
1187        layer->book_type = base[0] >> 4;
1188        layer->min_rate = base[1] & 0xf;
1189        layer->disc_size = base[1] >> 4;
1190        layer->layer_type = base[2] & 0xf;
1191        layer->track_path = (base[2] >> 4) & 1;
1192        layer->nlayers = (base[2] >> 5) & 3;
1193        layer->track_density = base[3] & 0xf;
1194        layer->linear_density = base[3] >> 4;
1195        layer->start_sector = base[5] << 16 | base[6] << 8 | base[7];
1196        layer->end_sector = base[9] << 16 | base[10] << 8 | base[11];
1197        layer->end_sector_l0 = base[13] << 16 | base[14] << 8 | base[15];
1198        layer->bca = base[16] >> 7;
1199
1200        return 0;
1201}
1202
1203static int dvd_read_copyright(struct cdrom_device_info *cdi, dvd_struct *s)
1204{
1205        int ret;
1206        u_char buf[8];
1207        struct cdrom_generic_command cgc;
1208        struct cdrom_device_ops *cdo = cdi->ops;
1209
1210        init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ);
1211        cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1212        cgc.cmd[6] = s->copyright.layer_num;
1213        cgc.cmd[7] = s->type;
1214        cgc.cmd[8] = cgc.buflen >> 8;
1215        cgc.cmd[9] = cgc.buflen & 0xff;
1216
1217        if ((ret = cdo->generic_packet(cdi, &cgc)))
1218                return ret;
1219
1220        s->copyright.cpst = buf[4];
1221        s->copyright.rmi = buf[5];
1222
1223        return 0;
1224}
1225
1226static int dvd_read_disckey(struct cdrom_device_info *cdi, dvd_struct *s)
1227{
1228        int ret, size;
1229        u_char *buf;
1230        struct cdrom_generic_command cgc;
1231        struct cdrom_device_ops *cdo = cdi->ops;
1232
1233        size = sizeof(s->disckey.value) + 4;
1234
1235        if ((buf = (u_char *) kmalloc(size, GFP_KERNEL)) == NULL)
1236                return -ENOMEM;
1237
1238        init_cdrom_command(&cgc, buf, size, CGC_DATA_READ);
1239        cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1240        cgc.cmd[7] = s->type;
1241        cgc.cmd[8] = size >> 8;
1242        cgc.cmd[9] = size & 0xff;
1243        cgc.cmd[10] = s->disckey.agid << 6;
1244
1245        if (!(ret = cdo->generic_packet(cdi, &cgc)))
1246                memcpy(s->disckey.value, &buf[4], sizeof(s->disckey.value));
1247
1248        kfree(buf);
1249        return ret;
1250}
1251
1252static int dvd_read_bca(struct cdrom_device_info *cdi, dvd_struct *s)
1253{
1254        int ret;
1255        u_char buf[4 + 188];
1256        struct cdrom_generic_command cgc;
1257        struct cdrom_device_ops *cdo = cdi->ops;
1258
1259        init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ);
1260        cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1261        cgc.cmd[7] = s->type;
1262        cgc.cmd[9] = cgc.buflen = 0xff;
1263
1264        if ((ret = cdo->generic_packet(cdi, &cgc)))
1265                return ret;
1266
1267        s->bca.len = buf[0] << 8 | buf[1];
1268        if (s->bca.len < 12 || s->bca.len > 188) {
1269                cdinfo(CD_WARNING, "Received invalid BCA length (%d)\n", s->bca.len);
1270                return -EIO;
1271        }
1272        memcpy(s->bca.value, &buf[4], s->bca.len);
1273
1274        return 0;
1275}
1276
1277static int dvd_read_manufact(struct cdrom_device_info *cdi, dvd_struct *s)
1278{
1279        int ret = 0, size;
1280        u_char *buf;
1281        struct cdrom_generic_command cgc;
1282        struct cdrom_device_ops *cdo = cdi->ops;
1283
1284        size = sizeof(s->manufact.value) + 4;
1285
1286        if ((buf = (u_char *) kmalloc(size, GFP_KERNEL)) == NULL)
1287                return -ENOMEM;
1288
1289        init_cdrom_command(&cgc, buf, size, CGC_DATA_READ);
1290        cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1291        cgc.cmd[7] = s->type;
1292        cgc.cmd[8] = size >> 8;
1293        cgc.cmd[9] = size & 0xff;
1294
1295        if ((ret = cdo->generic_packet(cdi, &cgc))) {
1296                kfree(buf);
1297                return ret;
1298        }
1299
1300        s->manufact.len = buf[0] << 8 | buf[1];
1301        if (s->manufact.len < 0 || s->manufact.len > 2048) {
1302                cdinfo(CD_WARNING, "Received invalid manufacture info length"
1303                                   " (%d)\n", s->bca.len);
1304                ret = -EIO;
1305        } else {
1306                memcpy(s->manufact.value, &buf[4], s->manufact.len);
1307        }
1308
1309        kfree(buf);
1310        return ret;
1311}
1312
1313static int dvd_read_struct(struct cdrom_device_info *cdi, dvd_struct *s)
1314{
1315        switch (s->type) {
1316        case DVD_STRUCT_PHYSICAL:
1317                return dvd_read_physical(cdi, s);
1318
1319        case DVD_STRUCT_COPYRIGHT:
1320                return dvd_read_copyright(cdi, s);
1321
1322        case DVD_STRUCT_DISCKEY:
1323                return dvd_read_disckey(cdi, s);
1324
1325        case DVD_STRUCT_BCA:
1326                return dvd_read_bca(cdi, s);
1327
1328        case DVD_STRUCT_MANUFACT:
1329                return dvd_read_manufact(cdi, s);
1330                
1331        default:
1332                cdinfo(CD_WARNING, ": Invalid DVD structure read requested (%d)\n",
1333                                        s->type);
1334                return -EINVAL;
1335        }
1336}
1337
1338int cdrom_mode_sense(struct cdrom_device_info *cdi,
1339                     struct cdrom_generic_command *cgc,
1340                     int page_code, int page_control)
1341{
1342        struct cdrom_device_ops *cdo = cdi->ops;
1343
1344        memset(cgc->cmd, 0, sizeof(cgc->cmd));
1345
1346        cgc->cmd[0] = GPCMD_MODE_SENSE_10;
1347        cgc->cmd[2] = page_code | (page_control << 6);
1348        cgc->cmd[7] = cgc->buflen >> 8;
1349        cgc->cmd[8] = cgc->buflen & 0xff;
1350        cgc->data_direction = CGC_DATA_READ;
1351        return cdo->generic_packet(cdi, cgc);
1352}
1353
1354int cdrom_mode_select(struct cdrom_device_info *cdi,
1355                      struct cdrom_generic_command *cgc)
1356{
1357        struct cdrom_device_ops *cdo = cdi->ops;
1358
1359        memset(cgc->cmd, 0, sizeof(cgc->cmd));
1360        memset(cgc->buffer, 0, 2);
1361        cgc->cmd[0] = GPCMD_MODE_SELECT_10;
1362        cgc->cmd[1] = 0x10;             /* PF */
1363        cgc->cmd[7] = cgc->buflen >> 8;
1364        cgc->cmd[8] = cgc->buflen & 0xff;
1365        cgc->data_direction = CGC_DATA_WRITE;
1366        return cdo->generic_packet(cdi, cgc);
1367}
1368
1369static int cdrom_read_subchannel(struct cdrom_device_info *cdi,
1370                                 struct cdrom_subchnl *subchnl, int mcn)
1371{
1372        struct cdrom_device_ops *cdo = cdi->ops;
1373        struct cdrom_generic_command cgc;
1374        char buffer[32];
1375        int ret;
1376
1377        init_cdrom_command(&cgc, buffer, 16, CGC_DATA_READ);
1378        cgc.cmd[0] = GPCMD_READ_SUBCHANNEL;
1379        cgc.cmd[1] = 2;     /* MSF addressing */
1380        cgc.cmd[2] = 0x40;  /* request subQ data */
1381        cgc.cmd[3] = mcn ? 2 : 1;
1382        cgc.cmd[8] = 16;
1383
1384        if ((ret = cdo->generic_packet(cdi, &cgc)))
1385                return ret;
1386
1387        subchnl->cdsc_audiostatus = cgc.buffer[1];
1388        subchnl->cdsc_format = CDROM_MSF;
1389        subchnl->cdsc_ctrl = cgc.buffer[5] & 0xf;
1390        subchnl->cdsc_trk = cgc.buffer[6];
1391        subchnl->cdsc_ind = cgc.buffer[7];
1392
1393        subchnl->cdsc_reladdr.msf.minute = cgc.buffer[13];
1394        subchnl->cdsc_reladdr.msf.second = cgc.buffer[14];
1395        subchnl->cdsc_reladdr.msf.frame = cgc.buffer[15];
1396        subchnl->cdsc_absaddr.msf.minute = cgc.buffer[9];
1397        subchnl->cdsc_absaddr.msf.second = cgc.buffer[10];
1398        subchnl->cdsc_absaddr.msf.frame = cgc.buffer[11];
1399
1400        return 0;
1401}
1402
1403/*
1404 * Specific READ_10 interface
1405 */
1406static int cdrom_read_cd(struct cdrom_device_info *cdi,
1407                         struct cdrom_generic_command *cgc, int lba,
1408                         int blocksize, int nblocks)
1409{
1410        struct cdrom_device_ops *cdo = cdi->ops;
1411
1412        memset(&cgc->cmd, 0, sizeof(cgc->cmd));
1413        cgc->cmd[0] = GPCMD_READ_10;
1414        cgc->cmd[2] = (lba >> 24) & 0xff;
1415        cgc->cmd[3] = (lba >> 16) & 0xff;
1416        cgc->cmd[4] = (lba >>  8) & 0xff;
1417        cgc->cmd[5] = lba & 0xff;
1418        cgc->cmd[6] = (nblocks >> 16) & 0xff;
1419        cgc->cmd[7] = (nblocks >>  8) & 0xff;
1420        cgc->cmd[8] = nblocks & 0xff;
1421        cgc->buflen = blocksize * nblocks;
1422        return cdo->generic_packet(cdi, cgc);
1423}
1424
1425/* very generic interface for reading the various types of blocks */
1426static int cdrom_read_block(struct cdrom_device_info *cdi,
1427                            struct cdrom_generic_command *cgc,
1428                            int lba, int nblocks, int format, int blksize)
1429{
1430        struct cdrom_device_ops *cdo = cdi->ops;
1431
1432        memset(&cgc->cmd, 0, sizeof(cgc->cmd));
1433        cgc->cmd[0] = GPCMD_READ_CD;
1434        /* expected sector size - cdda,mode1,etc. */
1435        cgc->cmd[1] = format << 2;
1436        /* starting address */
1437        cgc->cmd[2] = (lba >> 24) & 0xff;
1438        cgc->cmd[3] = (lba >> 16) & 0xff;
1439        cgc->cmd[4] = (lba >>  8) & 0xff;
1440        cgc->cmd[5] = lba & 0xff;
1441        /* number of blocks */
1442        cgc->cmd[6] = (nblocks >> 16) & 0xff;
1443        cgc->cmd[7] = (nblocks >>  8) & 0xff;
1444        cgc->cmd[8] = nblocks & 0xff;
1445        cgc->buflen = blksize * nblocks;
1446        
1447        /* set the header info returned */
1448        switch (blksize) {
1449        case CD_FRAMESIZE_RAW0  : cgc->cmd[9] = 0x58; break;
1450        case CD_FRAMESIZE_RAW1  : cgc->cmd[9] = 0x78; break;
1451        case CD_FRAMESIZE_RAW   : cgc->cmd[9] = 0xf8; break;
1452        default                 : cgc->cmd[9] = 0x10;
1453        }
1454        
1455        return cdo->generic_packet(cdi, cgc);
1456}
1457
1458/* Just about every imaginable ioctl is supported in the Uniform layer
1459 * these days. ATAPI / SCSI specific code now mainly resides in
1460 * mmc_ioct().
1461 */
1462int cdrom_ioctl(struct inode *ip, struct file *fp, unsigned int cmd,
1463                       unsigned long arg)
1464{
1465        kdev_t dev = ip->i_rdev;
1466        struct cdrom_device_info *cdi = cdrom_find_device(dev);
1467        struct cdrom_device_ops *cdo = cdi->ops;
1468        int ret;
1469
1470        /* the first few commands do not deal with audio drive_info, but
1471           only with routines in cdrom device operations. */
1472        switch (cmd) {
1473        case CDROMMULTISESSION: {
1474                struct cdrom_multisession ms_info;
1475                u_char requested_format;
1476                cdinfo(CD_DO_IOCTL, "entering CDROMMULTISESSION\n"); 
1477                if (!(cdo->capability & CDC_MULTI_SESSION))
1478                        return -ENOSYS;
1479                IOCTL_IN(arg, struct cdrom_multisession, ms_info);
1480                requested_format = ms_info.addr_format;
1481                if (!((requested_format == CDROM_MSF) ||
1482                        (requested_format == CDROM_LBA)))
1483                                return -EINVAL;
1484                ms_info.addr_format = CDROM_LBA;
1485                if ((ret=cdo->get_last_session(cdi, &ms_info)))
1486                        return ret;
1487                sanitize_format(&ms_info.addr, &ms_info.addr_format,
1488                                requested_format);
1489                IOCTL_OUT(arg, struct cdrom_multisession, ms_info);
1490                cdinfo(CD_DO_IOCTL, "CDROMMULTISESSION successful\n"); 
1491                return 0;
1492                }
1493
1494        case CDROMEJECT: {
1495                cdinfo(CD_DO_IOCTL, "entering CDROMEJECT\n"); 
1496                if (!CDROM_CAN(CDC_OPEN_TRAY))
1497                        return -ENOSYS;
1498                if (cdi->use_count != 1 || keeplocked)
1499                        return -EBUSY;
1500                if (CDROM_CAN(CDC_LOCK))
1501                        if ((ret=cdo->lock_door(cdi, 0)))
1502                                return ret;
1503
1504                return cdo->tray_move(cdi, 1);
1505                }
1506
1507        case CDROMCLOSETRAY: {
1508                cdinfo(CD_DO_IOCTL, "entering CDROMCLOSETRAY\n"); 
1509                if (!CDROM_CAN(CDC_CLOSE_TRAY))
1510                        return -ENOSYS;
1511                return cdo->tray_move(cdi, 0);
1512                }
1513
1514        case CDROMEJECT_SW: {
1515                cdinfo(CD_DO_IOCTL, "entering CDROMEJECT_SW\n"); 
1516                if (!CDROM_CAN(CDC_OPEN_TRAY))
1517                        return -ENOSYS;
1518                if (keeplocked)
1519                        return -EBUSY;
1520                cdi->options &= ~(CDO_AUTO_CLOSE | CDO_AUTO_EJECT);
1521                if (arg)
1522                        cdi->options |= CDO_AUTO_CLOSE | CDO_AUTO_EJECT;
1523                return 0;
1524                }
1525
1526        case CDROM_MEDIA_CHANGED: {
1527                struct cdrom_changer_info info;
1528
1529                cdinfo(CD_DO_IOCTL, "entering CDROM_MEDIA_CHANGED\n"); 
1530                if (!CDROM_CAN(CDC_MEDIA_CHANGED))
1531                        return -ENOSYS;
1532
1533                /* cannot select disc or select current disc */
1534                if (!CDROM_CAN(CDC_SELECT_DISC) || arg == CDSL_CURRENT)
1535                        return media_changed(cdi, 1);
1536
1537                if ((unsigned int)arg >= cdi->capacity)
1538                        return -EINVAL;
1539
1540                if ((ret = cdrom_read_mech_status(cdi, &info)))
1541                        return ret;
1542
1543                return info.slots[arg].change;
1544                }
1545
1546        case CDROM_SET_OPTIONS: {
1547                cdinfo(CD_DO_IOCTL, "entering CDROM_SET_OPTIONS\n"); 
1548                /* options need to be in sync with capability. too late for
1549                   that, so we have to check each one separately... */
1550                switch (arg) {
1551                case CDO_USE_FFLAGS:
1552                case CDO_CHECK_TYPE:
1553                        break;
1554                case CDO_LOCK:
1555                        if (!CDROM_CAN(CDC_LOCK))
1556                                return -ENOSYS;
1557                        break;
1558                case 0:
1559                        return cdi->options;
1560                /* default is basically CDO_[AUTO_CLOSE|AUTO_EJECT] */
1561                default:
1562                        if (!CDROM_CAN(arg))
1563                                return -ENOSYS;
1564                }
1565                cdi->options |= (int) arg;
1566                return cdi->options;
1567                }
1568
1569        case CDROM_CLEAR_OPTIONS: {
1570                cdinfo(CD_DO_IOCTL, "entering CDROM_CLEAR_OPTIONS\n"); 
1571                cdi->options &= ~(int) arg;
1572                return cdi->options;
1573                }
1574
1575        case CDROM_SELECT_SPEED: {
1576                cdinfo(CD_DO_IOCTL, "entering CDROM_SELECT_SPEED\n"); 
1577                if (!CDROM_CAN(CDC_SELECT_SPEED))
1578                        return -ENOSYS;
1579                return cdo->select_speed(cdi, arg);
1580                }
1581
1582        case CDROM_SELECT_DISC: {
1583                cdinfo(CD_DO_IOCTL, "entering CDROM_SELECT_DISC\n"); 
1584                if (!CDROM_CAN(CDC_SELECT_DISC))
1585                        return -ENOSYS;
1586
1587                if ((arg != CDSL_CURRENT) && (arg != CDSL_NONE))
1588                        if ((int)arg >= cdi->capacity)
1589                                return -EINVAL;
1590
1591                /* cdo->select_disc is a hook to allow a driver-specific
1592                 * way of seleting disc.  However, since there is no
1593                 * equiv hook for cdrom_slot_status this may not 
1594                 * actually be useful...
1595                 */
1596                if (cdo->select_disc != NULL)
1597                        return cdo->select_disc(cdi, arg);
1598
1599                /* no driver specific select_disc(), call our own */
1600                cdinfo(CD_CHANGER, "Using generic cdrom_select_disc()\n"); 
1601                return cdrom_select_disc(cdi, arg);
1602                }
1603
1604        case CDROMRESET: {
1605                if (!capable(CAP_SYS_ADMIN))
1606                        return -EACCES;
1607                cdinfo(CD_DO_IOCTL, "entering CDROM_RESET\n");
1608                if (!CDROM_CAN(CDC_RESET))
1609                        return -ENOSYS;
1610                return cdo->reset(cdi);
1611                }
1612
1613        case CDROM_LOCKDOOR: {
1614                cdinfo(CD_DO_IOCTL, "%socking door.\n", arg ? "L" : "Unl");
1615                if (!CDROM_CAN(CDC_LOCK))
1616                        return -EDRIVE_CANT_DO_THIS;
1617                keeplocked = arg ? 1 : 0;
1618                /* don't unlock the door on multiple opens,but allow root
1619                 * to do so */
1620                if ((cdi->use_count != 1) && !arg && !capable(CAP_SYS_ADMIN))
1621                        return -EBUSY;
1622                return cdo->lock_door(cdi, arg);
1623                }
1624
1625        case CDROM_DEBUG: {
1626                if (!capable(CAP_SYS_ADMIN))
1627                        return -EACCES;
1628                cdinfo(CD_DO_IOCTL, "%sabling debug.\n", arg ? "En" : "Dis");
1629                debug = arg ? 1 : 0;
1630                return debug;
1631                }
1632
1633        case CDROM_GET_CAPABILITY: {
1634                cdinfo(CD_DO_IOCTL, "entering CDROM_GET_CAPABILITY\n");
1635                return (cdo->capability & ~cdi->mask);
1636                }
1637
1638/* The following function is implemented, although very few audio
1639 * discs give Universal Product Code information, which should just be
1640 * the Medium Catalog Number on the box.  Note, that the way the code
1641 * is written on the CD is /not/ uniform across all discs!
1642 */
1643        case CDROM_GET_MCN: {
1644                struct cdrom_mcn mcn;
1645                cdinfo(CD_DO_IOCTL, "entering CDROM_GET_MCN\n"); 
1646                if (!(cdo->capability & CDC_MCN))
1647                        return -ENOSYS;
1648                if ((ret=cdo->get_mcn(cdi, &mcn)))
1649                        return ret;
1650                IOCTL_OUT(arg, struct cdrom_mcn, mcn);
1651                cdinfo(CD_DO_IOCTL, "CDROM_GET_MCN successful\n"); 
1652                return 0;
1653                }
1654
1655        case CDROM_DRIVE_STATUS: {
1656                cdinfo(CD_DO_IOCTL, "entering CDROM_DRIVE_STATUS\n"); 
1657                if (!(cdo->capability & CDC_DRIVE_STATUS))
1658                        return -ENOSYS;
1659                if (!CDROM_CAN(CDC_SELECT_DISC))
1660                        return cdo->drive_status(cdi, CDSL_CURRENT);
1661                if ((arg == CDSL_CURRENT) || (arg == CDSL_NONE)) 
1662                        return cdo->drive_status(cdi, CDSL_CURRENT);
1663                if (((int)arg >= cdi->capacity))
1664                        return -EINVAL;
1665                return cdrom_slot_status(cdi, arg);
1666                }
1667
1668        /* Ok, this is where problems start.  The current interface for the
1669           CDROM_DISC_STATUS ioctl is flawed.  It makes the false assumption
1670           that CDs are all CDS_DATA_1 or all CDS_AUDIO, etc.  Unfortunatly,
1671           while this is often the case, it is also very common for CDs to
1672           have some tracks with data, and some tracks with audio.  Just 
1673           because I feel like it, I declare the following to be the best
1674           way to cope.  If the CD has ANY data tracks on it, it will be
1675           returned as a data CD.  If it has any XA tracks, I will return
1676           it as that.  Now I could simplify this interface by combining these 
1677           returns with the above, but this more clearly demonstrates
1678           the problem with the current interface.  Too bad this wasn't 
1679           designed to use bitmasks...         -Erik 
1680
1681           Well, now we have the option CDS_MIXED: a mixed-type CD. 
1682           User level programmers might feel the ioctl is not very useful.
1683                                                ---david
1684        */
1685        case CDROM_DISC_STATUS: {
1686                tracktype tracks;
1687                cdinfo(CD_DO_IOCTL, "entering CDROM_DISC_STATUS\n"); 
1688                cdrom_count_tracks(cdi, &tracks);
1689                if (tracks.error) 
1690                        return(tracks.error);
1691
1692                /* Policy mode on */
1693                if (tracks.audio > 0) {
1694                        if (tracks.data==0 && tracks.cdi==0 && tracks.xa==0) 
1695                                return CDS_AUDIO;
1696                        else
1697                                return CDS_MIXED;
1698                }
1699                if (tracks.cdi > 0) return CDS_XA_2_2;
1700                if (tracks.xa > 0) return CDS_XA_2_1;
1701                if (tracks.data > 0) return CDS_DATA_1;
1702                /* Policy mode off */
1703
1704                cdinfo(CD_WARNING,"This disc doesn't have any tracks I recognize!\n");
1705                return CDS_NO_INFO;
1706                }
1707
1708        case CDROM_CHANGER_NSLOTS: {
1709                cdinfo(CD_DO_IOCTL, "entering CDROM_CHANGER_NSLOTS\n"); 
1710                return cdi->capacity;
1711                }
1712        }
1713
1714        /* use the ioctls that are implemented through the generic_packet()
1715           interface. this may look at bit funny, but if -ENOTTY is
1716           returned that particular ioctl is not implemented and we
1717           let it go through the device specific ones. */
1718        if (CDROM_CAN(CDC_GENERIC_PACKET)) {
1719                ret = mmc_ioctl(cdi, cmd, arg);
1720                if (ret != -ENOTTY) {
1721                        return ret;
1722                }
1723        }
1724
1725        /* note: most of the cdinfo() calls are commented out here,
1726           because they fill up the sys log when CD players poll
1727           the drive. */
1728        switch (cmd) {
1729        case CDROMSUBCHNL: {
1730                struct cdrom_subchnl q;
1731                u_char requested, back;
1732                if (!CDROM_CAN(CDC_PLAY_AUDIO))
1733                        return -ENOSYS;
1734                /* cdinfo(CD_DO_IOCTL,"entering CDROMSUBCHNL\n");*/ 
1735                IOCTL_IN(arg, struct cdrom_subchnl, q);
1736                requested = q.cdsc_format;
1737                if (!((requested == CDROM_MSF) ||
1738                      (requested == CDROM_LBA)))
1739                        return -EINVAL;
1740                q.cdsc_format = CDROM_MSF;
1741                if ((ret=cdo->audio_ioctl(cdi, cmd, &q)))
1742                        return ret;
1743                back = q.cdsc_format; /* local copy */
1744                sanitize_format(&q.cdsc_absaddr, &back, requested);
1745                sanitize_format(&q.cdsc_reladdr, &q.cdsc_format, requested);
1746                IOCTL_OUT(arg, struct cdrom_subchnl, q);
1747                /* cdinfo(CD_DO_IOCTL, "CDROMSUBCHNL successful\n"); */ 
1748                return 0;
1749                }
1750        case CDROMREADTOCHDR: {
1751                struct cdrom_tochdr header;
1752                if (!CDROM_CAN(CDC_PLAY_AUDIO))
1753                        return -ENOSYS;
1754                /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCHDR\n"); */ 
1755                IOCTL_IN(arg, struct cdrom_tochdr, header);
1756                if ((ret=cdo->audio_ioctl(cdi, cmd, &header)))
1757                        return ret;
1758                IOCTL_OUT(arg, struct cdrom_tochdr, header);
1759                /* cdinfo(CD_DO_IOCTL, "CDROMREADTOCHDR successful\n"); */ 
1760                return 0;
1761                }
1762        case CDROMREADTOCENTRY: {
1763                struct cdrom_tocentry entry;
1764                u_char requested_format;
1765                if (!CDROM_CAN(CDC_PLAY_AUDIO))
1766                        return -ENOSYS;
1767                /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCENTRY\n"); */ 
1768                IOCTL_IN(arg, struct cdrom_tocentry, entry);
1769                requested_format = entry.cdte_format;
1770                if (!((requested_format == CDROM_MSF) || 
1771                        (requested_format == CDROM_LBA)))
1772                                return -EINVAL;
1773                /* make interface to low-level uniform */
1774                entry.cdte_format = CDROM_MSF;
1775                if ((ret=cdo->audio_ioctl(cdi, cmd, &entry)))
1776                        return ret;
1777                sanitize_format(&entry.cdte_addr,
1778                &entry.cdte_format, requested_format);
1779                IOCTL_OUT(arg, struct cdrom_tocentry, entry);
1780                /* cdinfo(CD_DO_IOCTL, "CDROMREADTOCENTRY successful\n"); */ 
1781                return 0;
1782                }
1783        case CDROMPLAYMSF: {
1784                struct cdrom_msf msf;
1785                if (!CDROM_CAN(CDC_PLAY_AUDIO))
1786                        return -ENOSYS;
1787                cdinfo(CD_DO_IOCTL, "entering CDROMPLAYMSF\n"); 
1788                IOCTL_IN(arg, struct cdrom_msf, msf);
1789                return cdo->audio_ioctl(cdi, cmd, &msf);
1790                }
1791        case CDROMPLAYTRKIND: {
1792                struct cdrom_ti ti;
1793                if (!CDROM_CAN(CDC_PLAY_AUDIO))
1794                        return -ENOSYS;
1795                cdinfo(CD_DO_IOCTL, "entering CDROMPLAYTRKIND\n"); 
1796                IOCTL_IN(arg, struct cdrom_ti, ti);
1797                CHECKAUDIO;
1798                return cdo->audio_ioctl(cdi, cmd, &ti);
1799                }
1800        case CDROMVOLCTRL: {
1801                struct cdrom_volctrl volume;
1802                if (!CDROM_CAN(CDC_PLAY_AUDIO))
1803                        return -ENOSYS;
1804                cdinfo(CD_DO_IOCTL, "entering CDROMVOLCTRL\n"); 
1805                IOCTL_IN(arg, struct cdrom_volctrl, volume);
1806                return cdo->audio_ioctl(cdi, cmd, &volume);
1807                }
1808        case CDROMVOLREAD: {
1809                struct cdrom_volctrl volume;
1810                if (!CDROM_CAN(CDC_PLAY_AUDIO))
1811                        return -ENOSYS;
1812                cdinfo(CD_DO_IOCTL, "entering CDROMVOLREAD\n"); 
1813                if ((ret=cdo->audio_ioctl(cdi, cmd, &volume)))
1814                        return ret;
1815                IOCTL_OUT(arg, struct cdrom_volctrl, volume);
1816                return 0;
1817                }
1818        case CDROMSTART:
1819        case CDROMSTOP:
1820        case CDROMPAUSE:
1821        case CDROMRESUME: {
1822                if (!CDROM_CAN(CDC_PLAY_AUDIO))
1823                        return -ENOSYS;
1824                cdinfo(CD_DO_IOCTL, "doing audio ioctl (start/stop/pause/resume)\n"); 
1825                CHECKAUDIO;
1826                return cdo->audio_ioctl(cdi, cmd, NULL);
1827                }
1828        } /* switch */
1829
1830        /* do the device specific ioctls */
1831        if (CDROM_CAN(CDC_IOCTLS))
1832                return cdo->dev_ioctl(cdi, cmd, arg);
1833        
1834        return -ENOSYS;
1835}
1836
1837static inline
1838int msf_to_lba(char m, char s, char f)
1839{
1840        return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
1841}
1842
1843/*
1844 * Required when we need to use READ_10 to issue other than 2048 block
1845 * reads
1846 */
1847static int cdrom_switch_blocksize(struct cdrom_device_info *cdi, int size)
1848{
1849        struct cdrom_device_ops *cdo = cdi->ops;
1850        struct cdrom_generic_command cgc;
1851        struct modesel_head mh;
1852
1853        memset(&mh, 0, sizeof(mh));
1854        mh.block_desc_length = 0x08;
1855        mh.block_length_med = (size >> 8) & 0xff;
1856        mh.block_length_lo = size & 0xff;
1857
1858        memset(&cgc, 0, sizeof(cgc));
1859        cgc.cmd[0] = 0x15;
1860        cgc.cmd[1] = 1 << 4;
1861        cgc.cmd[4] = 12;
1862        cgc.buflen = sizeof(mh);
1863        cgc.buffer = (char *) &mh;
1864        cgc.data_direction = CGC_DATA_WRITE;
1865        mh.block_desc_length = 0x08;
1866        mh.block_length_med = (size >> 8) & 0xff;
1867        mh.block_length_lo = size & 0xff;
1868
1869        return cdo->generic_packet(cdi, &cgc);
1870}
1871
1872static int cdrom_do_cmd(struct cdrom_device_info *cdi,
1873                        struct cdrom_generic_command *cgc)
1874{
1875        struct request_sense *usense, sense;
1876        unsigned char *ubuf;
1877        int ret;
1878
1879        if (cgc->data_direction == CGC_DATA_UNKNOWN)
1880                return -EINVAL;
1881
1882        if (cgc->buflen < 0 || cgc->buflen >= 131072)
1883                return -EINVAL;
1884
1885        usense = cgc->sense;
1886        cgc->sense = &sense;
1887        if (usense && !access_ok(VERIFY_WRITE, usense, sizeof(*usense))) {
1888                return -EFAULT;
1889        }
1890
1891        ubuf = cgc->buffer;
1892        if (cgc->data_direction == CGC_DATA_READ ||
1893            cgc->data_direction == CGC_DATA_WRITE) {
1894                cgc->buffer = kmalloc(cgc->buflen, GFP_KERNEL);
1895                if (cgc->buffer == NULL)
1896                        return -ENOMEM;
1897        }
1898
1899
1900        if (cgc->data_direction == CGC_DATA_READ) {
1901                if (!access_ok(VERIFY_READ, ubuf, cgc->buflen)) {
1902                        kfree(cgc->buffer);
1903                        return -EFAULT;
1904                }
1905        } else if (cgc->data_direction == CGC_DATA_WRITE) {
1906                if (copy_from_user(cgc->buffer, ubuf, cgc->buflen)) {
1907                        kfree(cgc->buffer);
1908                        return -EFAULT;
1909                }
1910        }
1911
1912        ret = cdi->ops->generic_packet(cdi, cgc);
1913        __copy_to_user(usense, cgc->sense, sizeof(*usense));
1914        if (!ret && cgc->data_direction == CGC_DATA_READ)
1915                __copy_to_user(ubuf, cgc->buffer, cgc->buflen);
1916        if (cgc->data_direction == CGC_DATA_READ ||
1917            cgc->data_direction == CGC_DATA_WRITE) {
1918                kfree(cgc->buffer);
1919        }
1920        return ret;
1921}
1922
1923static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
1924                     unsigned long arg)
1925{               
1926        struct cdrom_device_ops *cdo = cdi->ops;
1927        struct cdrom_generic_command cgc;
1928        struct request_sense sense;
1929        kdev_t dev = cdi->dev;
1930        char buffer[32];
1931        int ret = 0;
1932
1933        memset(&cgc, 0, sizeof(cgc));
1934
1935        /* build a unified command and queue it through
1936           cdo->generic_packet() */
1937        switch (cmd) {
1938        case CDROMREADRAW:
1939        case CDROMREADMODE1:
1940        case CDROMREADMODE2: {
1941                struct cdrom_msf msf;
1942                int blocksize = 0, format = 0, lba;
1943                
1944                switch (cmd) {
1945                case CDROMREADRAW:
1946                        blocksize = CD_FRAMESIZE_RAW;
1947                        break;
1948                case CDROMREADMODE1:
1949                        blocksize = CD_FRAMESIZE;
1950                        format = 2;
1951                        break;
1952                case CDROMREADMODE2:
1953                        blocksize = CD_FRAMESIZE_RAW0;
1954                        break;
1955                }
1956                IOCTL_IN(arg, struct cdrom_msf, msf);
1957                lba = msf_to_lba(msf.cdmsf_min0,msf.cdmsf_sec0,msf.cdmsf_frame0);
1958                /* FIXME: we need upper bound checking, too!! */
1959                if (lba < 0)
1960                        return -EINVAL;
1961                cgc.buffer = (char *) kmalloc(blocksize, GFP_KERNEL);
1962                if (cgc.buffer == NULL)
1963                        return -ENOMEM;
1964                memset(&sense, 0, sizeof(sense));
1965                cgc.sense = &sense;
1966                cgc.data_direction = CGC_DATA_READ;
1967                ret = cdrom_read_block(cdi, &cgc, lba, 1, format, blocksize);
1968                if (ret && sense.sense_key==0x05 && sense.asc==0x20 && sense.ascq==0x00) {
1969                        /*
1970                         * SCSI-II devices are not required to support
1971                         * READ_CD, so let's try switching block size
1972                         */
1973                        /* FIXME: switch back again... */
1974                        if ((ret = cdrom_switch_blocksize(cdi, blocksize))) {
1975                                kfree(cgc.buffer);
1976                                return ret;
1977                        }
1978                        cgc.sense = NULL;
1979                        ret = cdrom_read_cd(cdi, &cgc, lba, blocksize, 1);
1980                        ret |= cdrom_switch_blocksize(cdi, blocksize);
1981                }
1982                if (!ret && copy_to_user((char *)arg, cgc.buffer, blocksize))
1983                        ret = -EFAULT;
1984                kfree(cgc.buffer);
1985                return ret;
1986                }
1987        case CDROMREADAUDIO: {
1988                struct cdrom_read_audio ra;
1989                int lba, nr;
1990
1991                IOCTL_IN(arg, struct cdrom_read_audio, ra);
1992
1993                if (ra.addr_format == CDROM_MSF)
1994                        lba = msf_to_lba(ra.addr.msf.minute,
1995                                         ra.addr.msf.second,
1996                                         ra.addr.msf.frame);
1997                else if (ra.addr_format == CDROM_LBA)
1998                        lba = ra.addr.lba;
1999                else
2000                        return -EINVAL;
2001
2002                /* FIXME: we need upper bound checking, too!! */
2003                if (lba < 0 || ra.nframes <= 0)
2004                        return -EINVAL;
2005
2006                /*
2007                 * start with will ra.nframes size, back down if alloc fails
2008                 */
2009                nr = ra.nframes;
2010                do {
2011                        cgc.buffer = kmalloc(CD_FRAMESIZE_RAW * nr, GFP_KERNEL);
2012                        if (cgc.buffer)
2013                                break;
2014
2015                        nr >>= 1;
2016                } while (nr);
2017
2018                if (!nr)
2019                        return -ENOMEM;
2020
2021                if (!access_ok(VERIFY_WRITE, ra.buf, ra.nframes*CD_FRAMESIZE_RAW)) {
2022                        kfree(cgc.buffer);
2023                        return -EFAULT;
2024                }
2025                cgc.data_direction = CGC_DATA_READ;
2026                while (ra.nframes > 0) {
2027                        if (nr > ra.nframes)
2028                                nr = ra.nframes;
2029
2030                        ret = cdrom_read_block(cdi, &cgc, lba, nr, 1, CD_FRAMESIZE_RAW);
2031                        if (ret)
2032                                break;
2033                        __copy_to_user(ra.buf, cgc.buffer, CD_FRAMESIZE_RAW*nr);
2034                        ra.buf += CD_FRAMESIZE_RAW * nr;
2035                        ra.nframes -= nr;
2036                        lba += nr;
2037                }
2038                kfree(cgc.buffer);
2039                return ret;
2040                }
2041        case CDROMSUBCHNL: {
2042                struct cdrom_subchnl q;
2043                u_char requested, back;
2044                IOCTL_IN(arg, struct cdrom_subchnl, q);
2045                requested = q.cdsc_format;
2046                if (!((requested == CDROM_MSF) ||
2047                      (requested == CDROM_LBA)))
2048                        return -EINVAL;
2049                q.cdsc_format = CDROM_MSF;
2050                if ((ret = cdrom_read_subchannel(cdi, &q, 0)))
2051                        return ret;
2052                back = q.cdsc_format; /* local copy */
2053                sanitize_format(&q.cdsc_absaddr, &back, requested);
2054                sanitize_format(&q.cdsc_reladdr, &q.cdsc_format, requested);
2055                IOCTL_OUT(arg, struct cdrom_subchnl, q);
2056                /* cdinfo(CD_DO_IOCTL, "CDROMSUBCHNL successful\n"); */ 
2057                return 0;
2058                }
2059        case CDROMPLAYMSF: {
2060                struct cdrom_msf msf;
2061                cdinfo(CD_DO_IOCTL, "entering CDROMPLAYMSF\n");
2062                IOCTL_IN(arg, struct cdrom_msf, msf);
2063                cgc.cmd[0] = GPCMD_PLAY_AUDIO_MSF;
2064                cgc.cmd[3] = msf.cdmsf_min0;
2065                cgc.cmd[4] = msf.cdmsf_sec0;
2066                cgc.cmd[5] = msf.cdmsf_frame0;
2067                cgc.cmd[6] = msf.cdmsf_min1;
2068                cgc.cmd[7] = msf.cdmsf_sec1;
2069                cgc.cmd[8] = msf.cdmsf_frame1;
2070                cgc.data_direction = CGC_DATA_NONE;
2071                return cdo->generic_packet(cdi, &cgc);
2072                }
2073        case CDROMPLAYBLK: {
2074                struct cdrom_blk blk;
2075                cdinfo(CD_DO_IOCTL, "entering CDROMPLAYBLK\n");
2076                IOCTL_IN(arg, struct cdrom_blk, blk);
2077                cgc.cmd[0] = GPCMD_PLAY_AUDIO_10;
2078                cgc.cmd[2] = (blk.from >> 24) & 0xff;
2079                cgc.cmd[3] = (blk.from >> 16) & 0xff;
2080                cgc.cmd[4] = (blk.from >>  8) & 0xff;
2081                cgc.cmd[5] = blk.from & 0xff;
2082                cgc.cmd[7] = (blk.len >> 8) & 0xff;
2083                cgc.cmd[8] = blk.len & 0xff;
2084                cgc.data_direction = CGC_DATA_NONE;
2085                return cdo->generic_packet(cdi, &cgc);
2086                }
2087        case CDROMVOLCTRL:
2088        case CDROMVOLREAD: {
2089                struct cdrom_volctrl volctrl;
2090                char mask[32];
2091                unsigned short offset;
2092                cdinfo(CD_DO_IOCTL, "entering CDROMVOLUME\n");
2093
2094                IOCTL_IN(arg, struct cdrom_volctrl, volctrl);
2095
2096                cgc.buffer = buffer;
2097                cgc.buflen = 24;
2098                if ((ret = cdrom_mode_sense(cdi, &cgc, GPMODE_AUDIO_CTL_PAGE, 0)))
2099                    return ret;
2100                
2101                /* some drives have longer pages, adjust and reread. */
2102                if (buffer[1] > cgc.buflen) {
2103                        cgc.buflen = buffer[1] + 2;
2104                        if ((ret = cdrom_mode_sense(cdi, &cgc, 
2105                                        GPMODE_AUDIO_CTL_PAGE, 0))) 
2106                            return ret;
2107                }
2108                
2109                /* get the offset from the length of the page. length
2110                   is measure from byte 2 an on, thus the 14. */
2111                offset = buffer[1] - 14;
2112
2113                /* now we have the current volume settings. if it was only
2114                   a CDROMVOLREAD, return these values */
2115                if (cmd == CDROMVOLREAD) {
2116                        volctrl.channel0 = buffer[offset+9];
2117                        volctrl.channel1 = buffer[offset+11];
2118                        volctrl.channel2 = buffer[offset+13];
2119                        volctrl.channel3 = buffer[offset+15];
2120                        IOCTL_OUT(arg, struct cdrom_volctrl, volctrl);
2121                        return 0;
2122                }
2123                
2124                /* get the volume mask */
2125                cgc.buffer = mask;
2126                if ((ret = cdrom_mode_sense(cdi, &cgc, 
2127                                GPMODE_AUDIO_CTL_PAGE, 1)))
2128                        return ret;
2129
2130                buffer[offset+9] = volctrl.channel0 & mask[offset+9];
2131                buffer[offset+11] = volctrl.channel1 & mask[offset+11];
2132                buffer[offset+13] = volctrl.channel2 & mask[offset+13];
2133                buffer[offset+15] = volctrl.channel3 & mask[offset+15];
2134
2135                /* set volume */
2136                cgc.buffer = buffer;
2137                return cdrom_mode_select(cdi, &cgc);
2138                }
2139
2140        case CDROMSTART:
2141        case CDROMSTOP: {
2142                cdinfo(CD_DO_IOCTL, "entering CDROMSTART/CDROMSTOP\n"); 
2143                cgc.cmd[0] = GPCMD_START_STOP_UNIT;
2144                cgc.cmd[1] = 1;
2145                cgc.cmd[4] = (cmd == CDROMSTART) ? 1 : 0;
2146                cgc.data_direction = CGC_DATA_NONE;
2147                return cdo->generic_packet(cdi, &cgc);
2148                }
2149
2150        case CDROMPAUSE:
2151        case CDROMRESUME: {
2152                cdinfo(CD_DO_IOCTL, "entering CDROMPAUSE/CDROMRESUME\n"); 
2153                cgc.cmd[0] = GPCMD_PAUSE_RESUME;
2154                cgc.cmd[8] = (cmd == CDROMRESUME) ? 1 : 0;
2155                cgc.data_direction = CGC_DATA_NONE;
2156                return cdo->generic_packet(cdi, &cgc);
2157                }
2158
2159        case DVD_READ_STRUCT: {
2160                dvd_struct *s;
2161                int size = sizeof(dvd_struct);
2162                if (!CDROM_CAN(CDC_DVD))
2163                        return -ENOSYS;
2164                if ((s = (dvd_struct *) kmalloc(size, GFP_KERNEL)) == NULL)
2165                        return -ENOMEM;
2166                cdinfo(CD_DO_IOCTL, "entering DVD_READ_STRUCT\n"); 
2167                if (copy_from_user(s, (dvd_struct *)arg, size)) {
2168                        kfree(s);
2169                        return -EFAULT;
2170                }
2171                if ((ret = dvd_read_struct(cdi, s))) {
2172                        kfree(s);
2173                        return ret;
2174                }
2175                if (copy_to_user((dvd_struct *)arg, s, size))
2176                        ret = -EFAULT;
2177                kfree(s);
2178                return ret;
2179                }
2180
2181        case DVD_AUTH: {
2182                dvd_authinfo ai;
2183                if (!CDROM_CAN(CDC_DVD))
2184                        return -ENOSYS;
2185                cdinfo(CD_DO_IOCTL, "entering DVD_AUTH\n"); 
2186                IOCTL_IN(arg, dvd_authinfo, ai);
2187                if ((ret = dvd_do_auth (cdi, &ai)))
2188                        return ret;
2189                IOCTL_OUT(arg, dvd_authinfo, ai);
2190                return 0;
2191                }
2192
2193        case CDROM_SEND_PACKET: {
2194                if (!CDROM_CAN(CDC_GENERIC_PACKET))
2195                        return -ENOSYS;
2196                cdinfo(CD_DO_IOCTL, "entering CDROM_SEND_PACKET\n"); 
2197                IOCTL_IN(arg, struct cdrom_generic_command, cgc);
2198                return cdrom_do_cmd(cdi, &cgc);
2199                }
2200        case CDROM_NEXT_WRITABLE: {
2201                long next = 0;
2202                cdinfo(CD_DO_IOCTL, "entering CDROM_NEXT_WRITABLE\n"); 
2203                if ((ret = cdrom_get_next_writable(dev, &next)))
2204                        return ret;
2205                IOCTL_OUT(arg, long, next);
2206                return 0;
2207                }
2208        case CDROM_LAST_WRITTEN: {
2209                long last = 0;
2210                cdinfo(CD_DO_IOCTL, "entering CDROM_LAST_WRITTEN\n"); 
2211                if ((ret = cdrom_get_last_written(dev, &last)))
2212                        return ret;
2213                IOCTL_OUT(arg, long, last);
2214                return 0;
2215                }
2216        } /* switch */
2217
2218        return -ENOTTY;
2219}
2220
2221int cdrom_get_track_info(kdev_t dev, __u16 track, __u8 type,
2222                         track_information *ti)
2223{
2224        struct cdrom_device_info *cdi = cdrom_find_device(dev);
2225        struct cdrom_device_ops *cdo = cdi->ops;
2226        struct cdrom_generic_command cgc;
2227        int ret;
2228
2229        init_cdrom_command(&cgc, ti, 8, CGC_DATA_READ);
2230        cgc.cmd[0] = GPCMD_READ_TRACK_RZONE_INFO;
2231        cgc.cmd[1] = type & 3;
2232        cgc.cmd[4] = (track & 0xff00) >> 8;
2233        cgc.cmd[5] = track & 0xff;
2234        cgc.cmd[8] = 8;
2235        cgc.quiet = 1;
2236
2237        if ((ret = cdo->generic_packet(cdi, &cgc)))
2238                return ret;
2239        
2240        cgc.buflen = be16_to_cpu(ti->track_information_length) +
2241                     sizeof(ti->track_information_length);
2242
2243        if (cgc.buflen > sizeof(track_information))
2244                cgc.buflen = sizeof(track_information);
2245
2246        cgc.cmd[8] = cgc.buflen;
2247        return cdo->generic_packet(cdi, &cgc);
2248}
2249
2250/* requires CD R/RW */
2251int cdrom_get_disc_info(kdev_t dev, disc_information *di)
2252{
2253        struct cdrom_device_info *cdi = cdrom_find_device(dev);
2254        struct cdrom_device_ops *cdo = cdi->ops;
2255        struct cdrom_generic_command cgc;
2256        int ret;
2257
2258        /* set up command and get the disc info */
2259        init_cdrom_command(&cgc, di, sizeof(*di), CGC_DATA_READ);
2260        cgc.cmd[0] = GPCMD_READ_DISC_INFO;
2261        cgc.cmd[8] = cgc.buflen = 2;
2262        cgc.quiet = 1;
2263
2264        if ((ret = cdo->generic_packet(cdi, &cgc)))
2265                return ret;
2266
2267        /* not all drives have the same disc_info length, so requeue
2268         * packet with the length the drive tells us it can supply
2269         */
2270        cgc.buflen = be16_to_cpu(di->disc_information_length) +
2271                     sizeof(di->disc_information_length);
2272
2273        if (cgc.buflen > sizeof(disc_information))
2274                cgc.buflen = sizeof(disc_information);
2275
2276        cgc.cmd[8] = cgc.buflen;
2277        return cdo->generic_packet(cdi, &cgc);
2278}
2279
2280
2281/* return the last written block on the CD-R media. this is for the udf
2282   file system. */
2283int cdrom_get_last_written(kdev_t dev, long *last_written)
2284{       
2285        struct cdrom_device_info *cdi = cdrom_find_device(dev);
2286        struct cdrom_tocentry toc;
2287        disc_information di;
2288        track_information ti;
2289        __u32 last_track;
2290        int ret = -1;
2291
2292        if (!CDROM_CAN(CDC_GENERIC_PACKET))
2293                goto use_toc;
2294
2295        if ((ret = cdrom_get_disc_info(dev, &di)))
2296                goto use_toc;
2297
2298        last_track = (di.last_track_msb << 8) | di.last_track_lsb;
2299        if ((ret = cdrom_get_track_info(dev, last_track, 1, &ti)))
2300                goto use_toc;
2301
2302        /* if this track is blank, try the previous. */
2303        if (ti.blank) {
2304                last_track--;
2305                if ((ret = cdrom_get_track_info(dev, last_track, 1, &ti)))
2306                        goto use_toc;
2307        }
2308
2309        /* if last recorded field is valid, return it. */
2310        if (ti.lra_v) {
2311                *last_written = be32_to_cpu(ti.last_rec_address);
2312        } else {
2313                /* make it up instead */
2314                *last_written = be32_to_cpu(ti.track_start) +
2315                                be32_to_cpu(ti.track_size);
2316                if (ti.free_blocks)
2317                        *last_written -= (be32_to_cpu(ti.free_blocks) + 7);
2318        }
2319        return 0;
2320
2321        /* this is where we end up if the drive either can't do a
2322           GPCMD_READ_DISC_INFO or GPCMD_READ_TRACK_RZONE_INFO or if
2323           it fails. then we return the toc contents. */
2324use_toc:
2325        toc.cdte_format = CDROM_MSF;
2326        toc.cdte_track = CDROM_LEADOUT;
2327        if (cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &toc))
2328                return ret;
2329        sanitize_format(&toc.cdte_addr, &toc.cdte_format, CDROM_LBA);
2330        *last_written = toc.cdte_addr.lba;
2331        return 0;
2332}
2333
2334/* return the next writable block. also for udf file system. */
2335int cdrom_get_next_writable(kdev_t dev, long *next_writable)
2336{
2337        struct cdrom_device_info *cdi = cdrom_find_device(dev);
2338        disc_information di;
2339        track_information ti;
2340        __u16 last_track;
2341        int ret = -1;
2342
2343        if (!CDROM_CAN(CDC_GENERIC_PACKET))
2344                goto use_last_written;
2345
2346        if ((ret = cdrom_get_disc_info(dev, &di)))
2347                goto use_last_written;
2348
2349        last_track = (di.last_track_msb << 8) | di.last_track_lsb;
2350        if ((ret = cdrom_get_track_info(dev, last_track, 1, &ti)))
2351                goto use_last_written;
2352
2353        /* if this track is blank, try the previous. */
2354        if (ti.blank) {
2355                last_track--;
2356                if ((ret = cdrom_get_track_info(dev, last_track, 1, &ti)))
2357                        goto use_last_written;
2358        }
2359
2360        /* if next recordable address field is valid, use it. */
2361        if (ti.nwa_v)
2362                *next_writable = be32_to_cpu(ti.next_writable);
2363        else
2364                goto use_last_written;
2365
2366        return 0;
2367
2368use_last_written:
2369        if ((ret = cdrom_get_last_written(dev, next_writable))) {
2370                *next_writable = 0;
2371                return ret;
2372        } else {
2373                *next_writable += 7;
2374                return 0;
2375        }
2376}
2377
2378EXPORT_SYMBOL(cdrom_get_disc_info);
2379EXPORT_SYMBOL(cdrom_get_track_info);
2380EXPORT_SYMBOL(cdrom_get_next_writable);
2381EXPORT_SYMBOL(cdrom_get_last_written);
2382EXPORT_SYMBOL(cdrom_count_tracks);
2383EXPORT_SYMBOL(register_cdrom);
2384EXPORT_SYMBOL(unregister_cdrom);
2385EXPORT_SYMBOL(cdrom_open);
2386EXPORT_SYMBOL(cdrom_release);
2387EXPORT_SYMBOL(cdrom_ioctl);
2388EXPORT_SYMBOL(cdrom_media_changed);
2389EXPORT_SYMBOL(cdrom_number_of_slots);
2390EXPORT_SYMBOL(cdrom_select_disc);
2391EXPORT_SYMBOL(cdrom_mode_select);
2392EXPORT_SYMBOL(cdrom_mode_sense);
2393EXPORT_SYMBOL(init_cdrom_command);
2394EXPORT_SYMBOL(cdrom_find_device);
2395
2396#ifdef CONFIG_SYSCTL
2397
2398#define CDROM_STR_SIZE 1000
2399
2400struct cdrom_sysctl_settings {
2401        char    info[CDROM_STR_SIZE];   /* general info */
2402        int     autoclose;              /* close tray upon mount, etc */
2403        int     autoeject;              /* eject on umount */
2404        int     debug;                  /* turn on debugging messages */
2405        int     lock;                   /* lock the door on device open */
2406        int     check;                  /* check media type */
2407} cdrom_sysctl_settings;
2408
2409int cdrom_sysctl_info(ctl_table *ctl, int write, struct file * filp,
2410                           void *buffer, size_t *lenp)
2411{
2412        int pos;
2413        struct cdrom_device_info *cdi;
2414        char *info = cdrom_sysctl_settings.info;
2415        
2416        if (!*lenp || (filp->f_pos && !write)) {
2417                *lenp = 0;
2418                return 0;
2419        }
2420
2421        pos = sprintf(info, "CD-ROM information, " VERSION "\n");
2422        
2423        pos += sprintf(info+pos, "\ndrive name:\t");
2424        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2425            pos += sprintf(info+pos, "\t%s", cdi->name);
2426
2427        pos += sprintf(info+pos, "\ndrive speed:\t");
2428        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2429            pos += sprintf(info+pos, "\t%d", cdi->speed);
2430
2431        pos += sprintf(info+pos, "\ndrive # of slots:");
2432        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2433            pos += sprintf(info+pos, "\t%d", cdi->capacity);
2434
2435        pos += sprintf(info+pos, "\nCan close tray:\t");
2436        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2437            pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_CLOSE_TRAY) != 0);
2438
2439        pos += sprintf(info+pos, "\nCan open tray:\t");
2440        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2441            pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_OPEN_TRAY) != 0);
2442
2443        pos += sprintf(info+pos, "\nCan lock tray:\t");
2444        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2445            pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_LOCK) != 0);
2446
2447        pos += sprintf(info+pos, "\nCan change speed:");
2448        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2449            pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_SELECT_SPEED) != 0);
2450
2451        pos += sprintf(info+pos, "\nCan select disk:");
2452        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2453            pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_SELECT_DISC) != 0);
2454
2455        pos += sprintf(info+pos, "\nCan read multisession:");
2456        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2457            pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MULTI_SESSION) != 0);
2458
2459        pos += sprintf(info+pos, "\nCan read MCN:\t");
2460        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2461            pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MCN) != 0);
2462
2463        pos += sprintf(info+pos, "\nReports media changed:");
2464        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2465            pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MEDIA_CHANGED) != 0);
2466
2467        pos += sprintf(info+pos, "\nCan play audio:\t");
2468        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2469            pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_PLAY_AUDIO) != 0);
2470
2471        pos += sprintf(info+pos, "\nCan write CD-R:\t");
2472        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2473            pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_CD_R) != 0);
2474
2475        pos += sprintf(info+pos, "\nCan write CD-RW:");
2476        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2477            pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_CD_RW) != 0);
2478
2479        pos += sprintf(info+pos, "\nCan read DVD:\t");
2480        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2481            pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD) != 0);
2482
2483        pos += sprintf(info+pos, "\nCan write DVD-R:");
2484        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2485            pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD_R) != 0);
2486
2487        pos += sprintf(info+pos, "\nCan write DVD-RAM:");
2488        for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
2489            pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD_RAM) != 0);
2490
2491        strcpy(info+pos,"\n\n");
2492                
2493        return proc_dostring(ctl, write, filp, buffer, lenp);
2494}
2495
2496/* Unfortunately, per device settings are not implemented through
2497   procfs/sysctl yet. When they are, this will naturally disappear. For now
2498   just update all drives. Later this will become the template on which
2499   new registered drives will be based. */
2500void cdrom_update_settings(void)
2501{
2502        struct cdrom_device_info *cdi;
2503
2504        for (cdi = topCdromPtr; cdi != NULL; cdi = cdi->next) {
2505                if (autoclose && CDROM_CAN(CDC_CLOSE_TRAY))
2506                        cdi->options |= CDO_AUTO_CLOSE;
2507                else if (!autoclose)
2508                        cdi->options &= ~CDO_AUTO_CLOSE;
2509                if (autoeject && CDROM_CAN(CDC_OPEN_TRAY))
2510                        cdi->options |= CDO_AUTO_EJECT;
2511                else if (!autoeject)
2512                        cdi->options &= ~CDO_AUTO_EJECT;
2513                if (lockdoor && CDROM_CAN(CDC_LOCK))
2514                        cdi->options |= CDO_LOCK;
2515                else if (!lockdoor)
2516                        cdi->options &= ~CDO_LOCK;
2517                if (check_media_type)
2518                        cdi->options |= CDO_CHECK_TYPE;
2519                else
2520                        cdi->options &= ~CDO_CHECK_TYPE;
2521        }
2522}
2523
2524static int cdrom_sysctl_handler(ctl_table *ctl, int write, struct file * filp,
2525                                void *buffer, size_t *lenp)
2526{
2527        int *valp = ctl->data;
2528        int val = *valp;
2529        int ret;
2530        
2531        ret = proc_dointvec(ctl, write, filp, buffer, lenp);
2532
2533        if (write && *valp != val) {
2534        
2535                /* we only care for 1 or 0. */
2536                if (*valp)
2537                        *valp = 1;
2538                else
2539                        *valp = 0;
2540
2541                switch (ctl->ctl_name) {
2542                case DEV_CDROM_AUTOCLOSE: {
2543                        if (valp == &cdrom_sysctl_settings.autoclose)
2544                                autoclose = cdrom_sysctl_settings.autoclose;
2545                        break;
2546                        }
2547                case DEV_CDROM_AUTOEJECT: {
2548                        if (valp == &cdrom_sysctl_settings.autoeject)
2549                                autoeject = cdrom_sysctl_settings.autoeject;
2550                        break;
2551                        }
2552                case DEV_CDROM_DEBUG: {
2553                        if (valp == &cdrom_sysctl_settings.debug)
2554                                debug = cdrom_sysctl_settings.debug;
2555                        break;
2556                        }
2557                case DEV_CDROM_LOCK: {
2558                        if (valp == &cdrom_sysctl_settings.lock)
2559                                lockdoor = cdrom_sysctl_settings.lock;
2560                        break;
2561                        }
2562                case DEV_CDROM_CHECK_MEDIA: {
2563                        if (valp == &cdrom_sysctl_settings.check)
2564                                check_media_type = cdrom_sysctl_settings.check;
2565                        break;
2566                        }
2567                }
2568                /* update the option flags according to the changes. we
2569                   don't have per device options through sysctl yet,
2570                   but we will have and then this will disappear. */
2571                cdrom_update_settings();
2572        }
2573
2574        return ret;
2575}
2576
2577/* Place files in /proc/sys/dev/cdrom */
2578ctl_table cdrom_table[] = {
2579        {DEV_CDROM_INFO, "info", &cdrom_sysctl_settings.info, 
2580                CDROM_STR_SIZE, 0444, NULL, &cdrom_sysctl_info},
2581        {DEV_CDROM_AUTOCLOSE, "autoclose", &cdrom_sysctl_settings.autoclose,
2582                sizeof(int), 0644, NULL, &cdrom_sysctl_handler },
2583        {DEV_CDROM_AUTOEJECT, "autoeject", &cdrom_sysctl_settings.autoeject,
2584                sizeof(int), 0644, NULL, &cdrom_sysctl_handler },
2585        {DEV_CDROM_DEBUG, "debug", &cdrom_sysctl_settings.debug,
2586                sizeof(int), 0644, NULL, &cdrom_sysctl_handler },
2587        {DEV_CDROM_LOCK, "lock", &cdrom_sysctl_settings.lock,
2588                sizeof(int), 0644, NULL, &cdrom_sysctl_handler },
2589        {DEV_CDROM_CHECK_MEDIA, "check_media", &cdrom_sysctl_settings.check,
2590                sizeof(int), 0644, NULL, &cdrom_sysctl_handler },
2591        {0}
2592        };
2593
2594ctl_table cdrom_cdrom_table[] = {
2595        {DEV_CDROM, "cdrom", NULL, 0, 0555, cdrom_table},
2596        {0}
2597        };
2598
2599/* Make sure that /proc/sys/dev is there */
2600ctl_table cdrom_root_table[] = {
2601#ifdef CONFIG_PROC_FS
2602        {CTL_DEV, "dev", NULL, 0, 0555, cdrom_cdrom_table},
2603#endif /* CONFIG_PROC_FS */
2604        {0}
2605        };
2606static struct ctl_table_header *cdrom_sysctl_header;
2607
2608static void cdrom_sysctl_register(void)
2609{
2610        static int initialized;
2611
2612        if (initialized == 1)
2613                return;
2614
2615        cdrom_sysctl_header = register_sysctl_table(cdrom_root_table, 1);
2616        cdrom_root_table->child->de->owner = THIS_MODULE;
2617
2618        /* set the defaults */
2619        cdrom_sysctl_settings.autoclose = autoclose;
2620        cdrom_sysctl_settings.autoeject = autoeject;
2621        cdrom_sysctl_settings.debug = debug;
2622        cdrom_sysctl_settings.lock = lockdoor;
2623        cdrom_sysctl_settings.check = check_media_type;
2624
2625        initialized = 1;
2626}
2627
2628static void cdrom_sysctl_unregister(void)
2629{
2630        if (cdrom_sysctl_header)
2631                unregister_sysctl_table(cdrom_sysctl_header);
2632}
2633
2634#endif /* CONFIG_SYSCTL */
2635
2636static int __init cdrom_init(void)
2637{
2638#ifdef CONFIG_SYSCTL
2639        cdrom_sysctl_register();
2640#endif
2641        if (!devfs_handle)
2642                devfs_handle = devfs_mk_dir(NULL, "cdroms", NULL);
2643        return 0;
2644}
2645
2646static void __exit cdrom_exit(void)
2647{
2648        printk(KERN_INFO "Uniform CD-ROM driver unloaded\n");
2649#ifdef CONFIG_SYSCTL
2650        cdrom_sysctl_unregister();
2651#endif
2652        devfs_unregister(devfs_handle);
2653}
2654
2655module_init(cdrom_init);
2656module_exit(cdrom_exit);
2657MODULE_LICENSE("GPL");
2658
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.