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