[go: nahoru, domu]

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