xref: /linux/drivers/cdrom/cdrom.c (revision 7265706c8fd57722f622f336ec110cb35f83e739)
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 	/* Grab the TOC header so we can see how many tracks there are */
1440 	if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header))) {
1441 		if (ret == -ENOMEDIUM)
1442 			tracks->error = CDS_NO_DISC;
1443 		else
1444 			tracks->error = CDS_NO_INFO;
1445 		return;
1446 	}
1447 	/* check what type of tracks are on this disc */
1448 	entry.cdte_format = CDROM_MSF;
1449 	for (i = header.cdth_trk0; i <= header.cdth_trk1; i++) {
1450 		entry.cdte_track  = i;
1451 		if (cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &entry)) {
1452 			tracks->error=CDS_NO_INFO;
1453 			return;
1454 		}
1455 		if (entry.cdte_ctrl & CDROM_DATA_TRACK) {
1456 		    if (entry.cdte_format == 0x10)
1457 			tracks->cdi++;
1458 		    else if (entry.cdte_format == 0x20)
1459 			tracks->xa++;
1460 		    else
1461 			tracks->data++;
1462 		} else
1463 		    tracks->audio++;
1464 		cdinfo(CD_COUNT_TRACKS, "track %d: format=%d, ctrl=%d\n",
1465 		       i, entry.cdte_format, entry.cdte_ctrl);
1466 	}
1467 	cdinfo(CD_COUNT_TRACKS, "disc has %d tracks: %d=audio %d=data %d=Cd-I %d=XA\n",
1468 		header.cdth_trk1, tracks->audio, tracks->data,
1469 		tracks->cdi, tracks->xa);
1470 }
1471 
1472 /* Requests to the low-level drivers will /always/ be done in the
1473    following format convention:
1474 
1475    CDROM_LBA: all data-related requests.
1476    CDROM_MSF: all audio-related requests.
1477 
1478    However, a low-level implementation is allowed to refuse this
1479    request, and return information in its own favorite format.
1480 
1481    It doesn't make sense /at all/ to ask for a play_audio in LBA
1482    format, or ask for multi-session info in MSF format. However, for
1483    backward compatibility these format requests will be satisfied, but
1484    the requests to the low-level drivers will be sanitized in the more
1485    meaningful format indicated above.
1486  */
1487 
1488 static
1489 void sanitize_format(union cdrom_addr *addr,
1490 		     u_char * curr, u_char requested)
1491 {
1492 	if (*curr == requested)
1493 		return;                 /* nothing to be done! */
1494 	if (requested == CDROM_LBA) {
1495 		addr->lba = (int) addr->msf.frame +
1496 			75 * (addr->msf.second - 2 + 60 * addr->msf.minute);
1497 	} else {                        /* CDROM_MSF */
1498 		int lba = addr->lba;
1499 		addr->msf.frame = lba % 75;
1500 		lba /= 75;
1501 		lba += 2;
1502 		addr->msf.second = lba % 60;
1503 		addr->msf.minute = lba / 60;
1504 	}
1505 	*curr = requested;
1506 }
1507 
1508 void init_cdrom_command(struct packet_command *cgc, void *buf, int len,
1509 			int type)
1510 {
1511 	memset(cgc, 0, sizeof(struct packet_command));
1512 	if (buf)
1513 		memset(buf, 0, len);
1514 	cgc->buffer = (char *) buf;
1515 	cgc->buflen = len;
1516 	cgc->data_direction = type;
1517 	cgc->timeout = CDROM_DEF_TIMEOUT;
1518 }
1519 
1520 /* DVD handling */
1521 
1522 #define copy_key(dest,src)	memcpy((dest), (src), sizeof(dvd_key))
1523 #define copy_chal(dest,src)	memcpy((dest), (src), sizeof(dvd_challenge))
1524 
1525 static void setup_report_key(struct packet_command *cgc, unsigned agid, unsigned type)
1526 {
1527 	cgc->cmd[0] = GPCMD_REPORT_KEY;
1528 	cgc->cmd[10] = type | (agid << 6);
1529 	switch (type) {
1530 		case 0: case 8: case 5: {
1531 			cgc->buflen = 8;
1532 			break;
1533 		}
1534 		case 1: {
1535 			cgc->buflen = 16;
1536 			break;
1537 		}
1538 		case 2: case 4: {
1539 			cgc->buflen = 12;
1540 			break;
1541 		}
1542 	}
1543 	cgc->cmd[9] = cgc->buflen;
1544 	cgc->data_direction = CGC_DATA_READ;
1545 }
1546 
1547 static void setup_send_key(struct packet_command *cgc, unsigned agid, unsigned type)
1548 {
1549 	cgc->cmd[0] = GPCMD_SEND_KEY;
1550 	cgc->cmd[10] = type | (agid << 6);
1551 	switch (type) {
1552 		case 1: {
1553 			cgc->buflen = 16;
1554 			break;
1555 		}
1556 		case 3: {
1557 			cgc->buflen = 12;
1558 			break;
1559 		}
1560 		case 6: {
1561 			cgc->buflen = 8;
1562 			break;
1563 		}
1564 	}
1565 	cgc->cmd[9] = cgc->buflen;
1566 	cgc->data_direction = CGC_DATA_WRITE;
1567 }
1568 
1569 static int dvd_do_auth(struct cdrom_device_info *cdi, dvd_authinfo *ai)
1570 {
1571 	int ret;
1572 	u_char buf[20];
1573 	struct packet_command cgc;
1574 	struct cdrom_device_ops *cdo = cdi->ops;
1575 	rpc_state_t rpc_state;
1576 
1577 	memset(buf, 0, sizeof(buf));
1578 	init_cdrom_command(&cgc, buf, 0, CGC_DATA_READ);
1579 
1580 	switch (ai->type) {
1581 	/* LU data send */
1582 	case DVD_LU_SEND_AGID:
1583 		cdinfo(CD_DVD, "entering DVD_LU_SEND_AGID\n");
1584 		cgc.quiet = 1;
1585 		setup_report_key(&cgc, ai->lsa.agid, 0);
1586 
1587 		if ((ret = cdo->generic_packet(cdi, &cgc)))
1588 			return ret;
1589 
1590 		ai->lsa.agid = buf[7] >> 6;
1591 		/* Returning data, let host change state */
1592 		break;
1593 
1594 	case DVD_LU_SEND_KEY1:
1595 		cdinfo(CD_DVD, "entering DVD_LU_SEND_KEY1\n");
1596 		setup_report_key(&cgc, ai->lsk.agid, 2);
1597 
1598 		if ((ret = cdo->generic_packet(cdi, &cgc)))
1599 			return ret;
1600 
1601 		copy_key(ai->lsk.key, &buf[4]);
1602 		/* Returning data, let host change state */
1603 		break;
1604 
1605 	case DVD_LU_SEND_CHALLENGE:
1606 		cdinfo(CD_DVD, "entering DVD_LU_SEND_CHALLENGE\n");
1607 		setup_report_key(&cgc, ai->lsc.agid, 1);
1608 
1609 		if ((ret = cdo->generic_packet(cdi, &cgc)))
1610 			return ret;
1611 
1612 		copy_chal(ai->lsc.chal, &buf[4]);
1613 		/* Returning data, let host change state */
1614 		break;
1615 
1616 	/* Post-auth key */
1617 	case DVD_LU_SEND_TITLE_KEY:
1618 		cdinfo(CD_DVD, "entering DVD_LU_SEND_TITLE_KEY\n");
1619 		cgc.quiet = 1;
1620 		setup_report_key(&cgc, ai->lstk.agid, 4);
1621 		cgc.cmd[5] = ai->lstk.lba;
1622 		cgc.cmd[4] = ai->lstk.lba >> 8;
1623 		cgc.cmd[3] = ai->lstk.lba >> 16;
1624 		cgc.cmd[2] = ai->lstk.lba >> 24;
1625 
1626 		if ((ret = cdo->generic_packet(cdi, &cgc)))
1627 			return ret;
1628 
1629 		ai->lstk.cpm = (buf[4] >> 7) & 1;
1630 		ai->lstk.cp_sec = (buf[4] >> 6) & 1;
1631 		ai->lstk.cgms = (buf[4] >> 4) & 3;
1632 		copy_key(ai->lstk.title_key, &buf[5]);
1633 		/* Returning data, let host change state */
1634 		break;
1635 
1636 	case DVD_LU_SEND_ASF:
1637 		cdinfo(CD_DVD, "entering DVD_LU_SEND_ASF\n");
1638 		setup_report_key(&cgc, ai->lsasf.agid, 5);
1639 
1640 		if ((ret = cdo->generic_packet(cdi, &cgc)))
1641 			return ret;
1642 
1643 		ai->lsasf.asf = buf[7] & 1;
1644 		break;
1645 
1646 	/* LU data receive (LU changes state) */
1647 	case DVD_HOST_SEND_CHALLENGE:
1648 		cdinfo(CD_DVD, "entering DVD_HOST_SEND_CHALLENGE\n");
1649 		setup_send_key(&cgc, ai->hsc.agid, 1);
1650 		buf[1] = 0xe;
1651 		copy_chal(&buf[4], ai->hsc.chal);
1652 
1653 		if ((ret = cdo->generic_packet(cdi, &cgc)))
1654 			return ret;
1655 
1656 		ai->type = DVD_LU_SEND_KEY1;
1657 		break;
1658 
1659 	case DVD_HOST_SEND_KEY2:
1660 		cdinfo(CD_DVD, "entering DVD_HOST_SEND_KEY2\n");
1661 		setup_send_key(&cgc, ai->hsk.agid, 3);
1662 		buf[1] = 0xa;
1663 		copy_key(&buf[4], ai->hsk.key);
1664 
1665 		if ((ret = cdo->generic_packet(cdi, &cgc))) {
1666 			ai->type = DVD_AUTH_FAILURE;
1667 			return ret;
1668 		}
1669 		ai->type = DVD_AUTH_ESTABLISHED;
1670 		break;
1671 
1672 	/* Misc */
1673 	case DVD_INVALIDATE_AGID:
1674 		cgc.quiet = 1;
1675 		cdinfo(CD_DVD, "entering DVD_INVALIDATE_AGID\n");
1676 		setup_report_key(&cgc, ai->lsa.agid, 0x3f);
1677 		if ((ret = cdo->generic_packet(cdi, &cgc)))
1678 			return ret;
1679 		break;
1680 
1681 	/* Get region settings */
1682 	case DVD_LU_SEND_RPC_STATE:
1683 		cdinfo(CD_DVD, "entering DVD_LU_SEND_RPC_STATE\n");
1684 		setup_report_key(&cgc, 0, 8);
1685 		memset(&rpc_state, 0, sizeof(rpc_state_t));
1686 		cgc.buffer = (char *) &rpc_state;
1687 
1688 		if ((ret = cdo->generic_packet(cdi, &cgc)))
1689 			return ret;
1690 
1691 		ai->lrpcs.type = rpc_state.type_code;
1692 		ai->lrpcs.vra = rpc_state.vra;
1693 		ai->lrpcs.ucca = rpc_state.ucca;
1694 		ai->lrpcs.region_mask = rpc_state.region_mask;
1695 		ai->lrpcs.rpc_scheme = rpc_state.rpc_scheme;
1696 		break;
1697 
1698 	/* Set region settings */
1699 	case DVD_HOST_SEND_RPC_STATE:
1700 		cdinfo(CD_DVD, "entering DVD_HOST_SEND_RPC_STATE\n");
1701 		setup_send_key(&cgc, 0, 6);
1702 		buf[1] = 6;
1703 		buf[4] = ai->hrpcs.pdrc;
1704 
1705 		if ((ret = cdo->generic_packet(cdi, &cgc)))
1706 			return ret;
1707 		break;
1708 
1709 	default:
1710 		cdinfo(CD_WARNING, "Invalid DVD key ioctl (%d)\n", ai->type);
1711 		return -ENOTTY;
1712 	}
1713 
1714 	return 0;
1715 }
1716 
1717 static int dvd_read_physical(struct cdrom_device_info *cdi, dvd_struct *s)
1718 {
1719 	unsigned char buf[21], *base;
1720 	struct dvd_layer *layer;
1721 	struct packet_command cgc;
1722 	struct cdrom_device_ops *cdo = cdi->ops;
1723 	int ret, layer_num = s->physical.layer_num;
1724 
1725 	if (layer_num >= DVD_LAYERS)
1726 		return -EINVAL;
1727 
1728 	init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ);
1729 	cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1730 	cgc.cmd[6] = layer_num;
1731 	cgc.cmd[7] = s->type;
1732 	cgc.cmd[9] = cgc.buflen & 0xff;
1733 
1734 	/*
1735 	 * refrain from reporting errors on non-existing layers (mainly)
1736 	 */
1737 	cgc.quiet = 1;
1738 
1739 	if ((ret = cdo->generic_packet(cdi, &cgc)))
1740 		return ret;
1741 
1742 	base = &buf[4];
1743 	layer = &s->physical.layer[layer_num];
1744 
1745 	/*
1746 	 * place the data... really ugly, but at least we won't have to
1747 	 * worry about endianess in userspace.
1748 	 */
1749 	memset(layer, 0, sizeof(*layer));
1750 	layer->book_version = base[0] & 0xf;
1751 	layer->book_type = base[0] >> 4;
1752 	layer->min_rate = base[1] & 0xf;
1753 	layer->disc_size = base[1] >> 4;
1754 	layer->layer_type = base[2] & 0xf;
1755 	layer->track_path = (base[2] >> 4) & 1;
1756 	layer->nlayers = (base[2] >> 5) & 3;
1757 	layer->track_density = base[3] & 0xf;
1758 	layer->linear_density = base[3] >> 4;
1759 	layer->start_sector = base[5] << 16 | base[6] << 8 | base[7];
1760 	layer->end_sector = base[9] << 16 | base[10] << 8 | base[11];
1761 	layer->end_sector_l0 = base[13] << 16 | base[14] << 8 | base[15];
1762 	layer->bca = base[16] >> 7;
1763 
1764 	return 0;
1765 }
1766 
1767 static int dvd_read_copyright(struct cdrom_device_info *cdi, dvd_struct *s)
1768 {
1769 	int ret;
1770 	u_char buf[8];
1771 	struct packet_command cgc;
1772 	struct cdrom_device_ops *cdo = cdi->ops;
1773 
1774 	init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ);
1775 	cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1776 	cgc.cmd[6] = s->copyright.layer_num;
1777 	cgc.cmd[7] = s->type;
1778 	cgc.cmd[8] = cgc.buflen >> 8;
1779 	cgc.cmd[9] = cgc.buflen & 0xff;
1780 
1781 	if ((ret = cdo->generic_packet(cdi, &cgc)))
1782 		return ret;
1783 
1784 	s->copyright.cpst = buf[4];
1785 	s->copyright.rmi = buf[5];
1786 
1787 	return 0;
1788 }
1789 
1790 static int dvd_read_disckey(struct cdrom_device_info *cdi, dvd_struct *s)
1791 {
1792 	int ret, size;
1793 	u_char *buf;
1794 	struct packet_command cgc;
1795 	struct cdrom_device_ops *cdo = cdi->ops;
1796 
1797 	size = sizeof(s->disckey.value) + 4;
1798 
1799 	if ((buf = kmalloc(size, GFP_KERNEL)) == NULL)
1800 		return -ENOMEM;
1801 
1802 	init_cdrom_command(&cgc, buf, size, CGC_DATA_READ);
1803 	cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1804 	cgc.cmd[7] = s->type;
1805 	cgc.cmd[8] = size >> 8;
1806 	cgc.cmd[9] = size & 0xff;
1807 	cgc.cmd[10] = s->disckey.agid << 6;
1808 
1809 	if (!(ret = cdo->generic_packet(cdi, &cgc)))
1810 		memcpy(s->disckey.value, &buf[4], sizeof(s->disckey.value));
1811 
1812 	kfree(buf);
1813 	return ret;
1814 }
1815 
1816 static int dvd_read_bca(struct cdrom_device_info *cdi, dvd_struct *s)
1817 {
1818 	int ret;
1819 	u_char buf[4 + 188];
1820 	struct packet_command cgc;
1821 	struct cdrom_device_ops *cdo = cdi->ops;
1822 
1823 	init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ);
1824 	cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1825 	cgc.cmd[7] = s->type;
1826 	cgc.cmd[9] = cgc.buflen & 0xff;
1827 
1828 	if ((ret = cdo->generic_packet(cdi, &cgc)))
1829 		return ret;
1830 
1831 	s->bca.len = buf[0] << 8 | buf[1];
1832 	if (s->bca.len < 12 || s->bca.len > 188) {
1833 		cdinfo(CD_WARNING, "Received invalid BCA length (%d)\n", s->bca.len);
1834 		return -EIO;
1835 	}
1836 	memcpy(s->bca.value, &buf[4], s->bca.len);
1837 
1838 	return 0;
1839 }
1840 
1841 static int dvd_read_manufact(struct cdrom_device_info *cdi, dvd_struct *s)
1842 {
1843 	int ret = 0, size;
1844 	u_char *buf;
1845 	struct packet_command cgc;
1846 	struct cdrom_device_ops *cdo = cdi->ops;
1847 
1848 	size = sizeof(s->manufact.value) + 4;
1849 
1850 	if ((buf = kmalloc(size, GFP_KERNEL)) == NULL)
1851 		return -ENOMEM;
1852 
1853 	init_cdrom_command(&cgc, buf, size, CGC_DATA_READ);
1854 	cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1855 	cgc.cmd[7] = s->type;
1856 	cgc.cmd[8] = size >> 8;
1857 	cgc.cmd[9] = size & 0xff;
1858 
1859 	if ((ret = cdo->generic_packet(cdi, &cgc))) {
1860 		kfree(buf);
1861 		return ret;
1862 	}
1863 
1864 	s->manufact.len = buf[0] << 8 | buf[1];
1865 	if (s->manufact.len < 0 || s->manufact.len > 2048) {
1866 		cdinfo(CD_WARNING, "Received invalid manufacture info length"
1867 				   " (%d)\n", s->manufact.len);
1868 		ret = -EIO;
1869 	} else {
1870 		memcpy(s->manufact.value, &buf[4], s->manufact.len);
1871 	}
1872 
1873 	kfree(buf);
1874 	return ret;
1875 }
1876 
1877 static int dvd_read_struct(struct cdrom_device_info *cdi, dvd_struct *s)
1878 {
1879 	switch (s->type) {
1880 	case DVD_STRUCT_PHYSICAL:
1881 		return dvd_read_physical(cdi, s);
1882 
1883 	case DVD_STRUCT_COPYRIGHT:
1884 		return dvd_read_copyright(cdi, s);
1885 
1886 	case DVD_STRUCT_DISCKEY:
1887 		return dvd_read_disckey(cdi, s);
1888 
1889 	case DVD_STRUCT_BCA:
1890 		return dvd_read_bca(cdi, s);
1891 
1892 	case DVD_STRUCT_MANUFACT:
1893 		return dvd_read_manufact(cdi, s);
1894 
1895 	default:
1896 		cdinfo(CD_WARNING, ": Invalid DVD structure read requested (%d)\n",
1897 					s->type);
1898 		return -EINVAL;
1899 	}
1900 }
1901 
1902 int cdrom_mode_sense(struct cdrom_device_info *cdi,
1903 		     struct packet_command *cgc,
1904 		     int page_code, int page_control)
1905 {
1906 	struct cdrom_device_ops *cdo = cdi->ops;
1907 
1908 	memset(cgc->cmd, 0, sizeof(cgc->cmd));
1909 
1910 	cgc->cmd[0] = GPCMD_MODE_SENSE_10;
1911 	cgc->cmd[2] = page_code | (page_control << 6);
1912 	cgc->cmd[7] = cgc->buflen >> 8;
1913 	cgc->cmd[8] = cgc->buflen & 0xff;
1914 	cgc->data_direction = CGC_DATA_READ;
1915 	return cdo->generic_packet(cdi, cgc);
1916 }
1917 
1918 int cdrom_mode_select(struct cdrom_device_info *cdi,
1919 		      struct packet_command *cgc)
1920 {
1921 	struct cdrom_device_ops *cdo = cdi->ops;
1922 
1923 	memset(cgc->cmd, 0, sizeof(cgc->cmd));
1924 	memset(cgc->buffer, 0, 2);
1925 	cgc->cmd[0] = GPCMD_MODE_SELECT_10;
1926 	cgc->cmd[1] = 0x10;		/* PF */
1927 	cgc->cmd[7] = cgc->buflen >> 8;
1928 	cgc->cmd[8] = cgc->buflen & 0xff;
1929 	cgc->data_direction = CGC_DATA_WRITE;
1930 	return cdo->generic_packet(cdi, cgc);
1931 }
1932 
1933 static int cdrom_read_subchannel(struct cdrom_device_info *cdi,
1934 				 struct cdrom_subchnl *subchnl, int mcn)
1935 {
1936 	struct cdrom_device_ops *cdo = cdi->ops;
1937 	struct packet_command cgc;
1938 	char buffer[32];
1939 	int ret;
1940 
1941 	init_cdrom_command(&cgc, buffer, 16, CGC_DATA_READ);
1942 	cgc.cmd[0] = GPCMD_READ_SUBCHANNEL;
1943 	cgc.cmd[1] = 2;     /* MSF addressing */
1944 	cgc.cmd[2] = 0x40;  /* request subQ data */
1945 	cgc.cmd[3] = mcn ? 2 : 1;
1946 	cgc.cmd[8] = 16;
1947 
1948 	if ((ret = cdo->generic_packet(cdi, &cgc)))
1949 		return ret;
1950 
1951 	subchnl->cdsc_audiostatus = cgc.buffer[1];
1952 	subchnl->cdsc_format = CDROM_MSF;
1953 	subchnl->cdsc_ctrl = cgc.buffer[5] & 0xf;
1954 	subchnl->cdsc_trk = cgc.buffer[6];
1955 	subchnl->cdsc_ind = cgc.buffer[7];
1956 
1957 	subchnl->cdsc_reladdr.msf.minute = cgc.buffer[13];
1958 	subchnl->cdsc_reladdr.msf.second = cgc.buffer[14];
1959 	subchnl->cdsc_reladdr.msf.frame = cgc.buffer[15];
1960 	subchnl->cdsc_absaddr.msf.minute = cgc.buffer[9];
1961 	subchnl->cdsc_absaddr.msf.second = cgc.buffer[10];
1962 	subchnl->cdsc_absaddr.msf.frame = cgc.buffer[11];
1963 
1964 	return 0;
1965 }
1966 
1967 /*
1968  * Specific READ_10 interface
1969  */
1970 static int cdrom_read_cd(struct cdrom_device_info *cdi,
1971 			 struct packet_command *cgc, int lba,
1972 			 int blocksize, int nblocks)
1973 {
1974 	struct cdrom_device_ops *cdo = cdi->ops;
1975 
1976 	memset(&cgc->cmd, 0, sizeof(cgc->cmd));
1977 	cgc->cmd[0] = GPCMD_READ_10;
1978 	cgc->cmd[2] = (lba >> 24) & 0xff;
1979 	cgc->cmd[3] = (lba >> 16) & 0xff;
1980 	cgc->cmd[4] = (lba >>  8) & 0xff;
1981 	cgc->cmd[5] = lba & 0xff;
1982 	cgc->cmd[6] = (nblocks >> 16) & 0xff;
1983 	cgc->cmd[7] = (nblocks >>  8) & 0xff;
1984 	cgc->cmd[8] = nblocks & 0xff;
1985 	cgc->buflen = blocksize * nblocks;
1986 	return cdo->generic_packet(cdi, cgc);
1987 }
1988 
1989 /* very generic interface for reading the various types of blocks */
1990 static int cdrom_read_block(struct cdrom_device_info *cdi,
1991 			    struct packet_command *cgc,
1992 			    int lba, int nblocks, int format, int blksize)
1993 {
1994 	struct cdrom_device_ops *cdo = cdi->ops;
1995 
1996 	memset(&cgc->cmd, 0, sizeof(cgc->cmd));
1997 	cgc->cmd[0] = GPCMD_READ_CD;
1998 	/* expected sector size - cdda,mode1,etc. */
1999 	cgc->cmd[1] = format << 2;
2000 	/* starting address */
2001 	cgc->cmd[2] = (lba >> 24) & 0xff;
2002 	cgc->cmd[3] = (lba >> 16) & 0xff;
2003 	cgc->cmd[4] = (lba >>  8) & 0xff;
2004 	cgc->cmd[5] = lba & 0xff;
2005 	/* number of blocks */
2006 	cgc->cmd[6] = (nblocks >> 16) & 0xff;
2007 	cgc->cmd[7] = (nblocks >>  8) & 0xff;
2008 	cgc->cmd[8] = nblocks & 0xff;
2009 	cgc->buflen = blksize * nblocks;
2010 
2011 	/* set the header info returned */
2012 	switch (blksize) {
2013 	case CD_FRAMESIZE_RAW0	: cgc->cmd[9] = 0x58; break;
2014 	case CD_FRAMESIZE_RAW1	: cgc->cmd[9] = 0x78; break;
2015 	case CD_FRAMESIZE_RAW	: cgc->cmd[9] = 0xf8; break;
2016 	default			: cgc->cmd[9] = 0x10;
2017 	}
2018 
2019 	return cdo->generic_packet(cdi, cgc);
2020 }
2021 
2022 static int cdrom_read_cdda_old(struct cdrom_device_info *cdi, __u8 __user *ubuf,
2023 			       int lba, int nframes)
2024 {
2025 	struct packet_command cgc;
2026 	int ret = 0;
2027 	int nr;
2028 
2029 	cdi->last_sense = 0;
2030 
2031 	memset(&cgc, 0, sizeof(cgc));
2032 
2033 	/*
2034 	 * start with will ra.nframes size, back down if alloc fails
2035 	 */
2036 	nr = nframes;
2037 	do {
2038 		cgc.buffer = kmalloc(CD_FRAMESIZE_RAW * nr, GFP_KERNEL);
2039 		if (cgc.buffer)
2040 			break;
2041 
2042 		nr >>= 1;
2043 	} while (nr);
2044 
2045 	if (!nr)
2046 		return -ENOMEM;
2047 
2048 	if (!access_ok(VERIFY_WRITE, ubuf, nframes * CD_FRAMESIZE_RAW)) {
2049 		ret = -EFAULT;
2050 		goto out;
2051 	}
2052 
2053 	cgc.data_direction = CGC_DATA_READ;
2054 	while (nframes > 0) {
2055 		if (nr > nframes)
2056 			nr = nframes;
2057 
2058 		ret = cdrom_read_block(cdi, &cgc, lba, nr, 1, CD_FRAMESIZE_RAW);
2059 		if (ret)
2060 			break;
2061 		if (__copy_to_user(ubuf, cgc.buffer, CD_FRAMESIZE_RAW * nr)) {
2062 			ret = -EFAULT;
2063 			break;
2064 		}
2065 		ubuf += CD_FRAMESIZE_RAW * nr;
2066 		nframes -= nr;
2067 		lba += nr;
2068 	}
2069 out:
2070 	kfree(cgc.buffer);
2071 	return ret;
2072 }
2073 
2074 static int cdrom_read_cdda_bpc(struct cdrom_device_info *cdi, __u8 __user *ubuf,
2075 			       int lba, int nframes)
2076 {
2077 	struct request_queue *q = cdi->disk->queue;
2078 	struct request *rq;
2079 	struct bio *bio;
2080 	unsigned int len;
2081 	int nr, ret = 0;
2082 
2083 	if (!q)
2084 		return -ENXIO;
2085 
2086 	rq = blk_get_request(q, READ, GFP_KERNEL);
2087 	if (!rq)
2088 		return -ENOMEM;
2089 
2090 	cdi->last_sense = 0;
2091 
2092 	while (nframes) {
2093 		nr = nframes;
2094 		if (cdi->cdda_method == CDDA_BPC_SINGLE)
2095 			nr = 1;
2096 		if (nr * CD_FRAMESIZE_RAW > (q->max_sectors << 9))
2097 			nr = (q->max_sectors << 9) / CD_FRAMESIZE_RAW;
2098 
2099 		len = nr * CD_FRAMESIZE_RAW;
2100 
2101 		ret = blk_rq_map_user(q, rq, ubuf, len);
2102 		if (ret)
2103 			break;
2104 
2105 		rq->cmd[0] = GPCMD_READ_CD;
2106 		rq->cmd[1] = 1 << 2;
2107 		rq->cmd[2] = (lba >> 24) & 0xff;
2108 		rq->cmd[3] = (lba >> 16) & 0xff;
2109 		rq->cmd[4] = (lba >>  8) & 0xff;
2110 		rq->cmd[5] = lba & 0xff;
2111 		rq->cmd[6] = (nr >> 16) & 0xff;
2112 		rq->cmd[7] = (nr >>  8) & 0xff;
2113 		rq->cmd[8] = nr & 0xff;
2114 		rq->cmd[9] = 0xf8;
2115 
2116 		rq->cmd_len = 12;
2117 		rq->cmd_type = REQ_TYPE_BLOCK_PC;
2118 		rq->timeout = 60 * HZ;
2119 		bio = rq->bio;
2120 
2121 		if (blk_execute_rq(q, cdi->disk, rq, 0)) {
2122 			struct request_sense *s = rq->sense;
2123 			ret = -EIO;
2124 			cdi->last_sense = s->sense_key;
2125 		}
2126 
2127 		if (blk_rq_unmap_user(bio))
2128 			ret = -EFAULT;
2129 
2130 		if (ret)
2131 			break;
2132 
2133 		nframes -= nr;
2134 		lba += nr;
2135 		ubuf += len;
2136 	}
2137 
2138 	blk_put_request(rq);
2139 	return ret;
2140 }
2141 
2142 static int cdrom_read_cdda(struct cdrom_device_info *cdi, __u8 __user *ubuf,
2143 			   int lba, int nframes)
2144 {
2145 	int ret;
2146 
2147 	if (cdi->cdda_method == CDDA_OLD)
2148 		return cdrom_read_cdda_old(cdi, ubuf, lba, nframes);
2149 
2150 retry:
2151 	/*
2152 	 * for anything else than success and io error, we need to retry
2153 	 */
2154 	ret = cdrom_read_cdda_bpc(cdi, ubuf, lba, nframes);
2155 	if (!ret || ret != -EIO)
2156 		return ret;
2157 
2158 	/*
2159 	 * I've seen drives get sense 4/8/3 udma crc errors on multi
2160 	 * frame dma, so drop to single frame dma if we need to
2161 	 */
2162 	if (cdi->cdda_method == CDDA_BPC_FULL && nframes > 1) {
2163 		printk("cdrom: dropping to single frame dma\n");
2164 		cdi->cdda_method = CDDA_BPC_SINGLE;
2165 		goto retry;
2166 	}
2167 
2168 	/*
2169 	 * so we have an io error of some sort with multi frame dma. if the
2170 	 * condition wasn't a hardware error
2171 	 * problems, not for any error
2172 	 */
2173 	if (cdi->last_sense != 0x04 && cdi->last_sense != 0x0b)
2174 		return ret;
2175 
2176 	printk("cdrom: dropping to old style cdda (sense=%x)\n", cdi->last_sense);
2177 	cdi->cdda_method = CDDA_OLD;
2178 	return cdrom_read_cdda_old(cdi, ubuf, lba, nframes);
2179 }
2180 
2181 static int cdrom_ioctl_multisession(struct cdrom_device_info *cdi,
2182 		void __user *argp)
2183 {
2184 	struct cdrom_multisession ms_info;
2185 	u8 requested_format;
2186 	int ret;
2187 
2188 	cdinfo(CD_DO_IOCTL, "entering CDROMMULTISESSION\n");
2189 
2190 	if (!(cdi->ops->capability & CDC_MULTI_SESSION))
2191 		return -ENOSYS;
2192 
2193 	if (copy_from_user(&ms_info, argp, sizeof(ms_info)))
2194 		return -EFAULT;
2195 
2196 	requested_format = ms_info.addr_format;
2197 	if (requested_format != CDROM_MSF && requested_format != CDROM_LBA)
2198 		return -EINVAL;
2199 	ms_info.addr_format = CDROM_LBA;
2200 
2201 	ret = cdi->ops->get_last_session(cdi, &ms_info);
2202 	if (ret)
2203 		return ret;
2204 
2205 	sanitize_format(&ms_info.addr, &ms_info.addr_format, requested_format);
2206 
2207 	if (copy_to_user(argp, &ms_info, sizeof(ms_info)))
2208 		return -EFAULT;
2209 
2210 	cdinfo(CD_DO_IOCTL, "CDROMMULTISESSION successful\n");
2211 	return 0;
2212 }
2213 
2214 static int cdrom_ioctl_eject(struct cdrom_device_info *cdi)
2215 {
2216 	cdinfo(CD_DO_IOCTL, "entering CDROMEJECT\n");
2217 
2218 	if (!CDROM_CAN(CDC_OPEN_TRAY))
2219 		return -ENOSYS;
2220 	if (cdi->use_count != 1 || keeplocked)
2221 		return -EBUSY;
2222 	if (CDROM_CAN(CDC_LOCK)) {
2223 		int ret = cdi->ops->lock_door(cdi, 0);
2224 		if (ret)
2225 			return ret;
2226 	}
2227 
2228 	return cdi->ops->tray_move(cdi, 1);
2229 }
2230 
2231 static int cdrom_ioctl_closetray(struct cdrom_device_info *cdi)
2232 {
2233 	cdinfo(CD_DO_IOCTL, "entering CDROMCLOSETRAY\n");
2234 
2235 	if (!CDROM_CAN(CDC_CLOSE_TRAY))
2236 		return -ENOSYS;
2237 	return cdi->ops->tray_move(cdi, 0);
2238 }
2239 
2240 static int cdrom_ioctl_eject_sw(struct cdrom_device_info *cdi,
2241 		unsigned long arg)
2242 {
2243 	cdinfo(CD_DO_IOCTL, "entering CDROMEJECT_SW\n");
2244 
2245 	if (!CDROM_CAN(CDC_OPEN_TRAY))
2246 		return -ENOSYS;
2247 	if (keeplocked)
2248 		return -EBUSY;
2249 
2250 	cdi->options &= ~(CDO_AUTO_CLOSE | CDO_AUTO_EJECT);
2251 	if (arg)
2252 		cdi->options |= CDO_AUTO_CLOSE | CDO_AUTO_EJECT;
2253 	return 0;
2254 }
2255 
2256 static int cdrom_ioctl_media_changed(struct cdrom_device_info *cdi,
2257 		unsigned long arg)
2258 {
2259 	struct cdrom_changer_info *info;
2260 	int ret;
2261 
2262 	cdinfo(CD_DO_IOCTL, "entering CDROM_MEDIA_CHANGED\n");
2263 
2264 	if (!CDROM_CAN(CDC_MEDIA_CHANGED))
2265 		return -ENOSYS;
2266 
2267 	/* cannot select disc or select current disc */
2268 	if (!CDROM_CAN(CDC_SELECT_DISC) || arg == CDSL_CURRENT)
2269 		return media_changed(cdi, 1);
2270 
2271 	if ((unsigned int)arg >= cdi->capacity)
2272 		return -EINVAL;
2273 
2274 	info = kmalloc(sizeof(*info), GFP_KERNEL);
2275 	if (!info)
2276 		return -ENOMEM;
2277 
2278 	ret = cdrom_read_mech_status(cdi, info);
2279 	if (!ret)
2280 		ret = info->slots[arg].change;
2281 	kfree(info);
2282 	return ret;
2283 }
2284 
2285 static int cdrom_ioctl_set_options(struct cdrom_device_info *cdi,
2286 		unsigned long arg)
2287 {
2288 	cdinfo(CD_DO_IOCTL, "entering CDROM_SET_OPTIONS\n");
2289 
2290 	/*
2291 	 * Options need to be in sync with capability.
2292 	 * Too late for that, so we have to check each one separately.
2293 	 */
2294 	switch (arg) {
2295 	case CDO_USE_FFLAGS:
2296 	case CDO_CHECK_TYPE:
2297 		break;
2298 	case CDO_LOCK:
2299 		if (!CDROM_CAN(CDC_LOCK))
2300 			return -ENOSYS;
2301 		break;
2302 	case 0:
2303 		return cdi->options;
2304 	/* default is basically CDO_[AUTO_CLOSE|AUTO_EJECT] */
2305 	default:
2306 		if (!CDROM_CAN(arg))
2307 			return -ENOSYS;
2308 	}
2309 	cdi->options |= (int) arg;
2310 	return cdi->options;
2311 }
2312 
2313 static int cdrom_ioctl_clear_options(struct cdrom_device_info *cdi,
2314 		unsigned long arg)
2315 {
2316 	cdinfo(CD_DO_IOCTL, "entering CDROM_CLEAR_OPTIONS\n");
2317 
2318 	cdi->options &= ~(int) arg;
2319 	return cdi->options;
2320 }
2321 
2322 static int cdrom_ioctl_select_speed(struct cdrom_device_info *cdi,
2323 		unsigned long arg)
2324 {
2325 	cdinfo(CD_DO_IOCTL, "entering CDROM_SELECT_SPEED\n");
2326 
2327 	if (!CDROM_CAN(CDC_SELECT_SPEED))
2328 		return -ENOSYS;
2329 	return cdi->ops->select_speed(cdi, arg);
2330 }
2331 
2332 static int cdrom_ioctl_select_disc(struct cdrom_device_info *cdi,
2333 		unsigned long arg)
2334 {
2335 	cdinfo(CD_DO_IOCTL, "entering CDROM_SELECT_DISC\n");
2336 
2337 	if (!CDROM_CAN(CDC_SELECT_DISC))
2338 		return -ENOSYS;
2339 
2340 	if (arg != CDSL_CURRENT && arg != CDSL_NONE) {
2341 		if ((int)arg >= cdi->capacity)
2342 			return -EINVAL;
2343 	}
2344 
2345 	/*
2346 	 * ->select_disc is a hook to allow a driver-specific way of
2347 	 * seleting disc.  However, since there is no equivalent hook for
2348 	 * cdrom_slot_status this may not actually be useful...
2349 	 */
2350 	if (cdi->ops->select_disc)
2351 		return cdi->ops->select_disc(cdi, arg);
2352 
2353 	cdinfo(CD_CHANGER, "Using generic cdrom_select_disc()\n");
2354 	return cdrom_select_disc(cdi, arg);
2355 }
2356 
2357 static int cdrom_ioctl_reset(struct cdrom_device_info *cdi,
2358 		struct block_device *bdev)
2359 {
2360 	cdinfo(CD_DO_IOCTL, "entering CDROM_RESET\n");
2361 
2362 	if (!capable(CAP_SYS_ADMIN))
2363 		return -EACCES;
2364 	if (!CDROM_CAN(CDC_RESET))
2365 		return -ENOSYS;
2366 	invalidate_bdev(bdev);
2367 	return cdi->ops->reset(cdi);
2368 }
2369 
2370 static int cdrom_ioctl_lock_door(struct cdrom_device_info *cdi,
2371 		unsigned long arg)
2372 {
2373 	cdinfo(CD_DO_IOCTL, "%socking door.\n", arg ? "L" : "Unl");
2374 
2375 	if (!CDROM_CAN(CDC_LOCK))
2376 		return -EDRIVE_CANT_DO_THIS;
2377 
2378 	keeplocked = arg ? 1 : 0;
2379 
2380 	/*
2381 	 * Don't unlock the door on multiple opens by default, but allow
2382 	 * root to do so.
2383 	 */
2384 	if (cdi->use_count != 1 && !arg && !capable(CAP_SYS_ADMIN))
2385 		return -EBUSY;
2386 	return cdi->ops->lock_door(cdi, arg);
2387 }
2388 
2389 static int cdrom_ioctl_debug(struct cdrom_device_info *cdi,
2390 		unsigned long arg)
2391 {
2392 	cdinfo(CD_DO_IOCTL, "%sabling debug.\n", arg ? "En" : "Dis");
2393 
2394 	if (!capable(CAP_SYS_ADMIN))
2395 		return -EACCES;
2396 	debug = arg ? 1 : 0;
2397 	return debug;
2398 }
2399 
2400 static int cdrom_ioctl_get_capability(struct cdrom_device_info *cdi)
2401 {
2402 	cdinfo(CD_DO_IOCTL, "entering CDROM_GET_CAPABILITY\n");
2403 	return (cdi->ops->capability & ~cdi->mask);
2404 }
2405 
2406 /*
2407  * The following function is implemented, although very few audio
2408  * discs give Universal Product Code information, which should just be
2409  * the Medium Catalog Number on the box.  Note, that the way the code
2410  * is written on the CD is /not/ uniform across all discs!
2411  */
2412 static int cdrom_ioctl_get_mcn(struct cdrom_device_info *cdi,
2413 		void __user *argp)
2414 {
2415 	struct cdrom_mcn mcn;
2416 	int ret;
2417 
2418 	cdinfo(CD_DO_IOCTL, "entering CDROM_GET_MCN\n");
2419 
2420 	if (!(cdi->ops->capability & CDC_MCN))
2421 		return -ENOSYS;
2422 	ret = cdi->ops->get_mcn(cdi, &mcn);
2423 	if (ret)
2424 		return ret;
2425 
2426 	if (copy_to_user(argp, &mcn, sizeof(mcn)))
2427 		return -EFAULT;
2428 	cdinfo(CD_DO_IOCTL, "CDROM_GET_MCN successful\n");
2429 	return 0;
2430 }
2431 
2432 static int cdrom_ioctl_drive_status(struct cdrom_device_info *cdi,
2433 		unsigned long arg)
2434 {
2435 	cdinfo(CD_DO_IOCTL, "entering CDROM_DRIVE_STATUS\n");
2436 
2437 	if (!(cdi->ops->capability & CDC_DRIVE_STATUS))
2438 		return -ENOSYS;
2439 	if (!CDROM_CAN(CDC_SELECT_DISC) ||
2440 	    (arg == CDSL_CURRENT || arg == CDSL_NONE))
2441 		return cdi->ops->drive_status(cdi, CDSL_CURRENT);
2442 	if (((int)arg >= cdi->capacity))
2443 		return -EINVAL;
2444 	return cdrom_slot_status(cdi, arg);
2445 }
2446 
2447 /*
2448  * Ok, this is where problems start.  The current interface for the
2449  * CDROM_DISC_STATUS ioctl is flawed.  It makes the false assumption that
2450  * CDs are all CDS_DATA_1 or all CDS_AUDIO, etc.  Unfortunatly, while this
2451  * is often the case, it is also very common for CDs to have some tracks
2452  * with data, and some tracks with audio.  Just because I feel like it,
2453  * I declare the following to be the best way to cope.  If the CD has ANY
2454  * data tracks on it, it will be returned as a data CD.  If it has any XA
2455  * tracks, I will return it as that.  Now I could simplify this interface
2456  * by combining these  returns with the above, but this more clearly
2457  * demonstrates the problem with the current interface.  Too bad this
2458  * wasn't designed to use bitmasks...         -Erik
2459  *
2460  * Well, now we have the option CDS_MIXED: a mixed-type CD.
2461  * User level programmers might feel the ioctl is not very useful.
2462  *					---david
2463  */
2464 static int cdrom_ioctl_disc_status(struct cdrom_device_info *cdi)
2465 {
2466 	tracktype tracks;
2467 
2468 	cdinfo(CD_DO_IOCTL, "entering CDROM_DISC_STATUS\n");
2469 
2470 	cdrom_count_tracks(cdi, &tracks);
2471 	if (tracks.error)
2472 		return tracks.error;
2473 
2474 	/* Policy mode on */
2475 	if (tracks.audio > 0) {
2476 		if (!tracks.data && !tracks.cdi && !tracks.xa)
2477 			return CDS_AUDIO;
2478 		else
2479 			return CDS_MIXED;
2480 	}
2481 
2482 	if (tracks.cdi > 0)
2483 		return CDS_XA_2_2;
2484 	if (tracks.xa > 0)
2485 		return CDS_XA_2_1;
2486 	if (tracks.data > 0)
2487 		return CDS_DATA_1;
2488 	/* Policy mode off */
2489 
2490 	cdinfo(CD_WARNING,"This disc doesn't have any tracks I recognize!\n");
2491 	return CDS_NO_INFO;
2492 }
2493 
2494 static int cdrom_ioctl_changer_nslots(struct cdrom_device_info *cdi)
2495 {
2496 	cdinfo(CD_DO_IOCTL, "entering CDROM_CHANGER_NSLOTS\n");
2497 	return cdi->capacity;
2498 }
2499 
2500 static int cdrom_ioctl_get_subchnl(struct cdrom_device_info *cdi,
2501 		void __user *argp)
2502 {
2503 	struct cdrom_subchnl q;
2504 	u8 requested, back;
2505 	int ret;
2506 
2507 	/* cdinfo(CD_DO_IOCTL,"entering CDROMSUBCHNL\n");*/
2508 
2509 	if (!CDROM_CAN(CDC_PLAY_AUDIO))
2510 		return -ENOSYS;
2511 	if (copy_from_user(&q, argp, sizeof(q)))
2512 		return -EFAULT;
2513 
2514 	requested = q.cdsc_format;
2515 	if (requested != CDROM_MSF && requested != CDROM_LBA)
2516 		return -EINVAL;
2517 	q.cdsc_format = CDROM_MSF;
2518 
2519 	ret = cdi->ops->audio_ioctl(cdi, CDROMSUBCHNL, &q);
2520 	if (ret)
2521 		return ret;
2522 
2523 	back = q.cdsc_format; /* local copy */
2524 	sanitize_format(&q.cdsc_absaddr, &back, requested);
2525 	sanitize_format(&q.cdsc_reladdr, &q.cdsc_format, requested);
2526 
2527 	if (copy_to_user(argp, &q, sizeof(q)))
2528 		return -EFAULT;
2529 	/* cdinfo(CD_DO_IOCTL, "CDROMSUBCHNL successful\n"); */
2530 	return 0;
2531 }
2532 
2533 static int cdrom_ioctl_read_tochdr(struct cdrom_device_info *cdi,
2534 		void __user *argp)
2535 {
2536 	struct cdrom_tochdr header;
2537 	int ret;
2538 
2539 	/* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCHDR\n"); */
2540 
2541 	if (!CDROM_CAN(CDC_PLAY_AUDIO))
2542 		return -ENOSYS;
2543 	if (copy_from_user(&header, argp, sizeof(header)))
2544 		return -EFAULT;
2545 
2546 	ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header);
2547 	if (ret)
2548 		return ret;
2549 
2550 	if (copy_to_user(argp, &header, sizeof(header)))
2551 		return -EFAULT;
2552 	/* cdinfo(CD_DO_IOCTL, "CDROMREADTOCHDR successful\n"); */
2553 	return 0;
2554 }
2555 
2556 static int cdrom_ioctl_read_tocentry(struct cdrom_device_info *cdi,
2557 		void __user *argp)
2558 {
2559 	struct cdrom_tocentry entry;
2560 	u8 requested_format;
2561 	int ret;
2562 
2563 	/* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCENTRY\n"); */
2564 
2565 	if (!CDROM_CAN(CDC_PLAY_AUDIO))
2566 		return -ENOSYS;
2567 	if (copy_from_user(&entry, argp, sizeof(entry)))
2568 		return -EFAULT;
2569 
2570 	requested_format = entry.cdte_format;
2571 	if (requested_format != CDROM_MSF && requested_format != CDROM_LBA)
2572 		return -EINVAL;
2573 	/* make interface to low-level uniform */
2574 	entry.cdte_format = CDROM_MSF;
2575 	ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &entry);
2576 	if (ret)
2577 		return ret;
2578 	sanitize_format(&entry.cdte_addr, &entry.cdte_format, requested_format);
2579 
2580 	if (copy_to_user(argp, &entry, sizeof(entry)))
2581 		return -EFAULT;
2582 	/* cdinfo(CD_DO_IOCTL, "CDROMREADTOCENTRY successful\n"); */
2583 	return 0;
2584 }
2585 
2586 static int cdrom_ioctl_play_msf(struct cdrom_device_info *cdi,
2587 		void __user *argp)
2588 {
2589 	struct cdrom_msf msf;
2590 
2591 	cdinfo(CD_DO_IOCTL, "entering CDROMPLAYMSF\n");
2592 
2593 	if (!CDROM_CAN(CDC_PLAY_AUDIO))
2594 		return -ENOSYS;
2595 	if (copy_from_user(&msf, argp, sizeof(msf)))
2596 		return -EFAULT;
2597 	return cdi->ops->audio_ioctl(cdi, CDROMPLAYMSF, &msf);
2598 }
2599 
2600 static int cdrom_ioctl_play_trkind(struct cdrom_device_info *cdi,
2601 		void __user *argp)
2602 {
2603 	struct cdrom_ti ti;
2604 	int ret;
2605 
2606 	cdinfo(CD_DO_IOCTL, "entering CDROMPLAYTRKIND\n");
2607 
2608 	if (!CDROM_CAN(CDC_PLAY_AUDIO))
2609 		return -ENOSYS;
2610 	if (copy_from_user(&ti, argp, sizeof(ti)))
2611 		return -EFAULT;
2612 
2613 	ret = check_for_audio_disc(cdi, cdi->ops);
2614 	if (ret)
2615 		return ret;
2616 	return cdi->ops->audio_ioctl(cdi, CDROMPLAYTRKIND, &ti);
2617 }
2618 static int cdrom_ioctl_volctrl(struct cdrom_device_info *cdi,
2619 		void __user *argp)
2620 {
2621 	struct cdrom_volctrl volume;
2622 
2623 	cdinfo(CD_DO_IOCTL, "entering CDROMVOLCTRL\n");
2624 
2625 	if (!CDROM_CAN(CDC_PLAY_AUDIO))
2626 		return -ENOSYS;
2627 	if (copy_from_user(&volume, argp, sizeof(volume)))
2628 		return -EFAULT;
2629 	return cdi->ops->audio_ioctl(cdi, CDROMVOLCTRL, &volume);
2630 }
2631 
2632 static int cdrom_ioctl_volread(struct cdrom_device_info *cdi,
2633 		void __user *argp)
2634 {
2635 	struct cdrom_volctrl volume;
2636 	int ret;
2637 
2638 	cdinfo(CD_DO_IOCTL, "entering CDROMVOLREAD\n");
2639 
2640 	if (!CDROM_CAN(CDC_PLAY_AUDIO))
2641 		return -ENOSYS;
2642 
2643 	ret = cdi->ops->audio_ioctl(cdi, CDROMVOLREAD, &volume);
2644 	if (ret)
2645 		return ret;
2646 
2647 	if (copy_to_user(argp, &volume, sizeof(volume)))
2648 		return -EFAULT;
2649 	return 0;
2650 }
2651 
2652 static int cdrom_ioctl_audioctl(struct cdrom_device_info *cdi,
2653 		unsigned int cmd)
2654 {
2655 	int ret;
2656 
2657 	cdinfo(CD_DO_IOCTL, "doing audio ioctl (start/stop/pause/resume)\n");
2658 
2659 	if (!CDROM_CAN(CDC_PLAY_AUDIO))
2660 		return -ENOSYS;
2661 	ret = check_for_audio_disc(cdi, cdi->ops);
2662 	if (ret)
2663 		return ret;
2664 	return cdi->ops->audio_ioctl(cdi, cmd, NULL);
2665 }
2666 
2667 /*
2668  * Just about every imaginable ioctl is supported in the Uniform layer
2669  * these days.
2670  * ATAPI / SCSI specific code now mainly resides in mmc_ioctl().
2671  */
2672 int cdrom_ioctl(struct file * file, struct cdrom_device_info *cdi,
2673 		struct inode *ip, unsigned int cmd, unsigned long arg)
2674 {
2675 	void __user *argp = (void __user *)arg;
2676 	int ret;
2677 	struct gendisk *disk = ip->i_bdev->bd_disk;
2678 
2679 	/*
2680 	 * Try the generic SCSI command ioctl's first.
2681 	 */
2682 	ret = scsi_cmd_ioctl(file, disk->queue, disk, cmd, argp);
2683 	if (ret != -ENOTTY)
2684 		return ret;
2685 
2686 	switch (cmd) {
2687 	case CDROMMULTISESSION:
2688 		return cdrom_ioctl_multisession(cdi, argp);
2689 	case CDROMEJECT:
2690 		return cdrom_ioctl_eject(cdi);
2691 	case CDROMCLOSETRAY:
2692 		return cdrom_ioctl_closetray(cdi);
2693 	case CDROMEJECT_SW:
2694 		return cdrom_ioctl_eject_sw(cdi, arg);
2695 	case CDROM_MEDIA_CHANGED:
2696 		return cdrom_ioctl_media_changed(cdi, arg);
2697 	case CDROM_SET_OPTIONS:
2698 		return cdrom_ioctl_set_options(cdi, arg);
2699 	case CDROM_CLEAR_OPTIONS:
2700 		return cdrom_ioctl_clear_options(cdi, arg);
2701 	case CDROM_SELECT_SPEED:
2702 		return cdrom_ioctl_select_speed(cdi, arg);
2703 	case CDROM_SELECT_DISC:
2704 		return cdrom_ioctl_select_disc(cdi, arg);
2705 	case CDROMRESET:
2706 		return cdrom_ioctl_reset(cdi, ip->i_bdev);
2707 	case CDROM_LOCKDOOR:
2708 		return cdrom_ioctl_lock_door(cdi, arg);
2709 	case CDROM_DEBUG:
2710 		return cdrom_ioctl_debug(cdi, arg);
2711 	case CDROM_GET_CAPABILITY:
2712 		return cdrom_ioctl_get_capability(cdi);
2713 	case CDROM_GET_MCN:
2714 		return cdrom_ioctl_get_mcn(cdi, argp);
2715 	case CDROM_DRIVE_STATUS:
2716 		return cdrom_ioctl_drive_status(cdi, arg);
2717 	case CDROM_DISC_STATUS:
2718 		return cdrom_ioctl_disc_status(cdi);
2719 	case CDROM_CHANGER_NSLOTS:
2720 		return cdrom_ioctl_changer_nslots(cdi);
2721 	}
2722 
2723 	/*
2724 	 * Use the ioctls that are implemented through the generic_packet()
2725 	 * interface. this may look at bit funny, but if -ENOTTY is
2726 	 * returned that particular ioctl is not implemented and we
2727 	 * let it go through the device specific ones.
2728 	 */
2729 	if (CDROM_CAN(CDC_GENERIC_PACKET)) {
2730 		ret = mmc_ioctl(cdi, cmd, arg);
2731 		if (ret != -ENOTTY)
2732 			return ret;
2733 	}
2734 
2735 	/*
2736 	 * Note: most of the cdinfo() calls are commented out here,
2737 	 * because they fill up the sys log when CD players poll
2738 	 * the drive.
2739 	 */
2740 	switch (cmd) {
2741 	case CDROMSUBCHNL:
2742 		return cdrom_ioctl_get_subchnl(cdi, argp);
2743 	case CDROMREADTOCHDR:
2744 		return cdrom_ioctl_read_tochdr(cdi, argp);
2745 	case CDROMREADTOCENTRY:
2746 		return cdrom_ioctl_read_tocentry(cdi, argp);
2747 	case CDROMPLAYMSF:
2748 		return cdrom_ioctl_play_msf(cdi, argp);
2749 	case CDROMPLAYTRKIND:
2750 		return cdrom_ioctl_play_trkind(cdi, argp);
2751 	case CDROMVOLCTRL:
2752 		return cdrom_ioctl_volctrl(cdi, argp);
2753 	case CDROMVOLREAD:
2754 		return cdrom_ioctl_volread(cdi, argp);
2755 	case CDROMSTART:
2756 	case CDROMSTOP:
2757 	case CDROMPAUSE:
2758 	case CDROMRESUME:
2759 		return cdrom_ioctl_audioctl(cdi, cmd);
2760 	}
2761 
2762 	return -ENOSYS;
2763 }
2764 
2765 /*
2766  * Required when we need to use READ_10 to issue other than 2048 block
2767  * reads
2768  */
2769 static int cdrom_switch_blocksize(struct cdrom_device_info *cdi, int size)
2770 {
2771 	struct cdrom_device_ops *cdo = cdi->ops;
2772 	struct packet_command cgc;
2773 	struct modesel_head mh;
2774 
2775 	memset(&mh, 0, sizeof(mh));
2776 	mh.block_desc_length = 0x08;
2777 	mh.block_length_med = (size >> 8) & 0xff;
2778 	mh.block_length_lo = size & 0xff;
2779 
2780 	memset(&cgc, 0, sizeof(cgc));
2781 	cgc.cmd[0] = 0x15;
2782 	cgc.cmd[1] = 1 << 4;
2783 	cgc.cmd[4] = 12;
2784 	cgc.buflen = sizeof(mh);
2785 	cgc.buffer = (char *) &mh;
2786 	cgc.data_direction = CGC_DATA_WRITE;
2787 	mh.block_desc_length = 0x08;
2788 	mh.block_length_med = (size >> 8) & 0xff;
2789 	mh.block_length_lo = size & 0xff;
2790 
2791 	return cdo->generic_packet(cdi, &cgc);
2792 }
2793 
2794 static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
2795 		     unsigned long arg)
2796 {
2797 	struct cdrom_device_ops *cdo = cdi->ops;
2798 	struct packet_command cgc;
2799 	struct request_sense sense;
2800 	unsigned char buffer[32];
2801 	int ret = 0;
2802 
2803 	memset(&cgc, 0, sizeof(cgc));
2804 
2805 	/* build a unified command and queue it through
2806 	   cdo->generic_packet() */
2807 	switch (cmd) {
2808 	case CDROMREADRAW:
2809 	case CDROMREADMODE1:
2810 	case CDROMREADMODE2: {
2811 		struct cdrom_msf msf;
2812 		int blocksize = 0, format = 0, lba;
2813 
2814 		switch (cmd) {
2815 		case CDROMREADRAW:
2816 			blocksize = CD_FRAMESIZE_RAW;
2817 			break;
2818 		case CDROMREADMODE1:
2819 			blocksize = CD_FRAMESIZE;
2820 			format = 2;
2821 			break;
2822 		case CDROMREADMODE2:
2823 			blocksize = CD_FRAMESIZE_RAW0;
2824 			break;
2825 		}
2826 		IOCTL_IN(arg, struct cdrom_msf, msf);
2827 		lba = msf_to_lba(msf.cdmsf_min0,msf.cdmsf_sec0,msf.cdmsf_frame0);
2828 		/* FIXME: we need upper bound checking, too!! */
2829 		if (lba < 0)
2830 			return -EINVAL;
2831 		cgc.buffer = kmalloc(blocksize, GFP_KERNEL);
2832 		if (cgc.buffer == NULL)
2833 			return -ENOMEM;
2834 		memset(&sense, 0, sizeof(sense));
2835 		cgc.sense = &sense;
2836 		cgc.data_direction = CGC_DATA_READ;
2837 		ret = cdrom_read_block(cdi, &cgc, lba, 1, format, blocksize);
2838 		if (ret && sense.sense_key==0x05 && sense.asc==0x20 && sense.ascq==0x00) {
2839 			/*
2840 			 * SCSI-II devices are not required to support
2841 			 * READ_CD, so let's try switching block size
2842 			 */
2843 			/* FIXME: switch back again... */
2844 			if ((ret = cdrom_switch_blocksize(cdi, blocksize))) {
2845 				kfree(cgc.buffer);
2846 				return ret;
2847 			}
2848 			cgc.sense = NULL;
2849 			ret = cdrom_read_cd(cdi, &cgc, lba, blocksize, 1);
2850 			ret |= cdrom_switch_blocksize(cdi, blocksize);
2851 		}
2852 		if (!ret && copy_to_user((char __user *)arg, cgc.buffer, blocksize))
2853 			ret = -EFAULT;
2854 		kfree(cgc.buffer);
2855 		return ret;
2856 		}
2857 	case CDROMREADAUDIO: {
2858 		struct cdrom_read_audio ra;
2859 		int lba;
2860 
2861 		IOCTL_IN(arg, struct cdrom_read_audio, ra);
2862 
2863 		if (ra.addr_format == CDROM_MSF)
2864 			lba = msf_to_lba(ra.addr.msf.minute,
2865 					 ra.addr.msf.second,
2866 					 ra.addr.msf.frame);
2867 		else if (ra.addr_format == CDROM_LBA)
2868 			lba = ra.addr.lba;
2869 		else
2870 			return -EINVAL;
2871 
2872 		/* FIXME: we need upper bound checking, too!! */
2873 		if (lba < 0 || ra.nframes <= 0 || ra.nframes > CD_FRAMES)
2874 			return -EINVAL;
2875 
2876 		return cdrom_read_cdda(cdi, ra.buf, lba, ra.nframes);
2877 		}
2878 	case CDROMSUBCHNL: {
2879 		struct cdrom_subchnl q;
2880 		u_char requested, back;
2881 		IOCTL_IN(arg, struct cdrom_subchnl, q);
2882 		requested = q.cdsc_format;
2883 		if (!((requested == CDROM_MSF) ||
2884 		      (requested == CDROM_LBA)))
2885 			return -EINVAL;
2886 		q.cdsc_format = CDROM_MSF;
2887 		if ((ret = cdrom_read_subchannel(cdi, &q, 0)))
2888 			return ret;
2889 		back = q.cdsc_format; /* local copy */
2890 		sanitize_format(&q.cdsc_absaddr, &back, requested);
2891 		sanitize_format(&q.cdsc_reladdr, &q.cdsc_format, requested);
2892 		IOCTL_OUT(arg, struct cdrom_subchnl, q);
2893 		/* cdinfo(CD_DO_IOCTL, "CDROMSUBCHNL successful\n"); */
2894 		return 0;
2895 		}
2896 	case CDROMPLAYMSF: {
2897 		struct cdrom_msf msf;
2898 		cdinfo(CD_DO_IOCTL, "entering CDROMPLAYMSF\n");
2899 		IOCTL_IN(arg, struct cdrom_msf, msf);
2900 		cgc.cmd[0] = GPCMD_PLAY_AUDIO_MSF;
2901 		cgc.cmd[3] = msf.cdmsf_min0;
2902 		cgc.cmd[4] = msf.cdmsf_sec0;
2903 		cgc.cmd[5] = msf.cdmsf_frame0;
2904 		cgc.cmd[6] = msf.cdmsf_min1;
2905 		cgc.cmd[7] = msf.cdmsf_sec1;
2906 		cgc.cmd[8] = msf.cdmsf_frame1;
2907 		cgc.data_direction = CGC_DATA_NONE;
2908 		return cdo->generic_packet(cdi, &cgc);
2909 		}
2910 	case CDROMPLAYBLK: {
2911 		struct cdrom_blk blk;
2912 		cdinfo(CD_DO_IOCTL, "entering CDROMPLAYBLK\n");
2913 		IOCTL_IN(arg, struct cdrom_blk, blk);
2914 		cgc.cmd[0] = GPCMD_PLAY_AUDIO_10;
2915 		cgc.cmd[2] = (blk.from >> 24) & 0xff;
2916 		cgc.cmd[3] = (blk.from >> 16) & 0xff;
2917 		cgc.cmd[4] = (blk.from >>  8) & 0xff;
2918 		cgc.cmd[5] = blk.from & 0xff;
2919 		cgc.cmd[7] = (blk.len >> 8) & 0xff;
2920 		cgc.cmd[8] = blk.len & 0xff;
2921 		cgc.data_direction = CGC_DATA_NONE;
2922 		return cdo->generic_packet(cdi, &cgc);
2923 		}
2924 	case CDROMVOLCTRL:
2925 	case CDROMVOLREAD: {
2926 		struct cdrom_volctrl volctrl;
2927 		char mask[sizeof(buffer)];
2928 		unsigned short offset;
2929 
2930 		cdinfo(CD_DO_IOCTL, "entering CDROMVOLUME\n");
2931 
2932 		IOCTL_IN(arg, struct cdrom_volctrl, volctrl);
2933 
2934 		cgc.buffer = buffer;
2935 		cgc.buflen = 24;
2936 		if ((ret = cdrom_mode_sense(cdi, &cgc, GPMODE_AUDIO_CTL_PAGE, 0)))
2937 		    return ret;
2938 
2939 		/* originally the code depended on buffer[1] to determine
2940 		   how much data is available for transfer. buffer[1] is
2941 		   unfortunately ambigious and the only reliable way seem
2942 		   to be to simply skip over the block descriptor... */
2943 		offset = 8 + be16_to_cpu(*(__be16 *)(buffer+6));
2944 
2945 		if (offset + 16 > sizeof(buffer))
2946 			return -E2BIG;
2947 
2948 		if (offset + 16 > cgc.buflen) {
2949 			cgc.buflen = offset+16;
2950 			ret = cdrom_mode_sense(cdi, &cgc,
2951 						GPMODE_AUDIO_CTL_PAGE, 0);
2952 			if (ret)
2953 				return ret;
2954 		}
2955 
2956 		/* sanity check */
2957 		if ((buffer[offset] & 0x3f) != GPMODE_AUDIO_CTL_PAGE ||
2958 				buffer[offset+1] < 14)
2959 			return -EINVAL;
2960 
2961 		/* now we have the current volume settings. if it was only
2962 		   a CDROMVOLREAD, return these values */
2963 		if (cmd == CDROMVOLREAD) {
2964 			volctrl.channel0 = buffer[offset+9];
2965 			volctrl.channel1 = buffer[offset+11];
2966 			volctrl.channel2 = buffer[offset+13];
2967 			volctrl.channel3 = buffer[offset+15];
2968 			IOCTL_OUT(arg, struct cdrom_volctrl, volctrl);
2969 			return 0;
2970 		}
2971 
2972 		/* get the volume mask */
2973 		cgc.buffer = mask;
2974 		if ((ret = cdrom_mode_sense(cdi, &cgc,
2975 				GPMODE_AUDIO_CTL_PAGE, 1)))
2976 			return ret;
2977 
2978 		buffer[offset+9] = volctrl.channel0 & mask[offset+9];
2979 		buffer[offset+11] = volctrl.channel1 & mask[offset+11];
2980 		buffer[offset+13] = volctrl.channel2 & mask[offset+13];
2981 		buffer[offset+15] = volctrl.channel3 & mask[offset+15];
2982 
2983 		/* set volume */
2984 		cgc.buffer = buffer + offset - 8;
2985 		memset(cgc.buffer, 0, 8);
2986 		return cdrom_mode_select(cdi, &cgc);
2987 		}
2988 
2989 	case CDROMSTART:
2990 	case CDROMSTOP: {
2991 		cdinfo(CD_DO_IOCTL, "entering CDROMSTART/CDROMSTOP\n");
2992 		cgc.cmd[0] = GPCMD_START_STOP_UNIT;
2993 		cgc.cmd[1] = 1;
2994 		cgc.cmd[4] = (cmd == CDROMSTART) ? 1 : 0;
2995 		cgc.data_direction = CGC_DATA_NONE;
2996 		return cdo->generic_packet(cdi, &cgc);
2997 		}
2998 
2999 	case CDROMPAUSE:
3000 	case CDROMRESUME: {
3001 		cdinfo(CD_DO_IOCTL, "entering CDROMPAUSE/CDROMRESUME\n");
3002 		cgc.cmd[0] = GPCMD_PAUSE_RESUME;
3003 		cgc.cmd[8] = (cmd == CDROMRESUME) ? 1 : 0;
3004 		cgc.data_direction = CGC_DATA_NONE;
3005 		return cdo->generic_packet(cdi, &cgc);
3006 		}
3007 
3008 	case DVD_READ_STRUCT: {
3009 		dvd_struct *s;
3010 		int size = sizeof(dvd_struct);
3011 		if (!CDROM_CAN(CDC_DVD))
3012 			return -ENOSYS;
3013 		if ((s = kmalloc(size, GFP_KERNEL)) == NULL)
3014 			return -ENOMEM;
3015 		cdinfo(CD_DO_IOCTL, "entering DVD_READ_STRUCT\n");
3016 		if (copy_from_user(s, (dvd_struct __user *)arg, size)) {
3017 			kfree(s);
3018 			return -EFAULT;
3019 		}
3020 		if ((ret = dvd_read_struct(cdi, s))) {
3021 			kfree(s);
3022 			return ret;
3023 		}
3024 		if (copy_to_user((dvd_struct __user *)arg, s, size))
3025 			ret = -EFAULT;
3026 		kfree(s);
3027 		return ret;
3028 		}
3029 
3030 	case DVD_AUTH: {
3031 		dvd_authinfo ai;
3032 		if (!CDROM_CAN(CDC_DVD))
3033 			return -ENOSYS;
3034 		cdinfo(CD_DO_IOCTL, "entering DVD_AUTH\n");
3035 		IOCTL_IN(arg, dvd_authinfo, ai);
3036 		if ((ret = dvd_do_auth (cdi, &ai)))
3037 			return ret;
3038 		IOCTL_OUT(arg, dvd_authinfo, ai);
3039 		return 0;
3040 		}
3041 
3042 	case CDROM_NEXT_WRITABLE: {
3043 		long next = 0;
3044 		cdinfo(CD_DO_IOCTL, "entering CDROM_NEXT_WRITABLE\n");
3045 		if ((ret = cdrom_get_next_writable(cdi, &next)))
3046 			return ret;
3047 		IOCTL_OUT(arg, long, next);
3048 		return 0;
3049 		}
3050 	case CDROM_LAST_WRITTEN: {
3051 		long last = 0;
3052 		cdinfo(CD_DO_IOCTL, "entering CDROM_LAST_WRITTEN\n");
3053 		if ((ret = cdrom_get_last_written(cdi, &last)))
3054 			return ret;
3055 		IOCTL_OUT(arg, long, last);
3056 		return 0;
3057 		}
3058 	} /* switch */
3059 
3060 	return -ENOTTY;
3061 }
3062 
3063 static int cdrom_get_track_info(struct cdrom_device_info *cdi, __u16 track, __u8 type,
3064 			 track_information *ti)
3065 {
3066 	struct cdrom_device_ops *cdo = cdi->ops;
3067 	struct packet_command cgc;
3068 	int ret, buflen;
3069 
3070 	init_cdrom_command(&cgc, ti, 8, CGC_DATA_READ);
3071 	cgc.cmd[0] = GPCMD_READ_TRACK_RZONE_INFO;
3072 	cgc.cmd[1] = type & 3;
3073 	cgc.cmd[4] = (track & 0xff00) >> 8;
3074 	cgc.cmd[5] = track & 0xff;
3075 	cgc.cmd[8] = 8;
3076 	cgc.quiet = 1;
3077 
3078 	if ((ret = cdo->generic_packet(cdi, &cgc)))
3079 		return ret;
3080 
3081 	buflen = be16_to_cpu(ti->track_information_length) +
3082 		     sizeof(ti->track_information_length);
3083 
3084 	if (buflen > sizeof(track_information))
3085 		buflen = sizeof(track_information);
3086 
3087 	cgc.cmd[8] = cgc.buflen = buflen;
3088 	if ((ret = cdo->generic_packet(cdi, &cgc)))
3089 		return ret;
3090 
3091 	/* return actual fill size */
3092 	return buflen;
3093 }
3094 
3095 /* requires CD R/RW */
3096 static int cdrom_get_disc_info(struct cdrom_device_info *cdi, disc_information *di)
3097 {
3098 	struct cdrom_device_ops *cdo = cdi->ops;
3099 	struct packet_command cgc;
3100 	int ret, buflen;
3101 
3102 	/* set up command and get the disc info */
3103 	init_cdrom_command(&cgc, di, sizeof(*di), CGC_DATA_READ);
3104 	cgc.cmd[0] = GPCMD_READ_DISC_INFO;
3105 	cgc.cmd[8] = cgc.buflen = 2;
3106 	cgc.quiet = 1;
3107 
3108 	if ((ret = cdo->generic_packet(cdi, &cgc)))
3109 		return ret;
3110 
3111 	/* not all drives have the same disc_info length, so requeue
3112 	 * packet with the length the drive tells us it can supply
3113 	 */
3114 	buflen = be16_to_cpu(di->disc_information_length) +
3115 		     sizeof(di->disc_information_length);
3116 
3117 	if (buflen > sizeof(disc_information))
3118 		buflen = sizeof(disc_information);
3119 
3120 	cgc.cmd[8] = cgc.buflen = buflen;
3121 	if ((ret = cdo->generic_packet(cdi, &cgc)))
3122 		return ret;
3123 
3124 	/* return actual fill size */
3125 	return buflen;
3126 }
3127 
3128 /* return the last written block on the CD-R media. this is for the udf
3129    file system. */
3130 int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written)
3131 {
3132 	struct cdrom_tocentry toc;
3133 	disc_information di;
3134 	track_information ti;
3135 	__u32 last_track;
3136 	int ret = -1, ti_size;
3137 
3138 	if (!CDROM_CAN(CDC_GENERIC_PACKET))
3139 		goto use_toc;
3140 
3141 	ret = cdrom_get_disc_info(cdi, &di);
3142 	if (ret < (int)(offsetof(typeof(di), last_track_lsb)
3143 			+ sizeof(di.last_track_lsb)))
3144 		goto use_toc;
3145 
3146 	/* if unit didn't return msb, it's zeroed by cdrom_get_disc_info */
3147 	last_track = (di.last_track_msb << 8) | di.last_track_lsb;
3148 	ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
3149 	if (ti_size < (int)offsetof(typeof(ti), track_start))
3150 		goto use_toc;
3151 
3152 	/* if this track is blank, try the previous. */
3153 	if (ti.blank) {
3154 		if (last_track==1)
3155 			goto use_toc;
3156 		last_track--;
3157 		ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
3158 	}
3159 
3160 	if (ti_size < (int)(offsetof(typeof(ti), track_size)
3161 				+ sizeof(ti.track_size)))
3162 		goto use_toc;
3163 
3164 	/* if last recorded field is valid, return it. */
3165 	if (ti.lra_v && ti_size >= (int)(offsetof(typeof(ti), last_rec_address)
3166 				+ sizeof(ti.last_rec_address))) {
3167 		*last_written = be32_to_cpu(ti.last_rec_address);
3168 	} else {
3169 		/* make it up instead */
3170 		*last_written = be32_to_cpu(ti.track_start) +
3171 				be32_to_cpu(ti.track_size);
3172 		if (ti.free_blocks)
3173 			*last_written -= (be32_to_cpu(ti.free_blocks) + 7);
3174 	}
3175 	return 0;
3176 
3177 	/* this is where we end up if the drive either can't do a
3178 	   GPCMD_READ_DISC_INFO or GPCMD_READ_TRACK_RZONE_INFO or if
3179 	   it doesn't give enough information or fails. then we return
3180 	   the toc contents. */
3181 use_toc:
3182 	toc.cdte_format = CDROM_MSF;
3183 	toc.cdte_track = CDROM_LEADOUT;
3184 	if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &toc)))
3185 		return ret;
3186 	sanitize_format(&toc.cdte_addr, &toc.cdte_format, CDROM_LBA);
3187 	*last_written = toc.cdte_addr.lba;
3188 	return 0;
3189 }
3190 
3191 /* return the next writable block. also for udf file system. */
3192 static int cdrom_get_next_writable(struct cdrom_device_info *cdi, long *next_writable)
3193 {
3194 	disc_information di;
3195 	track_information ti;
3196 	__u16 last_track;
3197 	int ret, ti_size;
3198 
3199 	if (!CDROM_CAN(CDC_GENERIC_PACKET))
3200 		goto use_last_written;
3201 
3202 	ret = cdrom_get_disc_info(cdi, &di);
3203 	if (ret < 0 || ret < offsetof(typeof(di), last_track_lsb)
3204 				+ sizeof(di.last_track_lsb))
3205 		goto use_last_written;
3206 
3207 	/* if unit didn't return msb, it's zeroed by cdrom_get_disc_info */
3208 	last_track = (di.last_track_msb << 8) | di.last_track_lsb;
3209 	ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
3210 	if (ti_size < 0 || ti_size < offsetof(typeof(ti), track_start))
3211 		goto use_last_written;
3212 
3213         /* if this track is blank, try the previous. */
3214 	if (ti.blank) {
3215 		if (last_track == 1)
3216 			goto use_last_written;
3217 		last_track--;
3218 		ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
3219 		if (ti_size < 0)
3220 			goto use_last_written;
3221 	}
3222 
3223 	/* if next recordable address field is valid, use it. */
3224 	if (ti.nwa_v && ti_size >= offsetof(typeof(ti), next_writable)
3225 				+ sizeof(ti.next_writable)) {
3226 		*next_writable = be32_to_cpu(ti.next_writable);
3227 		return 0;
3228 	}
3229 
3230 use_last_written:
3231 	if ((ret = cdrom_get_last_written(cdi, next_writable))) {
3232 		*next_writable = 0;
3233 		return ret;
3234 	} else {
3235 		*next_writable += 7;
3236 		return 0;
3237 	}
3238 }
3239 
3240 EXPORT_SYMBOL(cdrom_get_last_written);
3241 EXPORT_SYMBOL(register_cdrom);
3242 EXPORT_SYMBOL(unregister_cdrom);
3243 EXPORT_SYMBOL(cdrom_open);
3244 EXPORT_SYMBOL(cdrom_release);
3245 EXPORT_SYMBOL(cdrom_ioctl);
3246 EXPORT_SYMBOL(cdrom_media_changed);
3247 EXPORT_SYMBOL(cdrom_number_of_slots);
3248 EXPORT_SYMBOL(cdrom_mode_select);
3249 EXPORT_SYMBOL(cdrom_mode_sense);
3250 EXPORT_SYMBOL(init_cdrom_command);
3251 EXPORT_SYMBOL(cdrom_get_media_event);
3252 
3253 #ifdef CONFIG_SYSCTL
3254 
3255 #define CDROM_STR_SIZE 1000
3256 
3257 static struct cdrom_sysctl_settings {
3258 	char	info[CDROM_STR_SIZE];	/* general info */
3259 	int	autoclose;		/* close tray upon mount, etc */
3260 	int	autoeject;		/* eject on umount */
3261 	int	debug;			/* turn on debugging messages */
3262 	int	lock;			/* lock the door on device open */
3263 	int	check;			/* check media type */
3264 } cdrom_sysctl_settings;
3265 
3266 enum cdrom_print_option {
3267 	CTL_NAME,
3268 	CTL_SPEED,
3269 	CTL_SLOTS,
3270 	CTL_CAPABILITY
3271 };
3272 
3273 static int cdrom_print_info(const char *header, int val, char *info,
3274 				int *pos, enum cdrom_print_option option)
3275 {
3276 	const int max_size = sizeof(cdrom_sysctl_settings.info);
3277 	struct cdrom_device_info *cdi;
3278 	int ret;
3279 
3280 	ret = scnprintf(info + *pos, max_size - *pos, header);
3281 	if (!ret)
3282 		return 1;
3283 
3284 	*pos += ret;
3285 
3286 	list_for_each_entry(cdi, &cdrom_list, list) {
3287 		switch (option) {
3288 		case CTL_NAME:
3289 			ret = scnprintf(info + *pos, max_size - *pos,
3290 					"\t%s", cdi->name);
3291 			break;
3292 		case CTL_SPEED:
3293 			ret = scnprintf(info + *pos, max_size - *pos,
3294 					"\t%d", cdi->speed);
3295 			break;
3296 		case CTL_SLOTS:
3297 			ret = scnprintf(info + *pos, max_size - *pos,
3298 					"\t%d", cdi->capacity);
3299 			break;
3300 		case CTL_CAPABILITY:
3301 			ret = scnprintf(info + *pos, max_size - *pos,
3302 					"\t%d", CDROM_CAN(val) != 0);
3303 			break;
3304 		default:
3305 			printk(KERN_INFO "cdrom: invalid option%d\n", option);
3306 			return 1;
3307 		}
3308 		if (!ret)
3309 			return 1;
3310 		*pos += ret;
3311 	}
3312 
3313 	return 0;
3314 }
3315 
3316 static int cdrom_sysctl_info(ctl_table *ctl, int write, struct file * filp,
3317                            void __user *buffer, size_t *lenp, loff_t *ppos)
3318 {
3319 	int pos;
3320 	char *info = cdrom_sysctl_settings.info;
3321 	const int max_size = sizeof(cdrom_sysctl_settings.info);
3322 
3323 	if (!*lenp || (*ppos && !write)) {
3324 		*lenp = 0;
3325 		return 0;
3326 	}
3327 
3328 	mutex_lock(&cdrom_mutex);
3329 
3330 	pos = sprintf(info, "CD-ROM information, " VERSION "\n");
3331 
3332 	if (cdrom_print_info("\ndrive name:\t", 0, info, &pos, CTL_NAME))
3333 		goto done;
3334 	if (cdrom_print_info("\ndrive speed:\t", 0, info, &pos, CTL_SPEED))
3335 		goto done;
3336 	if (cdrom_print_info("\ndrive # of slots:", 0, info, &pos, CTL_SLOTS))
3337 		goto done;
3338 	if (cdrom_print_info("\nCan close tray:\t",
3339 				CDC_CLOSE_TRAY, info, &pos, CTL_CAPABILITY))
3340 		goto done;
3341 	if (cdrom_print_info("\nCan open tray:\t",
3342 				CDC_OPEN_TRAY, info, &pos, CTL_CAPABILITY))
3343 		goto done;
3344 	if (cdrom_print_info("\nCan lock tray:\t",
3345 				CDC_LOCK, info, &pos, CTL_CAPABILITY))
3346 		goto done;
3347 	if (cdrom_print_info("\nCan change speed:",
3348 				CDC_SELECT_SPEED, info, &pos, CTL_CAPABILITY))
3349 		goto done;
3350 	if (cdrom_print_info("\nCan select disk:",
3351 				CDC_SELECT_DISC, info, &pos, CTL_CAPABILITY))
3352 		goto done;
3353 	if (cdrom_print_info("\nCan read multisession:",
3354 				CDC_MULTI_SESSION, info, &pos, CTL_CAPABILITY))
3355 		goto done;
3356 	if (cdrom_print_info("\nCan read MCN:\t",
3357 				CDC_MCN, info, &pos, CTL_CAPABILITY))
3358 		goto done;
3359 	if (cdrom_print_info("\nReports media changed:",
3360 				CDC_MEDIA_CHANGED, info, &pos, CTL_CAPABILITY))
3361 		goto done;
3362 	if (cdrom_print_info("\nCan play audio:\t",
3363 				CDC_PLAY_AUDIO, info, &pos, CTL_CAPABILITY))
3364 		goto done;
3365 	if (cdrom_print_info("\nCan write CD-R:\t",
3366 				CDC_CD_R, info, &pos, CTL_CAPABILITY))
3367 		goto done;
3368 	if (cdrom_print_info("\nCan write CD-RW:",
3369 				CDC_CD_RW, info, &pos, CTL_CAPABILITY))
3370 		goto done;
3371 	if (cdrom_print_info("\nCan read DVD:\t",
3372 				CDC_DVD, info, &pos, CTL_CAPABILITY))
3373 		goto done;
3374 	if (cdrom_print_info("\nCan write DVD-R:",
3375 				CDC_DVD_R, info, &pos, CTL_CAPABILITY))
3376 		goto done;
3377 	if (cdrom_print_info("\nCan write DVD-RAM:",
3378 				CDC_DVD_RAM, info, &pos, CTL_CAPABILITY))
3379 		goto done;
3380 	if (cdrom_print_info("\nCan read MRW:\t",
3381 				CDC_MRW, info, &pos, CTL_CAPABILITY))
3382 		goto done;
3383 	if (cdrom_print_info("\nCan write MRW:\t",
3384 				CDC_MRW_W, info, &pos, CTL_CAPABILITY))
3385 		goto done;
3386 	if (cdrom_print_info("\nCan write RAM:\t",
3387 				CDC_RAM, info, &pos, CTL_CAPABILITY))
3388 		goto done;
3389 	if (!scnprintf(info + pos, max_size - pos, "\n\n"))
3390 		goto done;
3391 doit:
3392 	mutex_unlock(&cdrom_mutex);
3393 	return proc_dostring(ctl, write, filp, buffer, lenp, ppos);
3394 done:
3395 	printk(KERN_INFO "cdrom: info buffer too small\n");
3396 	goto doit;
3397 }
3398 
3399 /* Unfortunately, per device settings are not implemented through
3400    procfs/sysctl yet. When they are, this will naturally disappear. For now
3401    just update all drives. Later this will become the template on which
3402    new registered drives will be based. */
3403 static void cdrom_update_settings(void)
3404 {
3405 	struct cdrom_device_info *cdi;
3406 
3407 	mutex_lock(&cdrom_mutex);
3408 	list_for_each_entry(cdi, &cdrom_list, list) {
3409 		if (autoclose && CDROM_CAN(CDC_CLOSE_TRAY))
3410 			cdi->options |= CDO_AUTO_CLOSE;
3411 		else if (!autoclose)
3412 			cdi->options &= ~CDO_AUTO_CLOSE;
3413 		if (autoeject && CDROM_CAN(CDC_OPEN_TRAY))
3414 			cdi->options |= CDO_AUTO_EJECT;
3415 		else if (!autoeject)
3416 			cdi->options &= ~CDO_AUTO_EJECT;
3417 		if (lockdoor && CDROM_CAN(CDC_LOCK))
3418 			cdi->options |= CDO_LOCK;
3419 		else if (!lockdoor)
3420 			cdi->options &= ~CDO_LOCK;
3421 		if (check_media_type)
3422 			cdi->options |= CDO_CHECK_TYPE;
3423 		else
3424 			cdi->options &= ~CDO_CHECK_TYPE;
3425 	}
3426 	mutex_unlock(&cdrom_mutex);
3427 }
3428 
3429 static int cdrom_sysctl_handler(ctl_table *ctl, int write, struct file * filp,
3430 				void __user *buffer, size_t *lenp, loff_t *ppos)
3431 {
3432 	int ret;
3433 
3434 	ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
3435 
3436 	if (write) {
3437 
3438 		/* we only care for 1 or 0. */
3439 		autoclose        = !!cdrom_sysctl_settings.autoclose;
3440 		autoeject        = !!cdrom_sysctl_settings.autoeject;
3441 		debug	         = !!cdrom_sysctl_settings.debug;
3442 		lockdoor         = !!cdrom_sysctl_settings.lock;
3443 		check_media_type = !!cdrom_sysctl_settings.check;
3444 
3445 		/* update the option flags according to the changes. we
3446 		   don't have per device options through sysctl yet,
3447 		   but we will have and then this will disappear. */
3448 		cdrom_update_settings();
3449 	}
3450 
3451         return ret;
3452 }
3453 
3454 /* Place files in /proc/sys/dev/cdrom */
3455 static ctl_table cdrom_table[] = {
3456 	{
3457 		.procname	= "info",
3458 		.data		= &cdrom_sysctl_settings.info,
3459 		.maxlen		= CDROM_STR_SIZE,
3460 		.mode		= 0444,
3461 		.proc_handler	= &cdrom_sysctl_info,
3462 	},
3463 	{
3464 		.procname	= "autoclose",
3465 		.data		= &cdrom_sysctl_settings.autoclose,
3466 		.maxlen		= sizeof(int),
3467 		.mode		= 0644,
3468 		.proc_handler	= &cdrom_sysctl_handler,
3469 	},
3470 	{
3471 		.procname	= "autoeject",
3472 		.data		= &cdrom_sysctl_settings.autoeject,
3473 		.maxlen		= sizeof(int),
3474 		.mode		= 0644,
3475 		.proc_handler	= &cdrom_sysctl_handler,
3476 	},
3477 	{
3478 		.procname	= "debug",
3479 		.data		= &cdrom_sysctl_settings.debug,
3480 		.maxlen		= sizeof(int),
3481 		.mode		= 0644,
3482 		.proc_handler	= &cdrom_sysctl_handler,
3483 	},
3484 	{
3485 		.procname	= "lock",
3486 		.data		= &cdrom_sysctl_settings.lock,
3487 		.maxlen		= sizeof(int),
3488 		.mode		= 0644,
3489 		.proc_handler	= &cdrom_sysctl_handler,
3490 	},
3491 	{
3492 		.procname	= "check_media",
3493 		.data		= &cdrom_sysctl_settings.check,
3494 		.maxlen		= sizeof(int),
3495 		.mode		= 0644,
3496 		.proc_handler	= &cdrom_sysctl_handler
3497 	},
3498 	{ .ctl_name = 0 }
3499 };
3500 
3501 static ctl_table cdrom_cdrom_table[] = {
3502 	{
3503 		.ctl_name	= DEV_CDROM,
3504 		.procname	= "cdrom",
3505 		.maxlen		= 0,
3506 		.mode		= 0555,
3507 		.child		= cdrom_table,
3508 	},
3509 	{ .ctl_name = 0 }
3510 };
3511 
3512 /* Make sure that /proc/sys/dev is there */
3513 static ctl_table cdrom_root_table[] = {
3514 	{
3515 		.ctl_name	= CTL_DEV,
3516 		.procname	= "dev",
3517 		.maxlen		= 0,
3518 		.mode		= 0555,
3519 		.child		= cdrom_cdrom_table,
3520 	},
3521 	{ .ctl_name = 0 }
3522 };
3523 static struct ctl_table_header *cdrom_sysctl_header;
3524 
3525 static void cdrom_sysctl_register(void)
3526 {
3527 	static int initialized;
3528 
3529 	if (initialized == 1)
3530 		return;
3531 
3532 	cdrom_sysctl_header = register_sysctl_table(cdrom_root_table);
3533 
3534 	/* set the defaults */
3535 	cdrom_sysctl_settings.autoclose = autoclose;
3536 	cdrom_sysctl_settings.autoeject = autoeject;
3537 	cdrom_sysctl_settings.debug = debug;
3538 	cdrom_sysctl_settings.lock = lockdoor;
3539 	cdrom_sysctl_settings.check = check_media_type;
3540 
3541 	initialized = 1;
3542 }
3543 
3544 static void cdrom_sysctl_unregister(void)
3545 {
3546 	if (cdrom_sysctl_header)
3547 		unregister_sysctl_table(cdrom_sysctl_header);
3548 }
3549 
3550 #else /* CONFIG_SYSCTL */
3551 
3552 static void cdrom_sysctl_register(void)
3553 {
3554 }
3555 
3556 static void cdrom_sysctl_unregister(void)
3557 {
3558 }
3559 
3560 #endif /* CONFIG_SYSCTL */
3561 
3562 static int __init cdrom_init(void)
3563 {
3564 	cdrom_sysctl_register();
3565 
3566 	return 0;
3567 }
3568 
3569 static void __exit cdrom_exit(void)
3570 {
3571 	printk(KERN_INFO "Uniform CD-ROM driver unloaded\n");
3572 	cdrom_sysctl_unregister();
3573 }
3574 
3575 module_init(cdrom_init);
3576 module_exit(cdrom_exit);
3577 MODULE_LICENSE("GPL");
3578