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