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