xref: /openbmc/linux/drivers/cdrom/cdrom.c (revision 87c2ce3b)
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/config.h>
267 #include <linux/module.h>
268 #include <linux/fs.h>
269 #include <linux/buffer_head.h>
270 #include <linux/major.h>
271 #include <linux/types.h>
272 #include <linux/errno.h>
273 #include <linux/kernel.h>
274 #include <linux/mm.h>
275 #include <linux/slab.h>
276 #include <linux/cdrom.h>
277 #include <linux/sysctl.h>
278 #include <linux/proc_fs.h>
279 #include <linux/blkpg.h>
280 #include <linux/init.h>
281 #include <linux/fcntl.h>
282 #include <linux/blkdev.h>
283 #include <linux/times.h>
284 
285 #include <asm/uaccess.h>
286 
287 /* used to tell the module to turn on full debugging messages */
288 static int debug;
289 /* used to keep tray locked at all times */
290 static int keeplocked;
291 /* default compatibility mode */
292 static int autoclose=1;
293 static int autoeject;
294 static int lockdoor = 1;
295 /* will we ever get to use this... sigh. */
296 static int check_media_type;
297 /* automatically restart mrw format */
298 static int mrw_format_restart = 1;
299 module_param(debug, bool, 0);
300 module_param(autoclose, bool, 0);
301 module_param(autoeject, bool, 0);
302 module_param(lockdoor, bool, 0);
303 module_param(check_media_type, bool, 0);
304 module_param(mrw_format_restart, bool, 0);
305 
306 static DEFINE_SPINLOCK(cdrom_lock);
307 
308 static const char *mrw_format_status[] = {
309 	"not mrw",
310 	"bgformat inactive",
311 	"bgformat active",
312 	"mrw complete",
313 };
314 
315 static const char *mrw_address_space[] = { "DMA", "GAA" };
316 
317 #if (ERRLOGMASK!=CD_NOTHING)
318 #define cdinfo(type, fmt, args...) \
319         if ((ERRLOGMASK & type) || debug==1 ) \
320             printk(KERN_INFO "cdrom: " fmt, ## args)
321 #else
322 #define cdinfo(type, fmt, args...)
323 #endif
324 
325 /* These are used to simplify getting data in from and back to user land */
326 #define IOCTL_IN(arg, type, in)					\
327 	if (copy_from_user(&(in), (type __user *) (arg), sizeof (in)))	\
328 		return -EFAULT;
329 
330 #define IOCTL_OUT(arg, type, out) \
331 	if (copy_to_user((type __user *) (arg), &(out), sizeof (out)))	\
332 		return -EFAULT;
333 
334 /* The (cdo->capability & ~cdi->mask & CDC_XXX) construct was used in
335    a lot of places. This macro makes the code more clear. */
336 #define CDROM_CAN(type) (cdi->ops->capability & ~cdi->mask & (type))
337 
338 /* used in the audio ioctls */
339 #define CHECKAUDIO if ((ret=check_for_audio_disc(cdi, cdo))) return ret
340 
341 /* Not-exported routines. */
342 static int open_for_data(struct cdrom_device_info * cdi);
343 static int check_for_audio_disc(struct cdrom_device_info * cdi,
344 			 struct cdrom_device_ops * cdo);
345 static void sanitize_format(union cdrom_addr *addr,
346 		u_char * curr, u_char requested);
347 static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
348 		     unsigned long arg);
349 
350 int cdrom_get_last_written(struct cdrom_device_info *, long *);
351 static int cdrom_get_next_writable(struct cdrom_device_info *, long *);
352 static void cdrom_count_tracks(struct cdrom_device_info *, tracktype*);
353 
354 static int cdrom_mrw_exit(struct cdrom_device_info *cdi);
355 
356 static int cdrom_get_disc_info(struct cdrom_device_info *cdi, disc_information *di);
357 
358 #ifdef CONFIG_SYSCTL
359 static void cdrom_sysctl_register(void);
360 #endif /* CONFIG_SYSCTL */
361 static struct cdrom_device_info *topCdromPtr;
362 
363 static int cdrom_dummy_generic_packet(struct cdrom_device_info *cdi,
364 				      struct packet_command *cgc)
365 {
366 	if (cgc->sense) {
367 		cgc->sense->sense_key = 0x05;
368 		cgc->sense->asc = 0x20;
369 		cgc->sense->ascq = 0x00;
370 	}
371 
372 	cgc->stat = -EIO;
373 	return -EIO;
374 }
375 
376 /* This macro makes sure we don't have to check on cdrom_device_ops
377  * existence in the run-time routines below. Change_capability is a
378  * hack to have the capability flags defined const, while we can still
379  * change it here without gcc complaining at every line.
380  */
381 #define ENSURE(call, bits) if (cdo->call == NULL) *change_capability &= ~(bits)
382 
383 int register_cdrom(struct cdrom_device_info *cdi)
384 {
385 	static char banner_printed;
386         struct cdrom_device_ops *cdo = cdi->ops;
387         int *change_capability = (int *)&cdo->capability; /* hack */
388 
389 	cdinfo(CD_OPEN, "entering register_cdrom\n");
390 
391 	if (cdo->open == NULL || cdo->release == NULL)
392 		return -2;
393 	if (!banner_printed) {
394 		printk(KERN_INFO "Uniform CD-ROM driver " REVISION "\n");
395 		banner_printed = 1;
396 #ifdef CONFIG_SYSCTL
397 		cdrom_sysctl_register();
398 #endif /* CONFIG_SYSCTL */
399 	}
400 
401 	ENSURE(drive_status, CDC_DRIVE_STATUS );
402 	ENSURE(media_changed, CDC_MEDIA_CHANGED);
403 	ENSURE(tray_move, CDC_CLOSE_TRAY | CDC_OPEN_TRAY);
404 	ENSURE(lock_door, CDC_LOCK);
405 	ENSURE(select_speed, CDC_SELECT_SPEED);
406 	ENSURE(get_last_session, CDC_MULTI_SESSION);
407 	ENSURE(get_mcn, CDC_MCN);
408 	ENSURE(reset, CDC_RESET);
409 	ENSURE(audio_ioctl, CDC_PLAY_AUDIO);
410 	ENSURE(dev_ioctl, CDC_IOCTLS);
411 	ENSURE(generic_packet, CDC_GENERIC_PACKET);
412 	cdi->mc_flags = 0;
413 	cdo->n_minors = 0;
414         cdi->options = CDO_USE_FFLAGS;
415 
416 	if (autoclose==1 && CDROM_CAN(CDC_CLOSE_TRAY))
417 		cdi->options |= (int) CDO_AUTO_CLOSE;
418 	if (autoeject==1 && CDROM_CAN(CDC_OPEN_TRAY))
419 		cdi->options |= (int) CDO_AUTO_EJECT;
420 	if (lockdoor==1)
421 		cdi->options |= (int) CDO_LOCK;
422 	if (check_media_type==1)
423 		cdi->options |= (int) CDO_CHECK_TYPE;
424 
425 	if (CDROM_CAN(CDC_MRW_W))
426 		cdi->exit = cdrom_mrw_exit;
427 
428 	if (cdi->disk)
429 		cdi->cdda_method = CDDA_BPC_FULL;
430 	else
431 		cdi->cdda_method = CDDA_OLD;
432 
433 	if (!cdo->generic_packet)
434 		cdo->generic_packet = cdrom_dummy_generic_packet;
435 
436 	cdinfo(CD_REG_UNREG, "drive \"/dev/%s\" registered\n", cdi->name);
437 	spin_lock(&cdrom_lock);
438 	cdi->next = topCdromPtr;
439 	topCdromPtr = cdi;
440 	spin_unlock(&cdrom_lock);
441 	return 0;
442 }
443 #undef ENSURE
444 
445 int unregister_cdrom(struct cdrom_device_info *unreg)
446 {
447 	struct cdrom_device_info *cdi, *prev;
448 	cdinfo(CD_OPEN, "entering unregister_cdrom\n");
449 
450 	prev = NULL;
451 	spin_lock(&cdrom_lock);
452 	cdi = topCdromPtr;
453 	while (cdi && cdi != unreg) {
454 		prev = cdi;
455 		cdi = cdi->next;
456 	}
457 
458 	if (cdi == NULL) {
459 		spin_unlock(&cdrom_lock);
460 		return -2;
461 	}
462 	if (prev)
463 		prev->next = cdi->next;
464 	else
465 		topCdromPtr = cdi->next;
466 
467 	spin_unlock(&cdrom_lock);
468 
469 	if (cdi->exit)
470 		cdi->exit(cdi);
471 
472 	cdi->ops->n_minors--;
473 	cdinfo(CD_REG_UNREG, "drive \"/dev/%s\" unregistered\n", cdi->name);
474 	return 0;
475 }
476 
477 int cdrom_get_media_event(struct cdrom_device_info *cdi,
478 			  struct media_event_desc *med)
479 {
480 	struct packet_command cgc;
481 	unsigned char buffer[8];
482 	struct event_header *eh = (struct event_header *) buffer;
483 
484 	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
485 	cgc.cmd[0] = GPCMD_GET_EVENT_STATUS_NOTIFICATION;
486 	cgc.cmd[1] = 1;		/* IMMED */
487 	cgc.cmd[4] = 1 << 4;	/* media event */
488 	cgc.cmd[8] = sizeof(buffer);
489 	cgc.quiet = 1;
490 
491 	if (cdi->ops->generic_packet(cdi, &cgc))
492 		return 1;
493 
494 	if (be16_to_cpu(eh->data_len) < sizeof(*med))
495 		return 1;
496 
497 	if (eh->nea || eh->notification_class != 0x4)
498 		return 1;
499 
500 	memcpy(med, &buffer[sizeof(*eh)], sizeof(*med));
501 	return 0;
502 }
503 
504 /*
505  * the first prototypes used 0x2c as the page code for the mrw mode page,
506  * subsequently this was changed to 0x03. probe the one used by this drive
507  */
508 static int cdrom_mrw_probe_pc(struct cdrom_device_info *cdi)
509 {
510 	struct packet_command cgc;
511 	char buffer[16];
512 
513 	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
514 
515 	cgc.timeout = HZ;
516 	cgc.quiet = 1;
517 
518 	if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC, 0)) {
519 		cdi->mrw_mode_page = MRW_MODE_PC;
520 		return 0;
521 	} else if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC_PRE1, 0)) {
522 		cdi->mrw_mode_page = MRW_MODE_PC_PRE1;
523 		return 0;
524 	}
525 
526 	return 1;
527 }
528 
529 static int cdrom_is_mrw(struct cdrom_device_info *cdi, int *write)
530 {
531 	struct packet_command cgc;
532 	struct mrw_feature_desc *mfd;
533 	unsigned char buffer[16];
534 	int ret;
535 
536 	*write = 0;
537 
538 	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
539 
540 	cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
541 	cgc.cmd[3] = CDF_MRW;
542 	cgc.cmd[8] = sizeof(buffer);
543 	cgc.quiet = 1;
544 
545 	if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
546 		return ret;
547 
548 	mfd = (struct mrw_feature_desc *)&buffer[sizeof(struct feature_header)];
549 	if (be16_to_cpu(mfd->feature_code) != CDF_MRW)
550 		return 1;
551 	*write = mfd->write;
552 
553 	if ((ret = cdrom_mrw_probe_pc(cdi))) {
554 		*write = 0;
555 		return ret;
556 	}
557 
558 	return 0;
559 }
560 
561 static int cdrom_mrw_bgformat(struct cdrom_device_info *cdi, int cont)
562 {
563 	struct packet_command cgc;
564 	unsigned char buffer[12];
565 	int ret;
566 
567 	printk(KERN_INFO "cdrom: %sstarting format\n", cont ? "Re" : "");
568 
569 	/*
570 	 * FmtData bit set (bit 4), format type is 1
571 	 */
572 	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_WRITE);
573 	cgc.cmd[0] = GPCMD_FORMAT_UNIT;
574 	cgc.cmd[1] = (1 << 4) | 1;
575 
576 	cgc.timeout = 5 * 60 * HZ;
577 
578 	/*
579 	 * 4 byte format list header, 8 byte format list descriptor
580 	 */
581 	buffer[1] = 1 << 1;
582 	buffer[3] = 8;
583 
584 	/*
585 	 * nr_blocks field
586 	 */
587 	buffer[4] = 0xff;
588 	buffer[5] = 0xff;
589 	buffer[6] = 0xff;
590 	buffer[7] = 0xff;
591 
592 	buffer[8] = 0x24 << 2;
593 	buffer[11] = cont;
594 
595 	ret = cdi->ops->generic_packet(cdi, &cgc);
596 	if (ret)
597 		printk(KERN_INFO "cdrom: bgformat failed\n");
598 
599 	return ret;
600 }
601 
602 static int cdrom_mrw_bgformat_susp(struct cdrom_device_info *cdi, int immed)
603 {
604 	struct packet_command cgc;
605 
606 	init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
607 	cgc.cmd[0] = GPCMD_CLOSE_TRACK;
608 
609 	/*
610 	 * Session = 1, Track = 0
611 	 */
612 	cgc.cmd[1] = !!immed;
613 	cgc.cmd[2] = 1 << 1;
614 
615 	cgc.timeout = 5 * 60 * HZ;
616 
617 	return cdi->ops->generic_packet(cdi, &cgc);
618 }
619 
620 static int cdrom_flush_cache(struct cdrom_device_info *cdi)
621 {
622 	struct packet_command cgc;
623 
624 	init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
625 	cgc.cmd[0] = GPCMD_FLUSH_CACHE;
626 
627 	cgc.timeout = 5 * 60 * HZ;
628 
629 	return cdi->ops->generic_packet(cdi, &cgc);
630 }
631 
632 static int cdrom_mrw_exit(struct cdrom_device_info *cdi)
633 {
634 	disc_information di;
635 	int ret;
636 
637 	ret = cdrom_get_disc_info(cdi, &di);
638 	if (ret < 0 || ret < (int)offsetof(typeof(di),disc_type))
639 		return 1;
640 
641 	ret = 0;
642 	if (di.mrw_status == CDM_MRW_BGFORMAT_ACTIVE) {
643 		printk(KERN_INFO "cdrom: issuing MRW back ground "
644 				"format suspend\n");
645 		ret = cdrom_mrw_bgformat_susp(cdi, 0);
646 	}
647 
648 	if (!ret && cdi->media_written)
649 		ret = cdrom_flush_cache(cdi);
650 
651 	return ret;
652 }
653 
654 static int cdrom_mrw_set_lba_space(struct cdrom_device_info *cdi, int space)
655 {
656 	struct packet_command cgc;
657 	struct mode_page_header *mph;
658 	char buffer[16];
659 	int ret, offset, size;
660 
661 	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
662 
663 	cgc.buffer = buffer;
664 	cgc.buflen = sizeof(buffer);
665 
666 	if ((ret = cdrom_mode_sense(cdi, &cgc, cdi->mrw_mode_page, 0)))
667 		return ret;
668 
669 	mph = (struct mode_page_header *) buffer;
670 	offset = be16_to_cpu(mph->desc_length);
671 	size = be16_to_cpu(mph->mode_data_length) + 2;
672 
673 	buffer[offset + 3] = space;
674 	cgc.buflen = size;
675 
676 	if ((ret = cdrom_mode_select(cdi, &cgc)))
677 		return ret;
678 
679 	printk(KERN_INFO "cdrom: %s: mrw address space %s selected\n", cdi->name, mrw_address_space[space]);
680 	return 0;
681 }
682 
683 static int cdrom_get_random_writable(struct cdrom_device_info *cdi,
684 			      struct rwrt_feature_desc *rfd)
685 {
686 	struct packet_command cgc;
687 	char buffer[24];
688 	int ret;
689 
690 	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
691 
692 	cgc.cmd[0] = GPCMD_GET_CONFIGURATION;	/* often 0x46 */
693 	cgc.cmd[3] = CDF_RWRT;			/* often 0x0020 */
694 	cgc.cmd[8] = sizeof(buffer);		/* often 0x18 */
695 	cgc.quiet = 1;
696 
697 	if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
698 		return ret;
699 
700 	memcpy(rfd, &buffer[sizeof(struct feature_header)], sizeof (*rfd));
701 	return 0;
702 }
703 
704 static int cdrom_has_defect_mgt(struct cdrom_device_info *cdi)
705 {
706 	struct packet_command cgc;
707 	char buffer[16];
708 	__u16 *feature_code;
709 	int ret;
710 
711 	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
712 
713 	cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
714 	cgc.cmd[3] = CDF_HWDM;
715 	cgc.cmd[8] = sizeof(buffer);
716 	cgc.quiet = 1;
717 
718 	if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
719 		return ret;
720 
721 	feature_code = (__u16 *) &buffer[sizeof(struct feature_header)];
722 	if (be16_to_cpu(*feature_code) == CDF_HWDM)
723 		return 0;
724 
725 	return 1;
726 }
727 
728 
729 static int cdrom_is_random_writable(struct cdrom_device_info *cdi, int *write)
730 {
731 	struct rwrt_feature_desc rfd;
732 	int ret;
733 
734 	*write = 0;
735 
736 	if ((ret = cdrom_get_random_writable(cdi, &rfd)))
737 		return ret;
738 
739 	if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
740 		*write = 1;
741 
742 	return 0;
743 }
744 
745 static int cdrom_media_erasable(struct cdrom_device_info *cdi)
746 {
747 	disc_information di;
748 	int ret;
749 
750 	ret = cdrom_get_disc_info(cdi, &di);
751 	if (ret < 0 || ret < offsetof(typeof(di), n_first_track))
752 		return -1;
753 
754 	return di.erasable;
755 }
756 
757 /*
758  * FIXME: check RO bit
759  */
760 static int cdrom_dvdram_open_write(struct cdrom_device_info *cdi)
761 {
762 	int ret = cdrom_media_erasable(cdi);
763 
764 	/*
765 	 * allow writable open if media info read worked and media is
766 	 * erasable, _or_ if it fails since not all drives support it
767 	 */
768 	if (!ret)
769 		return 1;
770 
771 	return 0;
772 }
773 
774 static int cdrom_mrw_open_write(struct cdrom_device_info *cdi)
775 {
776 	disc_information di;
777 	int ret;
778 
779 	/*
780 	 * always reset to DMA lba space on open
781 	 */
782 	if (cdrom_mrw_set_lba_space(cdi, MRW_LBA_DMA)) {
783 		printk(KERN_ERR "cdrom: failed setting lba address space\n");
784 		return 1;
785 	}
786 
787 	ret = cdrom_get_disc_info(cdi, &di);
788 	if (ret < 0 || ret < offsetof(typeof(di),disc_type))
789 		return 1;
790 
791 	if (!di.erasable)
792 		return 1;
793 
794 	/*
795 	 * mrw_status
796 	 * 0	-	not MRW formatted
797 	 * 1	-	MRW bgformat started, but not running or complete
798 	 * 2	-	MRW bgformat in progress
799 	 * 3	-	MRW formatting complete
800 	 */
801 	ret = 0;
802 	printk(KERN_INFO "cdrom open: mrw_status '%s'\n",
803 			mrw_format_status[di.mrw_status]);
804 	if (!di.mrw_status)
805 		ret = 1;
806 	else if (di.mrw_status == CDM_MRW_BGFORMAT_INACTIVE &&
807 			mrw_format_restart)
808 		ret = cdrom_mrw_bgformat(cdi, 1);
809 
810 	return ret;
811 }
812 
813 static int mo_open_write(struct cdrom_device_info *cdi)
814 {
815 	struct packet_command cgc;
816 	char buffer[255];
817 	int ret;
818 
819 	init_cdrom_command(&cgc, &buffer, 4, CGC_DATA_READ);
820 	cgc.quiet = 1;
821 
822 	/*
823 	 * obtain write protect information as per
824 	 * drivers/scsi/sd.c:sd_read_write_protect_flag
825 	 */
826 
827 	ret = cdrom_mode_sense(cdi, &cgc, GPMODE_ALL_PAGES, 0);
828 	if (ret)
829 		ret = cdrom_mode_sense(cdi, &cgc, GPMODE_VENDOR_PAGE, 0);
830 	if (ret) {
831 		cgc.buflen = 255;
832 		ret = cdrom_mode_sense(cdi, &cgc, GPMODE_ALL_PAGES, 0);
833 	}
834 
835 	/* drive gave us no info, let the user go ahead */
836 	if (ret)
837 		return 0;
838 
839 	return buffer[3] & 0x80;
840 }
841 
842 static int cdrom_ram_open_write(struct cdrom_device_info *cdi)
843 {
844 	struct rwrt_feature_desc rfd;
845 	int ret;
846 
847 	if ((ret = cdrom_has_defect_mgt(cdi)))
848 		return ret;
849 
850 	if ((ret = cdrom_get_random_writable(cdi, &rfd)))
851 		return ret;
852 	else if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
853 		ret = !rfd.curr;
854 
855 	cdinfo(CD_OPEN, "can open for random write\n");
856 	return ret;
857 }
858 
859 static void cdrom_mmc3_profile(struct cdrom_device_info *cdi)
860 {
861 	struct packet_command cgc;
862 	char buffer[32];
863 	int ret, mmc3_profile;
864 
865 	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
866 
867 	cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
868 	cgc.cmd[1] = 0;
869 	cgc.cmd[2] = cgc.cmd[3] = 0;		/* Starting Feature Number */
870 	cgc.cmd[8] = sizeof(buffer);		/* Allocation Length */
871 	cgc.quiet = 1;
872 
873 	if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
874 		mmc3_profile = 0xffff;
875 	else
876 		mmc3_profile = (buffer[6] << 8) | buffer[7];
877 
878 	cdi->mmc3_profile = mmc3_profile;
879 }
880 
881 static int cdrom_is_dvd_rw(struct cdrom_device_info *cdi)
882 {
883 	switch (cdi->mmc3_profile) {
884 	case 0x12:	/* DVD-RAM	*/
885 	case 0x1A:	/* DVD+RW	*/
886 		return 0;
887 	default:
888 		return 1;
889 	}
890 }
891 
892 /*
893  * returns 0 for ok to open write, non-0 to disallow
894  */
895 static int cdrom_open_write(struct cdrom_device_info *cdi)
896 {
897 	int mrw, mrw_write, ram_write;
898 	int ret = 1;
899 
900 	mrw = 0;
901 	if (!cdrom_is_mrw(cdi, &mrw_write))
902 		mrw = 1;
903 
904 	if (CDROM_CAN(CDC_MO_DRIVE))
905 		ram_write = 1;
906 	else
907 		(void) cdrom_is_random_writable(cdi, &ram_write);
908 
909 	if (mrw)
910 		cdi->mask &= ~CDC_MRW;
911 	else
912 		cdi->mask |= CDC_MRW;
913 
914 	if (mrw_write)
915 		cdi->mask &= ~CDC_MRW_W;
916 	else
917 		cdi->mask |= CDC_MRW_W;
918 
919 	if (ram_write)
920 		cdi->mask &= ~CDC_RAM;
921 	else
922 		cdi->mask |= CDC_RAM;
923 
924 	if (CDROM_CAN(CDC_MRW_W))
925 		ret = cdrom_mrw_open_write(cdi);
926 	else if (CDROM_CAN(CDC_DVD_RAM))
927 		ret = cdrom_dvdram_open_write(cdi);
928  	else if (CDROM_CAN(CDC_RAM) &&
929  		 !CDROM_CAN(CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_MRW|CDC_MO_DRIVE))
930  		ret = cdrom_ram_open_write(cdi);
931 	else if (CDROM_CAN(CDC_MO_DRIVE))
932 		ret = mo_open_write(cdi);
933 	else if (!cdrom_is_dvd_rw(cdi))
934 		ret = 0;
935 
936 	return ret;
937 }
938 
939 static void cdrom_dvd_rw_close_write(struct cdrom_device_info *cdi)
940 {
941 	struct packet_command cgc;
942 
943 	if (cdi->mmc3_profile != 0x1a) {
944 		cdinfo(CD_CLOSE, "%s: No DVD+RW\n", cdi->name);
945 		return;
946 	}
947 
948 	if (!cdi->media_written) {
949 		cdinfo(CD_CLOSE, "%s: DVD+RW media clean\n", cdi->name);
950 		return;
951 	}
952 
953 	printk(KERN_INFO "cdrom: %s: dirty DVD+RW media, \"finalizing\"\n",
954 	       cdi->name);
955 
956 	init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
957 	cgc.cmd[0] = GPCMD_FLUSH_CACHE;
958 	cgc.timeout = 30*HZ;
959 	cdi->ops->generic_packet(cdi, &cgc);
960 
961 	init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
962 	cgc.cmd[0] = GPCMD_CLOSE_TRACK;
963 	cgc.timeout = 3000*HZ;
964 	cgc.quiet = 1;
965 	cdi->ops->generic_packet(cdi, &cgc);
966 
967 	init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
968 	cgc.cmd[0] = GPCMD_CLOSE_TRACK;
969 	cgc.cmd[2] = 2;	 /* Close session */
970 	cgc.quiet = 1;
971 	cgc.timeout = 3000*HZ;
972 	cdi->ops->generic_packet(cdi, &cgc);
973 
974 	cdi->media_written = 0;
975 }
976 
977 static int cdrom_close_write(struct cdrom_device_info *cdi)
978 {
979 #if 0
980 	return cdrom_flush_cache(cdi);
981 #else
982 	return 0;
983 #endif
984 }
985 
986 /* We use the open-option O_NONBLOCK to indicate that the
987  * purpose of opening is only for subsequent ioctl() calls; no device
988  * integrity checks are performed.
989  *
990  * We hope that all cd-player programs will adopt this convention. It
991  * is in their own interest: device control becomes a lot easier
992  * this way.
993  */
994 int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip, struct file *fp)
995 {
996 	int ret;
997 
998 	cdinfo(CD_OPEN, "entering cdrom_open\n");
999 
1000 	/* if this was a O_NONBLOCK open and we should honor the flags,
1001 	 * do a quick open without drive/disc integrity checks. */
1002 	cdi->use_count++;
1003 	if ((fp->f_flags & O_NONBLOCK) && (cdi->options & CDO_USE_FFLAGS)) {
1004 		ret = cdi->ops->open(cdi, 1);
1005 	} else {
1006 		ret = open_for_data(cdi);
1007 		if (ret)
1008 			goto err;
1009 		cdrom_mmc3_profile(cdi);
1010 		if (fp->f_mode & FMODE_WRITE) {
1011 			ret = -EROFS;
1012 			if (cdrom_open_write(cdi))
1013 				goto err;
1014 			if (!CDROM_CAN(CDC_RAM))
1015 				goto err;
1016 			ret = 0;
1017 			cdi->media_written = 0;
1018 		}
1019 	}
1020 
1021 	if (ret)
1022 		goto err;
1023 
1024 	cdinfo(CD_OPEN, "Use count for \"/dev/%s\" now %d\n",
1025 			cdi->name, cdi->use_count);
1026 	/* Do this on open.  Don't wait for mount, because they might
1027 	    not be mounting, but opening with O_NONBLOCK */
1028 	check_disk_change(ip->i_bdev);
1029 	return 0;
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_WARNING, "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 /* Just about every imaginable ioctl is supported in the Uniform layer
2200  * these days. ATAPI / SCSI specific code now mainly resides in
2201  * mmc_ioct().
2202  */
2203 int cdrom_ioctl(struct file * file, struct cdrom_device_info *cdi,
2204 		struct inode *ip, unsigned int cmd, unsigned long arg)
2205 {
2206 	struct cdrom_device_ops *cdo = cdi->ops;
2207 	int ret;
2208 
2209 	/* Try the generic SCSI command ioctl's first.. */
2210 	ret = scsi_cmd_ioctl(file, ip->i_bdev->bd_disk, cmd, (void __user *)arg);
2211 	if (ret != -ENOTTY)
2212 		return ret;
2213 
2214 	/* the first few commands do not deal with audio drive_info, but
2215 	   only with routines in cdrom device operations. */
2216 	switch (cmd) {
2217 	case CDROMMULTISESSION: {
2218 		struct cdrom_multisession ms_info;
2219 		u_char requested_format;
2220 		cdinfo(CD_DO_IOCTL, "entering CDROMMULTISESSION\n");
2221                 if (!(cdo->capability & CDC_MULTI_SESSION))
2222                         return -ENOSYS;
2223 		IOCTL_IN(arg, struct cdrom_multisession, ms_info);
2224 		requested_format = ms_info.addr_format;
2225 		if (!((requested_format == CDROM_MSF) ||
2226 			(requested_format == CDROM_LBA)))
2227 				return -EINVAL;
2228 		ms_info.addr_format = CDROM_LBA;
2229 		if ((ret=cdo->get_last_session(cdi, &ms_info)))
2230 			return ret;
2231 		sanitize_format(&ms_info.addr, &ms_info.addr_format,
2232 				requested_format);
2233 		IOCTL_OUT(arg, struct cdrom_multisession, ms_info);
2234 		cdinfo(CD_DO_IOCTL, "CDROMMULTISESSION successful\n");
2235 		return 0;
2236 		}
2237 
2238 	case CDROMEJECT: {
2239 		cdinfo(CD_DO_IOCTL, "entering CDROMEJECT\n");
2240 		if (!CDROM_CAN(CDC_OPEN_TRAY))
2241 			return -ENOSYS;
2242 		if (cdi->use_count != 1 || keeplocked)
2243 			return -EBUSY;
2244 		if (CDROM_CAN(CDC_LOCK))
2245 			if ((ret=cdo->lock_door(cdi, 0)))
2246 				return ret;
2247 
2248 		return cdo->tray_move(cdi, 1);
2249 		}
2250 
2251 	case CDROMCLOSETRAY: {
2252 		cdinfo(CD_DO_IOCTL, "entering CDROMCLOSETRAY\n");
2253 		if (!CDROM_CAN(CDC_CLOSE_TRAY))
2254 			return -ENOSYS;
2255 		return cdo->tray_move(cdi, 0);
2256 		}
2257 
2258 	case CDROMEJECT_SW: {
2259 		cdinfo(CD_DO_IOCTL, "entering CDROMEJECT_SW\n");
2260 		if (!CDROM_CAN(CDC_OPEN_TRAY))
2261 			return -ENOSYS;
2262 		if (keeplocked)
2263 			return -EBUSY;
2264 		cdi->options &= ~(CDO_AUTO_CLOSE | CDO_AUTO_EJECT);
2265 		if (arg)
2266 			cdi->options |= CDO_AUTO_CLOSE | CDO_AUTO_EJECT;
2267 		return 0;
2268 		}
2269 
2270 	case CDROM_MEDIA_CHANGED: {
2271 		struct cdrom_changer_info *info;
2272 		int changed;
2273 
2274 		cdinfo(CD_DO_IOCTL, "entering CDROM_MEDIA_CHANGED\n");
2275 		if (!CDROM_CAN(CDC_MEDIA_CHANGED))
2276 			return -ENOSYS;
2277 
2278 		/* cannot select disc or select current disc */
2279 		if (!CDROM_CAN(CDC_SELECT_DISC) || arg == CDSL_CURRENT)
2280 			return media_changed(cdi, 1);
2281 
2282 		if ((unsigned int)arg >= cdi->capacity)
2283 			return -EINVAL;
2284 
2285 		info = kmalloc(sizeof(*info), GFP_KERNEL);
2286 		if (!info)
2287 			return -ENOMEM;
2288 
2289 		if ((ret = cdrom_read_mech_status(cdi, info))) {
2290 			kfree(info);
2291 			return ret;
2292 		}
2293 
2294 		changed = info->slots[arg].change;
2295 		kfree(info);
2296 		return changed;
2297 		}
2298 
2299 	case CDROM_SET_OPTIONS: {
2300 		cdinfo(CD_DO_IOCTL, "entering CDROM_SET_OPTIONS\n");
2301 		/* options need to be in sync with capability. too late for
2302 		   that, so we have to check each one separately... */
2303 		switch (arg) {
2304 		case CDO_USE_FFLAGS:
2305 		case CDO_CHECK_TYPE:
2306 			break;
2307 		case CDO_LOCK:
2308 			if (!CDROM_CAN(CDC_LOCK))
2309 				return -ENOSYS;
2310 			break;
2311 		case 0:
2312 			return cdi->options;
2313 		/* default is basically CDO_[AUTO_CLOSE|AUTO_EJECT] */
2314 		default:
2315 			if (!CDROM_CAN(arg))
2316 				return -ENOSYS;
2317 		}
2318 		cdi->options |= (int) arg;
2319 		return cdi->options;
2320 		}
2321 
2322 	case CDROM_CLEAR_OPTIONS: {
2323 		cdinfo(CD_DO_IOCTL, "entering CDROM_CLEAR_OPTIONS\n");
2324 		cdi->options &= ~(int) arg;
2325 		return cdi->options;
2326 		}
2327 
2328 	case CDROM_SELECT_SPEED: {
2329 		cdinfo(CD_DO_IOCTL, "entering CDROM_SELECT_SPEED\n");
2330 		if (!CDROM_CAN(CDC_SELECT_SPEED))
2331 			return -ENOSYS;
2332 		return cdo->select_speed(cdi, arg);
2333 		}
2334 
2335 	case CDROM_SELECT_DISC: {
2336 		cdinfo(CD_DO_IOCTL, "entering CDROM_SELECT_DISC\n");
2337 		if (!CDROM_CAN(CDC_SELECT_DISC))
2338 			return -ENOSYS;
2339 
2340                 if ((arg != CDSL_CURRENT) && (arg != CDSL_NONE))
2341 			if ((int)arg >= cdi->capacity)
2342 				return -EINVAL;
2343 
2344 		/* cdo->select_disc is a hook to allow a driver-specific
2345 		 * way of seleting disc.  However, since there is no
2346 		 * equiv hook for cdrom_slot_status this may not
2347 		 * actually be useful...
2348 		 */
2349 		if (cdo->select_disc != NULL)
2350 			return cdo->select_disc(cdi, arg);
2351 
2352 		/* no driver specific select_disc(), call our own */
2353 		cdinfo(CD_CHANGER, "Using generic cdrom_select_disc()\n");
2354 		return cdrom_select_disc(cdi, arg);
2355 		}
2356 
2357 	case CDROMRESET: {
2358 		if (!capable(CAP_SYS_ADMIN))
2359 			return -EACCES;
2360 		cdinfo(CD_DO_IOCTL, "entering CDROM_RESET\n");
2361 		if (!CDROM_CAN(CDC_RESET))
2362 			return -ENOSYS;
2363 		invalidate_bdev(ip->i_bdev, 0);
2364 		return cdo->reset(cdi);
2365 		}
2366 
2367 	case CDROM_LOCKDOOR: {
2368 		cdinfo(CD_DO_IOCTL, "%socking door.\n", arg ? "L" : "Unl");
2369 		if (!CDROM_CAN(CDC_LOCK))
2370 			return -EDRIVE_CANT_DO_THIS;
2371 		keeplocked = arg ? 1 : 0;
2372 		/* don't unlock the door on multiple opens,but allow root
2373 		 * to do so */
2374 		if ((cdi->use_count != 1) && !arg && !capable(CAP_SYS_ADMIN))
2375 			return -EBUSY;
2376 		return cdo->lock_door(cdi, arg);
2377 		}
2378 
2379 	case CDROM_DEBUG: {
2380 		if (!capable(CAP_SYS_ADMIN))
2381 			return -EACCES;
2382 		cdinfo(CD_DO_IOCTL, "%sabling debug.\n", arg ? "En" : "Dis");
2383 		debug = arg ? 1 : 0;
2384 		return debug;
2385 		}
2386 
2387 	case CDROM_GET_CAPABILITY: {
2388 		cdinfo(CD_DO_IOCTL, "entering CDROM_GET_CAPABILITY\n");
2389 		return (cdo->capability & ~cdi->mask);
2390 		}
2391 
2392 /* The following function is implemented, although very few audio
2393  * discs give Universal Product Code information, which should just be
2394  * the Medium Catalog Number on the box.  Note, that the way the code
2395  * is written on the CD is /not/ uniform across all discs!
2396  */
2397 	case CDROM_GET_MCN: {
2398 		struct cdrom_mcn mcn;
2399 		cdinfo(CD_DO_IOCTL, "entering CDROM_GET_MCN\n");
2400 		if (!(cdo->capability & CDC_MCN))
2401 			return -ENOSYS;
2402 		if ((ret=cdo->get_mcn(cdi, &mcn)))
2403 			return ret;
2404 		IOCTL_OUT(arg, struct cdrom_mcn, mcn);
2405 		cdinfo(CD_DO_IOCTL, "CDROM_GET_MCN successful\n");
2406 		return 0;
2407 		}
2408 
2409 	case CDROM_DRIVE_STATUS: {
2410 		cdinfo(CD_DO_IOCTL, "entering CDROM_DRIVE_STATUS\n");
2411 		if (!(cdo->capability & CDC_DRIVE_STATUS))
2412 			return -ENOSYS;
2413 		if (!CDROM_CAN(CDC_SELECT_DISC))
2414 			return cdo->drive_status(cdi, CDSL_CURRENT);
2415                 if ((arg == CDSL_CURRENT) || (arg == CDSL_NONE))
2416 			return cdo->drive_status(cdi, CDSL_CURRENT);
2417 		if (((int)arg >= cdi->capacity))
2418 			return -EINVAL;
2419 		return cdrom_slot_status(cdi, arg);
2420 		}
2421 
2422 	/* Ok, this is where problems start.  The current interface for the
2423 	   CDROM_DISC_STATUS ioctl is flawed.  It makes the false assumption
2424 	   that CDs are all CDS_DATA_1 or all CDS_AUDIO, etc.  Unfortunatly,
2425 	   while this is often the case, it is also very common for CDs to
2426 	   have some tracks with data, and some tracks with audio.  Just
2427 	   because I feel like it, I declare the following to be the best
2428 	   way to cope.  If the CD has ANY data tracks on it, it will be
2429 	   returned as a data CD.  If it has any XA tracks, I will return
2430 	   it as that.  Now I could simplify this interface by combining these
2431 	   returns with the above, but this more clearly demonstrates
2432 	   the problem with the current interface.  Too bad this wasn't
2433 	   designed to use bitmasks...         -Erik
2434 
2435 	   Well, now we have the option CDS_MIXED: a mixed-type CD.
2436 	   User level programmers might feel the ioctl is not very useful.
2437 	   					---david
2438 	*/
2439 	case CDROM_DISC_STATUS: {
2440 		tracktype tracks;
2441 		cdinfo(CD_DO_IOCTL, "entering CDROM_DISC_STATUS\n");
2442 		cdrom_count_tracks(cdi, &tracks);
2443 		if (tracks.error)
2444 			return(tracks.error);
2445 
2446 		/* Policy mode on */
2447 		if (tracks.audio > 0) {
2448 			if (tracks.data==0 && tracks.cdi==0 && tracks.xa==0)
2449 				return CDS_AUDIO;
2450 			else
2451 				return CDS_MIXED;
2452 		}
2453 		if (tracks.cdi > 0) return CDS_XA_2_2;
2454 		if (tracks.xa > 0) return CDS_XA_2_1;
2455 		if (tracks.data > 0) return CDS_DATA_1;
2456 		/* Policy mode off */
2457 
2458 		cdinfo(CD_WARNING,"This disc doesn't have any tracks I recognize!\n");
2459 		return CDS_NO_INFO;
2460 		}
2461 
2462 	case CDROM_CHANGER_NSLOTS: {
2463 		cdinfo(CD_DO_IOCTL, "entering CDROM_CHANGER_NSLOTS\n");
2464 		return cdi->capacity;
2465 		}
2466 	}
2467 
2468 	/* use the ioctls that are implemented through the generic_packet()
2469 	   interface. this may look at bit funny, but if -ENOTTY is
2470 	   returned that particular ioctl is not implemented and we
2471 	   let it go through the device specific ones. */
2472 	if (CDROM_CAN(CDC_GENERIC_PACKET)) {
2473 		ret = mmc_ioctl(cdi, cmd, arg);
2474 		if (ret != -ENOTTY) {
2475 			return ret;
2476 		}
2477 	}
2478 
2479 	/* note: most of the cdinfo() calls are commented out here,
2480 	   because they fill up the sys log when CD players poll
2481 	   the drive. */
2482 	switch (cmd) {
2483 	case CDROMSUBCHNL: {
2484 		struct cdrom_subchnl q;
2485 		u_char requested, back;
2486 		if (!CDROM_CAN(CDC_PLAY_AUDIO))
2487 			return -ENOSYS;
2488 		/* cdinfo(CD_DO_IOCTL,"entering CDROMSUBCHNL\n");*/
2489 		IOCTL_IN(arg, struct cdrom_subchnl, q);
2490 		requested = q.cdsc_format;
2491 		if (!((requested == CDROM_MSF) ||
2492 		      (requested == CDROM_LBA)))
2493 			return -EINVAL;
2494 		q.cdsc_format = CDROM_MSF;
2495 		if ((ret=cdo->audio_ioctl(cdi, cmd, &q)))
2496 			return ret;
2497 		back = q.cdsc_format; /* local copy */
2498 		sanitize_format(&q.cdsc_absaddr, &back, requested);
2499 		sanitize_format(&q.cdsc_reladdr, &q.cdsc_format, requested);
2500 		IOCTL_OUT(arg, struct cdrom_subchnl, q);
2501 		/* cdinfo(CD_DO_IOCTL, "CDROMSUBCHNL successful\n"); */
2502 		return 0;
2503 		}
2504 	case CDROMREADTOCHDR: {
2505 		struct cdrom_tochdr header;
2506 		if (!CDROM_CAN(CDC_PLAY_AUDIO))
2507 			return -ENOSYS;
2508 		/* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCHDR\n"); */
2509 		IOCTL_IN(arg, struct cdrom_tochdr, header);
2510 		if ((ret=cdo->audio_ioctl(cdi, cmd, &header)))
2511 			return ret;
2512 		IOCTL_OUT(arg, struct cdrom_tochdr, header);
2513 		/* cdinfo(CD_DO_IOCTL, "CDROMREADTOCHDR successful\n"); */
2514 		return 0;
2515 		}
2516 	case CDROMREADTOCENTRY: {
2517 		struct cdrom_tocentry entry;
2518 		u_char requested_format;
2519 		if (!CDROM_CAN(CDC_PLAY_AUDIO))
2520 			return -ENOSYS;
2521 		/* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCENTRY\n"); */
2522 		IOCTL_IN(arg, struct cdrom_tocentry, entry);
2523 		requested_format = entry.cdte_format;
2524 		if (!((requested_format == CDROM_MSF) ||
2525 			(requested_format == CDROM_LBA)))
2526 				return -EINVAL;
2527 		/* make interface to low-level uniform */
2528 		entry.cdte_format = CDROM_MSF;
2529 		if ((ret=cdo->audio_ioctl(cdi, cmd, &entry)))
2530 			return ret;
2531 		sanitize_format(&entry.cdte_addr,
2532 		&entry.cdte_format, requested_format);
2533 		IOCTL_OUT(arg, struct cdrom_tocentry, entry);
2534 		/* cdinfo(CD_DO_IOCTL, "CDROMREADTOCENTRY successful\n"); */
2535 		return 0;
2536 		}
2537 	case CDROMPLAYMSF: {
2538 		struct cdrom_msf msf;
2539 		if (!CDROM_CAN(CDC_PLAY_AUDIO))
2540 			return -ENOSYS;
2541 		cdinfo(CD_DO_IOCTL, "entering CDROMPLAYMSF\n");
2542 		IOCTL_IN(arg, struct cdrom_msf, msf);
2543 		return cdo->audio_ioctl(cdi, cmd, &msf);
2544 		}
2545 	case CDROMPLAYTRKIND: {
2546 		struct cdrom_ti ti;
2547 		if (!CDROM_CAN(CDC_PLAY_AUDIO))
2548 			return -ENOSYS;
2549 		cdinfo(CD_DO_IOCTL, "entering CDROMPLAYTRKIND\n");
2550 		IOCTL_IN(arg, struct cdrom_ti, ti);
2551 		CHECKAUDIO;
2552 		return cdo->audio_ioctl(cdi, cmd, &ti);
2553 		}
2554 	case CDROMVOLCTRL: {
2555 		struct cdrom_volctrl volume;
2556 		if (!CDROM_CAN(CDC_PLAY_AUDIO))
2557 			return -ENOSYS;
2558 		cdinfo(CD_DO_IOCTL, "entering CDROMVOLCTRL\n");
2559 		IOCTL_IN(arg, struct cdrom_volctrl, volume);
2560 		return cdo->audio_ioctl(cdi, cmd, &volume);
2561 		}
2562 	case CDROMVOLREAD: {
2563 		struct cdrom_volctrl volume;
2564 		if (!CDROM_CAN(CDC_PLAY_AUDIO))
2565 			return -ENOSYS;
2566 		cdinfo(CD_DO_IOCTL, "entering CDROMVOLREAD\n");
2567 		if ((ret=cdo->audio_ioctl(cdi, cmd, &volume)))
2568 			return ret;
2569 		IOCTL_OUT(arg, struct cdrom_volctrl, volume);
2570 		return 0;
2571 		}
2572 	case CDROMSTART:
2573 	case CDROMSTOP:
2574 	case CDROMPAUSE:
2575 	case CDROMRESUME: {
2576 		if (!CDROM_CAN(CDC_PLAY_AUDIO))
2577 			return -ENOSYS;
2578 		cdinfo(CD_DO_IOCTL, "doing audio ioctl (start/stop/pause/resume)\n");
2579 		CHECKAUDIO;
2580 		return cdo->audio_ioctl(cdi, cmd, NULL);
2581 		}
2582 	} /* switch */
2583 
2584 	/* do the device specific ioctls */
2585 	if (CDROM_CAN(CDC_IOCTLS))
2586 		return cdo->dev_ioctl(cdi, cmd, arg);
2587 
2588 	return -ENOSYS;
2589 }
2590 
2591 static inline
2592 int msf_to_lba(char m, char s, char f)
2593 {
2594 	return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
2595 }
2596 
2597 /*
2598  * Required when we need to use READ_10 to issue other than 2048 block
2599  * reads
2600  */
2601 static int cdrom_switch_blocksize(struct cdrom_device_info *cdi, int size)
2602 {
2603 	struct cdrom_device_ops *cdo = cdi->ops;
2604 	struct packet_command cgc;
2605 	struct modesel_head mh;
2606 
2607 	memset(&mh, 0, sizeof(mh));
2608 	mh.block_desc_length = 0x08;
2609 	mh.block_length_med = (size >> 8) & 0xff;
2610 	mh.block_length_lo = size & 0xff;
2611 
2612 	memset(&cgc, 0, sizeof(cgc));
2613 	cgc.cmd[0] = 0x15;
2614 	cgc.cmd[1] = 1 << 4;
2615 	cgc.cmd[4] = 12;
2616 	cgc.buflen = sizeof(mh);
2617 	cgc.buffer = (char *) &mh;
2618 	cgc.data_direction = CGC_DATA_WRITE;
2619 	mh.block_desc_length = 0x08;
2620 	mh.block_length_med = (size >> 8) & 0xff;
2621 	mh.block_length_lo = size & 0xff;
2622 
2623 	return cdo->generic_packet(cdi, &cgc);
2624 }
2625 
2626 static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
2627 		     unsigned long arg)
2628 {
2629 	struct cdrom_device_ops *cdo = cdi->ops;
2630 	struct packet_command cgc;
2631 	struct request_sense sense;
2632 	unsigned char buffer[32];
2633 	int ret = 0;
2634 
2635 	memset(&cgc, 0, sizeof(cgc));
2636 
2637 	/* build a unified command and queue it through
2638 	   cdo->generic_packet() */
2639 	switch (cmd) {
2640 	case CDROMREADRAW:
2641 	case CDROMREADMODE1:
2642 	case CDROMREADMODE2: {
2643 		struct cdrom_msf msf;
2644 		int blocksize = 0, format = 0, lba;
2645 
2646 		switch (cmd) {
2647 		case CDROMREADRAW:
2648 			blocksize = CD_FRAMESIZE_RAW;
2649 			break;
2650 		case CDROMREADMODE1:
2651 			blocksize = CD_FRAMESIZE;
2652 			format = 2;
2653 			break;
2654 		case CDROMREADMODE2:
2655 			blocksize = CD_FRAMESIZE_RAW0;
2656 			break;
2657 		}
2658 		IOCTL_IN(arg, struct cdrom_msf, msf);
2659 		lba = msf_to_lba(msf.cdmsf_min0,msf.cdmsf_sec0,msf.cdmsf_frame0);
2660 		/* FIXME: we need upper bound checking, too!! */
2661 		if (lba < 0)
2662 			return -EINVAL;
2663 		cgc.buffer = (char *) kmalloc(blocksize, GFP_KERNEL);
2664 		if (cgc.buffer == NULL)
2665 			return -ENOMEM;
2666 		memset(&sense, 0, sizeof(sense));
2667 		cgc.sense = &sense;
2668 		cgc.data_direction = CGC_DATA_READ;
2669 		ret = cdrom_read_block(cdi, &cgc, lba, 1, format, blocksize);
2670 		if (ret && sense.sense_key==0x05 && sense.asc==0x20 && sense.ascq==0x00) {
2671 			/*
2672 			 * SCSI-II devices are not required to support
2673 			 * READ_CD, so let's try switching block size
2674 			 */
2675 			/* FIXME: switch back again... */
2676 			if ((ret = cdrom_switch_blocksize(cdi, blocksize))) {
2677 				kfree(cgc.buffer);
2678 				return ret;
2679 			}
2680 			cgc.sense = NULL;
2681 			ret = cdrom_read_cd(cdi, &cgc, lba, blocksize, 1);
2682 			ret |= cdrom_switch_blocksize(cdi, blocksize);
2683 		}
2684 		if (!ret && copy_to_user((char __user *)arg, cgc.buffer, blocksize))
2685 			ret = -EFAULT;
2686 		kfree(cgc.buffer);
2687 		return ret;
2688 		}
2689 	case CDROMREADAUDIO: {
2690 		struct cdrom_read_audio ra;
2691 		int lba;
2692 
2693 		IOCTL_IN(arg, struct cdrom_read_audio, ra);
2694 
2695 		if (ra.addr_format == CDROM_MSF)
2696 			lba = msf_to_lba(ra.addr.msf.minute,
2697 					 ra.addr.msf.second,
2698 					 ra.addr.msf.frame);
2699 		else if (ra.addr_format == CDROM_LBA)
2700 			lba = ra.addr.lba;
2701 		else
2702 			return -EINVAL;
2703 
2704 		/* FIXME: we need upper bound checking, too!! */
2705 		if (lba < 0 || ra.nframes <= 0 || ra.nframes > CD_FRAMES)
2706 			return -EINVAL;
2707 
2708 		return cdrom_read_cdda(cdi, ra.buf, lba, ra.nframes);
2709 		}
2710 	case CDROMSUBCHNL: {
2711 		struct cdrom_subchnl q;
2712 		u_char requested, back;
2713 		IOCTL_IN(arg, struct cdrom_subchnl, q);
2714 		requested = q.cdsc_format;
2715 		if (!((requested == CDROM_MSF) ||
2716 		      (requested == CDROM_LBA)))
2717 			return -EINVAL;
2718 		q.cdsc_format = CDROM_MSF;
2719 		if ((ret = cdrom_read_subchannel(cdi, &q, 0)))
2720 			return ret;
2721 		back = q.cdsc_format; /* local copy */
2722 		sanitize_format(&q.cdsc_absaddr, &back, requested);
2723 		sanitize_format(&q.cdsc_reladdr, &q.cdsc_format, requested);
2724 		IOCTL_OUT(arg, struct cdrom_subchnl, q);
2725 		/* cdinfo(CD_DO_IOCTL, "CDROMSUBCHNL successful\n"); */
2726 		return 0;
2727 		}
2728 	case CDROMPLAYMSF: {
2729 		struct cdrom_msf msf;
2730 		cdinfo(CD_DO_IOCTL, "entering CDROMPLAYMSF\n");
2731 		IOCTL_IN(arg, struct cdrom_msf, msf);
2732 		cgc.cmd[0] = GPCMD_PLAY_AUDIO_MSF;
2733 		cgc.cmd[3] = msf.cdmsf_min0;
2734 		cgc.cmd[4] = msf.cdmsf_sec0;
2735 		cgc.cmd[5] = msf.cdmsf_frame0;
2736 		cgc.cmd[6] = msf.cdmsf_min1;
2737 		cgc.cmd[7] = msf.cdmsf_sec1;
2738 		cgc.cmd[8] = msf.cdmsf_frame1;
2739 		cgc.data_direction = CGC_DATA_NONE;
2740 		return cdo->generic_packet(cdi, &cgc);
2741 		}
2742 	case CDROMPLAYBLK: {
2743 		struct cdrom_blk blk;
2744 		cdinfo(CD_DO_IOCTL, "entering CDROMPLAYBLK\n");
2745 		IOCTL_IN(arg, struct cdrom_blk, blk);
2746 		cgc.cmd[0] = GPCMD_PLAY_AUDIO_10;
2747 		cgc.cmd[2] = (blk.from >> 24) & 0xff;
2748 		cgc.cmd[3] = (blk.from >> 16) & 0xff;
2749 		cgc.cmd[4] = (blk.from >>  8) & 0xff;
2750 		cgc.cmd[5] = blk.from & 0xff;
2751 		cgc.cmd[7] = (blk.len >> 8) & 0xff;
2752 		cgc.cmd[8] = blk.len & 0xff;
2753 		cgc.data_direction = CGC_DATA_NONE;
2754 		return cdo->generic_packet(cdi, &cgc);
2755 		}
2756 	case CDROMVOLCTRL:
2757 	case CDROMVOLREAD: {
2758 		struct cdrom_volctrl volctrl;
2759 		char mask[sizeof(buffer)];
2760 		unsigned short offset;
2761 
2762 		cdinfo(CD_DO_IOCTL, "entering CDROMVOLUME\n");
2763 
2764 		IOCTL_IN(arg, struct cdrom_volctrl, volctrl);
2765 
2766 		cgc.buffer = buffer;
2767 		cgc.buflen = 24;
2768 		if ((ret = cdrom_mode_sense(cdi, &cgc, GPMODE_AUDIO_CTL_PAGE, 0)))
2769 		    return ret;
2770 
2771 		/* originally the code depended on buffer[1] to determine
2772 		   how much data is available for transfer. buffer[1] is
2773 		   unfortunately ambigious and the only reliable way seem
2774 		   to be to simply skip over the block descriptor... */
2775 		offset = 8 + be16_to_cpu(*(unsigned short *)(buffer+6));
2776 
2777 		if (offset + 16 > sizeof(buffer))
2778 			return -E2BIG;
2779 
2780 		if (offset + 16 > cgc.buflen) {
2781 			cgc.buflen = offset+16;
2782 			ret = cdrom_mode_sense(cdi, &cgc,
2783 						GPMODE_AUDIO_CTL_PAGE, 0);
2784 			if (ret)
2785 				return ret;
2786 		}
2787 
2788 		/* sanity check */
2789 		if ((buffer[offset] & 0x3f) != GPMODE_AUDIO_CTL_PAGE ||
2790 				buffer[offset+1] < 14)
2791 			return -EINVAL;
2792 
2793 		/* now we have the current volume settings. if it was only
2794 		   a CDROMVOLREAD, return these values */
2795 		if (cmd == CDROMVOLREAD) {
2796 			volctrl.channel0 = buffer[offset+9];
2797 			volctrl.channel1 = buffer[offset+11];
2798 			volctrl.channel2 = buffer[offset+13];
2799 			volctrl.channel3 = buffer[offset+15];
2800 			IOCTL_OUT(arg, struct cdrom_volctrl, volctrl);
2801 			return 0;
2802 		}
2803 
2804 		/* get the volume mask */
2805 		cgc.buffer = mask;
2806 		if ((ret = cdrom_mode_sense(cdi, &cgc,
2807 				GPMODE_AUDIO_CTL_PAGE, 1)))
2808 			return ret;
2809 
2810 		buffer[offset+9] = volctrl.channel0 & mask[offset+9];
2811 		buffer[offset+11] = volctrl.channel1 & mask[offset+11];
2812 		buffer[offset+13] = volctrl.channel2 & mask[offset+13];
2813 		buffer[offset+15] = volctrl.channel3 & mask[offset+15];
2814 
2815 		/* set volume */
2816 		cgc.buffer = buffer + offset - 8;
2817 		memset(cgc.buffer, 0, 8);
2818 		return cdrom_mode_select(cdi, &cgc);
2819 		}
2820 
2821 	case CDROMSTART:
2822 	case CDROMSTOP: {
2823 		cdinfo(CD_DO_IOCTL, "entering CDROMSTART/CDROMSTOP\n");
2824 		cgc.cmd[0] = GPCMD_START_STOP_UNIT;
2825 		cgc.cmd[1] = 1;
2826 		cgc.cmd[4] = (cmd == CDROMSTART) ? 1 : 0;
2827 		cgc.data_direction = CGC_DATA_NONE;
2828 		return cdo->generic_packet(cdi, &cgc);
2829 		}
2830 
2831 	case CDROMPAUSE:
2832 	case CDROMRESUME: {
2833 		cdinfo(CD_DO_IOCTL, "entering CDROMPAUSE/CDROMRESUME\n");
2834 		cgc.cmd[0] = GPCMD_PAUSE_RESUME;
2835 		cgc.cmd[8] = (cmd == CDROMRESUME) ? 1 : 0;
2836 		cgc.data_direction = CGC_DATA_NONE;
2837 		return cdo->generic_packet(cdi, &cgc);
2838 		}
2839 
2840 	case DVD_READ_STRUCT: {
2841 		dvd_struct *s;
2842 		int size = sizeof(dvd_struct);
2843 		if (!CDROM_CAN(CDC_DVD))
2844 			return -ENOSYS;
2845 		if ((s = (dvd_struct *) kmalloc(size, GFP_KERNEL)) == NULL)
2846 			return -ENOMEM;
2847 		cdinfo(CD_DO_IOCTL, "entering DVD_READ_STRUCT\n");
2848 		if (copy_from_user(s, (dvd_struct __user *)arg, size)) {
2849 			kfree(s);
2850 			return -EFAULT;
2851 		}
2852 		if ((ret = dvd_read_struct(cdi, s))) {
2853 			kfree(s);
2854 			return ret;
2855 		}
2856 		if (copy_to_user((dvd_struct __user *)arg, s, size))
2857 			ret = -EFAULT;
2858 		kfree(s);
2859 		return ret;
2860 		}
2861 
2862 	case DVD_AUTH: {
2863 		dvd_authinfo ai;
2864 		if (!CDROM_CAN(CDC_DVD))
2865 			return -ENOSYS;
2866 		cdinfo(CD_DO_IOCTL, "entering DVD_AUTH\n");
2867 		IOCTL_IN(arg, dvd_authinfo, ai);
2868 		if ((ret = dvd_do_auth (cdi, &ai)))
2869 			return ret;
2870 		IOCTL_OUT(arg, dvd_authinfo, ai);
2871 		return 0;
2872 		}
2873 
2874 	case CDROM_NEXT_WRITABLE: {
2875 		long next = 0;
2876 		cdinfo(CD_DO_IOCTL, "entering CDROM_NEXT_WRITABLE\n");
2877 		if ((ret = cdrom_get_next_writable(cdi, &next)))
2878 			return ret;
2879 		IOCTL_OUT(arg, long, next);
2880 		return 0;
2881 		}
2882 	case CDROM_LAST_WRITTEN: {
2883 		long last = 0;
2884 		cdinfo(CD_DO_IOCTL, "entering CDROM_LAST_WRITTEN\n");
2885 		if ((ret = cdrom_get_last_written(cdi, &last)))
2886 			return ret;
2887 		IOCTL_OUT(arg, long, last);
2888 		return 0;
2889 		}
2890 	} /* switch */
2891 
2892 	return -ENOTTY;
2893 }
2894 
2895 static int cdrom_get_track_info(struct cdrom_device_info *cdi, __u16 track, __u8 type,
2896 			 track_information *ti)
2897 {
2898 	struct cdrom_device_ops *cdo = cdi->ops;
2899 	struct packet_command cgc;
2900 	int ret, buflen;
2901 
2902 	init_cdrom_command(&cgc, ti, 8, CGC_DATA_READ);
2903 	cgc.cmd[0] = GPCMD_READ_TRACK_RZONE_INFO;
2904 	cgc.cmd[1] = type & 3;
2905 	cgc.cmd[4] = (track & 0xff00) >> 8;
2906 	cgc.cmd[5] = track & 0xff;
2907 	cgc.cmd[8] = 8;
2908 	cgc.quiet = 1;
2909 
2910 	if ((ret = cdo->generic_packet(cdi, &cgc)))
2911 		return ret;
2912 
2913 	buflen = be16_to_cpu(ti->track_information_length) +
2914 		     sizeof(ti->track_information_length);
2915 
2916 	if (buflen > sizeof(track_information))
2917 		buflen = sizeof(track_information);
2918 
2919 	cgc.cmd[8] = cgc.buflen = buflen;
2920 	if ((ret = cdo->generic_packet(cdi, &cgc)))
2921 		return ret;
2922 
2923 	/* return actual fill size */
2924 	return buflen;
2925 }
2926 
2927 /* requires CD R/RW */
2928 static int cdrom_get_disc_info(struct cdrom_device_info *cdi, disc_information *di)
2929 {
2930 	struct cdrom_device_ops *cdo = cdi->ops;
2931 	struct packet_command cgc;
2932 	int ret, buflen;
2933 
2934 	/* set up command and get the disc info */
2935 	init_cdrom_command(&cgc, di, sizeof(*di), CGC_DATA_READ);
2936 	cgc.cmd[0] = GPCMD_READ_DISC_INFO;
2937 	cgc.cmd[8] = cgc.buflen = 2;
2938 	cgc.quiet = 1;
2939 
2940 	if ((ret = cdo->generic_packet(cdi, &cgc)))
2941 		return ret;
2942 
2943 	/* not all drives have the same disc_info length, so requeue
2944 	 * packet with the length the drive tells us it can supply
2945 	 */
2946 	buflen = be16_to_cpu(di->disc_information_length) +
2947 		     sizeof(di->disc_information_length);
2948 
2949 	if (buflen > sizeof(disc_information))
2950 		buflen = sizeof(disc_information);
2951 
2952 	cgc.cmd[8] = cgc.buflen = buflen;
2953 	if ((ret = cdo->generic_packet(cdi, &cgc)))
2954 		return ret;
2955 
2956 	/* return actual fill size */
2957 	return buflen;
2958 }
2959 
2960 /* return the last written block on the CD-R media. this is for the udf
2961    file system. */
2962 int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written)
2963 {
2964 	struct cdrom_tocentry toc;
2965 	disc_information di;
2966 	track_information ti;
2967 	__u32 last_track;
2968 	int ret = -1, ti_size;
2969 
2970 	if (!CDROM_CAN(CDC_GENERIC_PACKET))
2971 		goto use_toc;
2972 
2973 	ret = cdrom_get_disc_info(cdi, &di);
2974 	if (ret < (int)(offsetof(typeof(di), last_track_lsb)
2975 			+ sizeof(di.last_track_lsb)))
2976 		goto use_toc;
2977 
2978 	/* if unit didn't return msb, it's zeroed by cdrom_get_disc_info */
2979 	last_track = (di.last_track_msb << 8) | di.last_track_lsb;
2980 	ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
2981 	if (ti_size < (int)offsetof(typeof(ti), track_start))
2982 		goto use_toc;
2983 
2984 	/* if this track is blank, try the previous. */
2985 	if (ti.blank) {
2986 		if (last_track==1)
2987 			goto use_toc;
2988 		last_track--;
2989 		ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
2990 	}
2991 
2992 	if (ti_size < (int)(offsetof(typeof(ti), track_size)
2993 				+ sizeof(ti.track_size)))
2994 		goto use_toc;
2995 
2996 	/* if last recorded field is valid, return it. */
2997 	if (ti.lra_v && ti_size >= (int)(offsetof(typeof(ti), last_rec_address)
2998 				+ sizeof(ti.last_rec_address))) {
2999 		*last_written = be32_to_cpu(ti.last_rec_address);
3000 	} else {
3001 		/* make it up instead */
3002 		*last_written = be32_to_cpu(ti.track_start) +
3003 				be32_to_cpu(ti.track_size);
3004 		if (ti.free_blocks)
3005 			*last_written -= (be32_to_cpu(ti.free_blocks) + 7);
3006 	}
3007 	return 0;
3008 
3009 	/* this is where we end up if the drive either can't do a
3010 	   GPCMD_READ_DISC_INFO or GPCMD_READ_TRACK_RZONE_INFO or if
3011 	   it doesn't give enough information or fails. then we return
3012 	   the toc contents. */
3013 use_toc:
3014 	toc.cdte_format = CDROM_MSF;
3015 	toc.cdte_track = CDROM_LEADOUT;
3016 	if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &toc)))
3017 		return ret;
3018 	sanitize_format(&toc.cdte_addr, &toc.cdte_format, CDROM_LBA);
3019 	*last_written = toc.cdte_addr.lba;
3020 	return 0;
3021 }
3022 
3023 /* return the next writable block. also for udf file system. */
3024 static int cdrom_get_next_writable(struct cdrom_device_info *cdi, long *next_writable)
3025 {
3026 	disc_information di;
3027 	track_information ti;
3028 	__u16 last_track;
3029 	int ret, ti_size;
3030 
3031 	if (!CDROM_CAN(CDC_GENERIC_PACKET))
3032 		goto use_last_written;
3033 
3034 	ret = cdrom_get_disc_info(cdi, &di);
3035 	if (ret < 0 || ret < offsetof(typeof(di), last_track_lsb)
3036 				+ sizeof(di.last_track_lsb))
3037 		goto use_last_written;
3038 
3039 	/* if unit didn't return msb, it's zeroed by cdrom_get_disc_info */
3040 	last_track = (di.last_track_msb << 8) | di.last_track_lsb;
3041 	ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
3042 	if (ti_size < 0 || ti_size < offsetof(typeof(ti), track_start))
3043 		goto use_last_written;
3044 
3045         /* if this track is blank, try the previous. */
3046 	if (ti.blank) {
3047 		if (last_track == 1)
3048 			goto use_last_written;
3049 		last_track--;
3050 		ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
3051 		if (ti_size < 0)
3052 			goto use_last_written;
3053 	}
3054 
3055 	/* if next recordable address field is valid, use it. */
3056 	if (ti.nwa_v && ti_size >= offsetof(typeof(ti), next_writable)
3057 				+ sizeof(ti.next_writable)) {
3058 		*next_writable = be32_to_cpu(ti.next_writable);
3059 		return 0;
3060 	}
3061 
3062 use_last_written:
3063 	if ((ret = cdrom_get_last_written(cdi, next_writable))) {
3064 		*next_writable = 0;
3065 		return ret;
3066 	} else {
3067 		*next_writable += 7;
3068 		return 0;
3069 	}
3070 }
3071 
3072 EXPORT_SYMBOL(cdrom_get_last_written);
3073 EXPORT_SYMBOL(register_cdrom);
3074 EXPORT_SYMBOL(unregister_cdrom);
3075 EXPORT_SYMBOL(cdrom_open);
3076 EXPORT_SYMBOL(cdrom_release);
3077 EXPORT_SYMBOL(cdrom_ioctl);
3078 EXPORT_SYMBOL(cdrom_media_changed);
3079 EXPORT_SYMBOL(cdrom_number_of_slots);
3080 EXPORT_SYMBOL(cdrom_mode_select);
3081 EXPORT_SYMBOL(cdrom_mode_sense);
3082 EXPORT_SYMBOL(init_cdrom_command);
3083 EXPORT_SYMBOL(cdrom_get_media_event);
3084 
3085 #ifdef CONFIG_SYSCTL
3086 
3087 #define CDROM_STR_SIZE 1000
3088 
3089 static struct cdrom_sysctl_settings {
3090 	char	info[CDROM_STR_SIZE];	/* general info */
3091 	int	autoclose;		/* close tray upon mount, etc */
3092 	int	autoeject;		/* eject on umount */
3093 	int	debug;			/* turn on debugging messages */
3094 	int	lock;			/* lock the door on device open */
3095 	int	check;			/* check media type */
3096 } cdrom_sysctl_settings;
3097 
3098 static int cdrom_sysctl_info(ctl_table *ctl, int write, struct file * filp,
3099                            void __user *buffer, size_t *lenp, loff_t *ppos)
3100 {
3101         int pos;
3102 	struct cdrom_device_info *cdi;
3103 	char *info = cdrom_sysctl_settings.info;
3104 
3105 	if (!*lenp || (*ppos && !write)) {
3106 		*lenp = 0;
3107 		return 0;
3108 	}
3109 
3110 	pos = sprintf(info, "CD-ROM information, " VERSION "\n");
3111 
3112 	pos += sprintf(info+pos, "\ndrive name:\t");
3113 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3114 	    pos += sprintf(info+pos, "\t%s", cdi->name);
3115 
3116 	pos += sprintf(info+pos, "\ndrive speed:\t");
3117 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3118 	    pos += sprintf(info+pos, "\t%d", cdi->speed);
3119 
3120 	pos += sprintf(info+pos, "\ndrive # of slots:");
3121 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3122 	    pos += sprintf(info+pos, "\t%d", cdi->capacity);
3123 
3124 	pos += sprintf(info+pos, "\nCan close tray:\t");
3125 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3126 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_CLOSE_TRAY) != 0);
3127 
3128 	pos += sprintf(info+pos, "\nCan open tray:\t");
3129 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3130 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_OPEN_TRAY) != 0);
3131 
3132 	pos += sprintf(info+pos, "\nCan lock tray:\t");
3133 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3134 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_LOCK) != 0);
3135 
3136 	pos += sprintf(info+pos, "\nCan change speed:");
3137 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3138 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_SELECT_SPEED) != 0);
3139 
3140 	pos += sprintf(info+pos, "\nCan select disk:");
3141 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3142 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_SELECT_DISC) != 0);
3143 
3144 	pos += sprintf(info+pos, "\nCan read multisession:");
3145 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3146 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MULTI_SESSION) != 0);
3147 
3148 	pos += sprintf(info+pos, "\nCan read MCN:\t");
3149 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3150 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MCN) != 0);
3151 
3152 	pos += sprintf(info+pos, "\nReports media changed:");
3153 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3154 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MEDIA_CHANGED) != 0);
3155 
3156 	pos += sprintf(info+pos, "\nCan play audio:\t");
3157 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3158 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_PLAY_AUDIO) != 0);
3159 
3160 	pos += sprintf(info+pos, "\nCan write CD-R:\t");
3161 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3162 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_CD_R) != 0);
3163 
3164 	pos += sprintf(info+pos, "\nCan write CD-RW:");
3165 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3166 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_CD_RW) != 0);
3167 
3168 	pos += sprintf(info+pos, "\nCan read DVD:\t");
3169 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3170 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD) != 0);
3171 
3172 	pos += sprintf(info+pos, "\nCan write DVD-R:");
3173 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3174 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD_R) != 0);
3175 
3176 	pos += sprintf(info+pos, "\nCan write DVD-RAM:");
3177 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3178 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD_RAM) != 0);
3179 
3180 	pos += sprintf(info+pos, "\nCan read MRW:\t");
3181 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3182 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MRW) != 0);
3183 
3184 	pos += sprintf(info+pos, "\nCan write MRW:\t");
3185 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3186 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MRW_W) != 0);
3187 
3188 	pos += sprintf(info+pos, "\nCan write RAM:\t");
3189 	for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3190 	    pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_RAM) != 0);
3191 
3192 	strcpy(info+pos,"\n\n");
3193 
3194         return proc_dostring(ctl, write, filp, buffer, lenp, ppos);
3195 }
3196 
3197 /* Unfortunately, per device settings are not implemented through
3198    procfs/sysctl yet. When they are, this will naturally disappear. For now
3199    just update all drives. Later this will become the template on which
3200    new registered drives will be based. */
3201 static void cdrom_update_settings(void)
3202 {
3203 	struct cdrom_device_info *cdi;
3204 
3205 	for (cdi = topCdromPtr; cdi != NULL; cdi = cdi->next) {
3206 		if (autoclose && CDROM_CAN(CDC_CLOSE_TRAY))
3207 			cdi->options |= CDO_AUTO_CLOSE;
3208 		else if (!autoclose)
3209 			cdi->options &= ~CDO_AUTO_CLOSE;
3210 		if (autoeject && CDROM_CAN(CDC_OPEN_TRAY))
3211 			cdi->options |= CDO_AUTO_EJECT;
3212 		else if (!autoeject)
3213 			cdi->options &= ~CDO_AUTO_EJECT;
3214 		if (lockdoor && CDROM_CAN(CDC_LOCK))
3215 			cdi->options |= CDO_LOCK;
3216 		else if (!lockdoor)
3217 			cdi->options &= ~CDO_LOCK;
3218 		if (check_media_type)
3219 			cdi->options |= CDO_CHECK_TYPE;
3220 		else
3221 			cdi->options &= ~CDO_CHECK_TYPE;
3222 	}
3223 }
3224 
3225 static int cdrom_sysctl_handler(ctl_table *ctl, int write, struct file * filp,
3226 				void __user *buffer, size_t *lenp, loff_t *ppos)
3227 {
3228 	int *valp = ctl->data;
3229 	int val = *valp;
3230 	int ret;
3231 
3232 	ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
3233 
3234 	if (write && *valp != val) {
3235 
3236 		/* we only care for 1 or 0. */
3237 		if (*valp)
3238 			*valp = 1;
3239 		else
3240 			*valp = 0;
3241 
3242 		switch (ctl->ctl_name) {
3243 		case DEV_CDROM_AUTOCLOSE: {
3244 			if (valp == &cdrom_sysctl_settings.autoclose)
3245 				autoclose = cdrom_sysctl_settings.autoclose;
3246 			break;
3247 			}
3248 		case DEV_CDROM_AUTOEJECT: {
3249 			if (valp == &cdrom_sysctl_settings.autoeject)
3250 				autoeject = cdrom_sysctl_settings.autoeject;
3251 			break;
3252 			}
3253 		case DEV_CDROM_DEBUG: {
3254 			if (valp == &cdrom_sysctl_settings.debug)
3255 				debug = cdrom_sysctl_settings.debug;
3256 			break;
3257 			}
3258 		case DEV_CDROM_LOCK: {
3259 			if (valp == &cdrom_sysctl_settings.lock)
3260 				lockdoor = cdrom_sysctl_settings.lock;
3261 			break;
3262 			}
3263 		case DEV_CDROM_CHECK_MEDIA: {
3264 			if (valp == &cdrom_sysctl_settings.check)
3265 				check_media_type = cdrom_sysctl_settings.check;
3266 			break;
3267 			}
3268 		}
3269 		/* update the option flags according to the changes. we
3270 		   don't have per device options through sysctl yet,
3271 		   but we will have and then this will disappear. */
3272 		cdrom_update_settings();
3273 	}
3274 
3275         return ret;
3276 }
3277 
3278 /* Place files in /proc/sys/dev/cdrom */
3279 static ctl_table cdrom_table[] = {
3280 	{
3281 		.ctl_name	= DEV_CDROM_INFO,
3282 		.procname	= "info",
3283 		.data		= &cdrom_sysctl_settings.info,
3284 		.maxlen		= CDROM_STR_SIZE,
3285 		.mode		= 0444,
3286 		.proc_handler	= &cdrom_sysctl_info,
3287 	},
3288 	{
3289 		.ctl_name	= DEV_CDROM_AUTOCLOSE,
3290 		.procname	= "autoclose",
3291 		.data		= &cdrom_sysctl_settings.autoclose,
3292 		.maxlen		= sizeof(int),
3293 		.mode		= 0644,
3294 		.proc_handler	= &cdrom_sysctl_handler,
3295 	},
3296 	{
3297 		.ctl_name	= DEV_CDROM_AUTOEJECT,
3298 		.procname	= "autoeject",
3299 		.data		= &cdrom_sysctl_settings.autoeject,
3300 		.maxlen		= sizeof(int),
3301 		.mode		= 0644,
3302 		.proc_handler	= &cdrom_sysctl_handler,
3303 	},
3304 	{
3305 		.ctl_name	= DEV_CDROM_DEBUG,
3306 		.procname	= "debug",
3307 		.data		= &cdrom_sysctl_settings.debug,
3308 		.maxlen		= sizeof(int),
3309 		.mode		= 0644,
3310 		.proc_handler	= &cdrom_sysctl_handler,
3311 	},
3312 	{
3313 		.ctl_name	= DEV_CDROM_LOCK,
3314 		.procname	= "lock",
3315 		.data		= &cdrom_sysctl_settings.lock,
3316 		.maxlen		= sizeof(int),
3317 		.mode		= 0644,
3318 		.proc_handler	= &cdrom_sysctl_handler,
3319 	},
3320 	{
3321 		.ctl_name	= DEV_CDROM_CHECK_MEDIA,
3322 		.procname	= "check_media",
3323 		.data		= &cdrom_sysctl_settings.check,
3324 		.maxlen		= sizeof(int),
3325 		.mode		= 0644,
3326 		.proc_handler	= &cdrom_sysctl_handler
3327 	},
3328 	{ .ctl_name = 0 }
3329 };
3330 
3331 static ctl_table cdrom_cdrom_table[] = {
3332 	{
3333 		.ctl_name	= DEV_CDROM,
3334 		.procname	= "cdrom",
3335 		.maxlen		= 0,
3336 		.mode		= 0555,
3337 		.child		= cdrom_table,
3338 	},
3339 	{ .ctl_name = 0 }
3340 };
3341 
3342 /* Make sure that /proc/sys/dev is there */
3343 static ctl_table cdrom_root_table[] = {
3344 	{
3345 		.ctl_name	= CTL_DEV,
3346 		.procname	= "dev",
3347 		.maxlen		= 0,
3348 		.mode		= 0555,
3349 		.child		= cdrom_cdrom_table,
3350 	},
3351 	{ .ctl_name = 0 }
3352 };
3353 static struct ctl_table_header *cdrom_sysctl_header;
3354 
3355 static void cdrom_sysctl_register(void)
3356 {
3357 	static int initialized;
3358 
3359 	if (initialized == 1)
3360 		return;
3361 
3362 	cdrom_sysctl_header = register_sysctl_table(cdrom_root_table, 1);
3363 	if (cdrom_root_table->ctl_name && cdrom_root_table->child->de)
3364 		cdrom_root_table->child->de->owner = THIS_MODULE;
3365 
3366 	/* set the defaults */
3367 	cdrom_sysctl_settings.autoclose = autoclose;
3368 	cdrom_sysctl_settings.autoeject = autoeject;
3369 	cdrom_sysctl_settings.debug = debug;
3370 	cdrom_sysctl_settings.lock = lockdoor;
3371 	cdrom_sysctl_settings.check = check_media_type;
3372 
3373 	initialized = 1;
3374 }
3375 
3376 static void cdrom_sysctl_unregister(void)
3377 {
3378 	if (cdrom_sysctl_header)
3379 		unregister_sysctl_table(cdrom_sysctl_header);
3380 }
3381 
3382 #endif /* CONFIG_SYSCTL */
3383 
3384 static int __init cdrom_init(void)
3385 {
3386 #ifdef CONFIG_SYSCTL
3387 	cdrom_sysctl_register();
3388 #endif
3389 	return 0;
3390 }
3391 
3392 static void __exit cdrom_exit(void)
3393 {
3394 	printk(KERN_INFO "Uniform CD-ROM driver unloaded\n");
3395 #ifdef CONFIG_SYSCTL
3396 	cdrom_sysctl_unregister();
3397 #endif
3398 }
3399 
3400 module_init(cdrom_init);
3401 module_exit(cdrom_exit);
3402 MODULE_LICENSE("GPL");
3403