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