root/drivers/cdrom/cdrom.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. cdrom_dummy_generic_packet
  2. cdrom_flush_cache
  3. cdrom_get_disc_info
  4. cdrom_mrw_probe_pc
  5. cdrom_is_mrw
  6. cdrom_mrw_bgformat
  7. cdrom_mrw_bgformat_susp
  8. cdrom_mrw_exit
  9. cdrom_mrw_set_lba_space
  10. register_cdrom
  11. unregister_cdrom
  12. cdrom_get_media_event
  13. cdrom_get_random_writable
  14. cdrom_has_defect_mgt
  15. cdrom_is_random_writable
  16. cdrom_media_erasable
  17. cdrom_dvdram_open_write
  18. cdrom_mrw_open_write
  19. mo_open_write
  20. cdrom_ram_open_write
  21. cdrom_mmc3_profile
  22. cdrom_is_dvd_rw
  23. cdrom_open_write
  24. cdrom_dvd_rw_close_write
  25. cdrom_close_write
  26. cdrom_count_tracks
  27. open_for_data
  28. cdrom_open
  29. check_for_audio_disc
  30. cdrom_release
  31. cdrom_read_mech_status
  32. cdrom_slot_status
  33. cdrom_number_of_slots
  34. cdrom_load_unload
  35. cdrom_select_disc
  36. cdrom_update_events
  37. cdrom_check_events
  38. media_changed
  39. cdrom_media_changed
  40. sanitize_format
  41. init_cdrom_command
  42. setup_report_key
  43. setup_send_key
  44. dvd_do_auth
  45. dvd_read_physical
  46. dvd_read_copyright
  47. dvd_read_disckey
  48. dvd_read_bca
  49. dvd_read_manufact
  50. dvd_read_struct
  51. cdrom_mode_sense
  52. cdrom_mode_select
  53. cdrom_read_subchannel
  54. cdrom_read_cd
  55. cdrom_read_block
  56. cdrom_read_cdda_old
  57. cdrom_read_cdda_bpc
  58. cdrom_read_cdda
  59. cdrom_ioctl_multisession
  60. cdrom_ioctl_eject
  61. cdrom_ioctl_closetray
  62. cdrom_ioctl_eject_sw
  63. cdrom_ioctl_media_changed
  64. cdrom_ioctl_set_options
  65. cdrom_ioctl_clear_options
  66. cdrom_ioctl_select_speed
  67. cdrom_ioctl_select_disc
  68. cdrom_ioctl_reset
  69. cdrom_ioctl_lock_door
  70. cdrom_ioctl_debug
  71. cdrom_ioctl_get_capability
  72. cdrom_ioctl_get_mcn
  73. cdrom_ioctl_drive_status
  74. cdrom_ioctl_disc_status
  75. cdrom_ioctl_changer_nslots
  76. cdrom_ioctl_get_subchnl
  77. cdrom_ioctl_read_tochdr
  78. cdrom_ioctl_read_tocentry
  79. cdrom_ioctl_play_msf
  80. cdrom_ioctl_play_trkind
  81. cdrom_ioctl_volctrl
  82. cdrom_ioctl_volread
  83. cdrom_ioctl_audioctl
  84. cdrom_switch_blocksize
  85. cdrom_get_track_info
  86. cdrom_get_last_written
  87. cdrom_get_next_writable
  88. mmc_ioctl_cdrom_read_data
  89. mmc_ioctl_cdrom_read_audio
  90. mmc_ioctl_cdrom_subchannel
  91. mmc_ioctl_cdrom_play_msf
  92. mmc_ioctl_cdrom_play_blk
  93. mmc_ioctl_cdrom_volume
  94. mmc_ioctl_cdrom_start_stop
  95. mmc_ioctl_cdrom_pause_resume
  96. mmc_ioctl_dvd_read_struct
  97. mmc_ioctl_dvd_auth
  98. mmc_ioctl_cdrom_next_writable
  99. mmc_ioctl_cdrom_last_written
  100. mmc_ioctl
  101. cdrom_ioctl
  102. cdrom_print_info
  103. cdrom_sysctl_info
  104. cdrom_update_settings
  105. cdrom_sysctl_handler
  106. cdrom_sysctl_register
  107. cdrom_sysctl_unregister
  108. cdrom_sysctl_register
  109. cdrom_sysctl_unregister
  110. cdrom_init
  111. cdrom_exit

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

/* [<][>][^][v][top][bottom][index][help] */