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