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