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