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