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