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