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