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