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