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