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