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