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