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