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