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