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