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