cdrom: set default timeout to 7 seconds
[linux/fpc-iii.git] / drivers / cdrom / cdrom.c
blob55e71b7b3198c9d4018371ea16601f3f819a405d
1 /* linux/drivers/cdrom/cdrom.c.
2 Copyright (c) 1996, 1997 David A. van Leeuwen.
3 Copyright (c) 1997, 1998 Erik Andersen <andersee@debian.org>
4 Copyright (c) 1998, 1999 Jens Axboe <axboe@image.dk>
6 May be copied or modified under the terms of the GNU General Public
7 License. See linux/COPYING for more information.
9 Uniform CD-ROM driver for Linux.
10 See Documentation/cdrom/cdrom-standard.tex for usage information.
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. ;-)
17 To Do List:
18 ----------------------------------
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!
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?
32 2.00 Dec 2, 1997 -- Erik Andersen <andersee@debian.org>
33 -- New maintainer! As David A. van Leeuwen has been too busy to activly
34 maintain and improve this driver, I am now carrying on the torch. If
35 you have a problem with this driver, please feel free to contact me.
37 -- Added (rudimentary) sysctl interface. I realize this is really weak
38 right now, and is _very_ badly implemented. It will be improved...
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.
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.
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).
54 -- Made it so if a function isn't implemented in a low-level driver,
55 ENOSYS is now returned instead of EINVAL.
57 -- Simplified some complex logic so that the source code is easier to read.
59 -- Other stuff I probably forgot to mention (lots of changes).
61 2.01 to 2.11 Dec 1997-Jan 1998
62 -- TO-DO! Write changelogs for 2.01 to 2.12.
64 2.12 Jan 24, 1998 -- Erik Andersen <andersee@debian.org>
65 -- Fixed a bug in the IOCTL_IN and IOCTL_OUT macros. It turns out that
66 copy_*_user does not return EFAULT on error, but instead returns the number
67 of bytes not copied. I was returning whatever non-zero stuff came back from
68 the copy_*_user functions directly, which would result in strange errors.
70 2.13 July 17, 1998 -- Erik Andersen <andersee@debian.org>
71 -- Fixed a bug in CDROM_SELECT_SPEED where you couldn't lower the speed
72 of the drive. Thanks to Tobias Ringstr|m <tori@prosolvia.se> for pointing
73 this out and providing a simple fix.
74 -- Fixed the procfs-unload-module bug with the fill_inode procfs callback.
75 thanks to Andrea Arcangeli
76 -- Fixed it so that the /proc entry now also shows up when cdrom is
77 compiled into the kernel. Before it only worked when loaded as a module.
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.
85 2.50 Oct 19, 1998 - Jens Axboe <axboe@image.dk>
86 -- New maintainers! Erik was too busy to continue the work on the driver,
87 so now Chris Zwilling <chris@cloudnet.com> and Jens Axboe <axboe@image.dk>
88 will do their best to follow in his footsteps
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.
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.
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.
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>.
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.
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.
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 :).
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
228 3.12 Oct 18, 2000 - Jens Axboe <axboe@suse.de>
229 -- Use quiet bit on packet commands not known to work
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
237 Nov 5 2001, Aug 8 2002. Modified by Andy Polyakov
238 <appro@fy.chalmers.se> to support MMC-3 compliant DVD+RW units.
240 Modified by Nigel Kukard <nkukard@lbsd.net> - support DVD+RW
241 2.4.x patch by Andy Polyakov <appro@fy.chalmers.se>
243 -------------------------------------------------------------------------*/
245 #define REVISION "Revision: 3.20"
246 #define VERSION "Id: cdrom.c 3.20 2003/12/17"
248 /* I use an error-log mask to give fine grain control over the type of
249 messages dumped to the system logs. The available masks include: */
250 #define CD_NOTHING 0x0
251 #define CD_WARNING 0x1
252 #define CD_REG_UNREG 0x2
253 #define CD_DO_IOCTL 0x4
254 #define CD_OPEN 0x8
255 #define CD_CLOSE 0x10
256 #define CD_COUNT_TRACKS 0x20
257 #define CD_CHANGER 0x40
258 #define CD_DVD 0x80
260 /* Define this to remove _all_ the debugging messages */
261 /* #define ERRLOGMASK CD_NOTHING */
262 #define ERRLOGMASK CD_WARNING
263 /* #define ERRLOGMASK (CD_WARNING|CD_OPEN|CD_COUNT_TRACKS|CD_CLOSE) */
264 /* #define ERRLOGMASK (CD_WARNING|CD_REG_UNREG|CD_DO_IOCTL|CD_OPEN|CD_CLOSE|CD_COUNT_TRACKS) */
266 #include <linux/config.h>
267 #include <linux/module.h>
268 #include <linux/fs.h>
269 #include <linux/buffer_head.h>
270 #include <linux/major.h>
271 #include <linux/types.h>
272 #include <linux/errno.h>
273 #include <linux/kernel.h>
274 #include <linux/mm.h>
275 #include <linux/slab.h>
276 #include <linux/cdrom.h>
277 #include <linux/sysctl.h>
278 #include <linux/proc_fs.h>
279 #include <linux/blkpg.h>
280 #include <linux/init.h>
281 #include <linux/fcntl.h>
282 #include <linux/blkdev.h>
283 #include <linux/times.h>
285 #include <asm/uaccess.h>
287 /* used to tell the module to turn on full debugging messages */
288 static int debug;
289 /* used to keep tray locked at all times */
290 static int keeplocked;
291 /* default compatibility mode */
292 static int autoclose=1;
293 static int autoeject;
294 static int lockdoor = 1;
295 /* will we ever get to use this... sigh. */
296 static int check_media_type;
297 /* automatically restart mrw format */
298 static int mrw_format_restart = 1;
299 module_param(debug, bool, 0);
300 module_param(autoclose, bool, 0);
301 module_param(autoeject, bool, 0);
302 module_param(lockdoor, bool, 0);
303 module_param(check_media_type, bool, 0);
304 module_param(mrw_format_restart, bool, 0);
306 static DEFINE_SPINLOCK(cdrom_lock);
308 static const char *mrw_format_status[] = {
309 "not mrw",
310 "bgformat inactive",
311 "bgformat active",
312 "mrw complete",
315 static const char *mrw_address_space[] = { "DMA", "GAA" };
317 #if (ERRLOGMASK!=CD_NOTHING)
318 #define cdinfo(type, fmt, args...) \
319 if ((ERRLOGMASK & type) || debug==1 ) \
320 printk(KERN_INFO "cdrom: " fmt, ## args)
321 #else
322 #define cdinfo(type, fmt, args...)
323 #endif
325 /* These are used to simplify getting data in from and back to user land */
326 #define IOCTL_IN(arg, type, in) \
327 if (copy_from_user(&(in), (type __user *) (arg), sizeof (in))) \
328 return -EFAULT;
330 #define IOCTL_OUT(arg, type, out) \
331 if (copy_to_user((type __user *) (arg), &(out), sizeof (out))) \
332 return -EFAULT;
334 /* The (cdo->capability & ~cdi->mask & CDC_XXX) construct was used in
335 a lot of places. This macro makes the code more clear. */
336 #define CDROM_CAN(type) (cdi->ops->capability & ~cdi->mask & (type))
338 /* used in the audio ioctls */
339 #define CHECKAUDIO if ((ret=check_for_audio_disc(cdi, cdo))) return ret
342 * Another popular OS uses 7 seconds as the hard timeout for default
343 * commands, so it is a good choice for us as well.
345 #define CDROM_DEF_TIMEOUT (7 * HZ)
347 /* Not-exported routines. */
348 static int open_for_data(struct cdrom_device_info * cdi);
349 static int check_for_audio_disc(struct cdrom_device_info * cdi,
350 struct cdrom_device_ops * cdo);
351 static void sanitize_format(union cdrom_addr *addr,
352 u_char * curr, u_char requested);
353 static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
354 unsigned long arg);
356 int cdrom_get_last_written(struct cdrom_device_info *, long *);
357 static int cdrom_get_next_writable(struct cdrom_device_info *, long *);
358 static void cdrom_count_tracks(struct cdrom_device_info *, tracktype*);
360 static int cdrom_mrw_exit(struct cdrom_device_info *cdi);
362 static int cdrom_get_disc_info(struct cdrom_device_info *cdi, disc_information *di);
364 #ifdef CONFIG_SYSCTL
365 static void cdrom_sysctl_register(void);
366 #endif /* CONFIG_SYSCTL */
367 static struct cdrom_device_info *topCdromPtr;
369 static int cdrom_dummy_generic_packet(struct cdrom_device_info *cdi,
370 struct packet_command *cgc)
372 if (cgc->sense) {
373 cgc->sense->sense_key = 0x05;
374 cgc->sense->asc = 0x20;
375 cgc->sense->ascq = 0x00;
378 cgc->stat = -EIO;
379 return -EIO;
382 /* This macro makes sure we don't have to check on cdrom_device_ops
383 * existence in the run-time routines below. Change_capability is a
384 * hack to have the capability flags defined const, while we can still
385 * change it here without gcc complaining at every line.
387 #define ENSURE(call, bits) if (cdo->call == NULL) *change_capability &= ~(bits)
389 int register_cdrom(struct cdrom_device_info *cdi)
391 static char banner_printed;
392 struct cdrom_device_ops *cdo = cdi->ops;
393 int *change_capability = (int *)&cdo->capability; /* hack */
395 cdinfo(CD_OPEN, "entering register_cdrom\n");
397 if (cdo->open == NULL || cdo->release == NULL)
398 return -2;
399 if (!banner_printed) {
400 printk(KERN_INFO "Uniform CD-ROM driver " REVISION "\n");
401 banner_printed = 1;
402 #ifdef CONFIG_SYSCTL
403 cdrom_sysctl_register();
404 #endif /* CONFIG_SYSCTL */
407 ENSURE(drive_status, CDC_DRIVE_STATUS );
408 ENSURE(media_changed, CDC_MEDIA_CHANGED);
409 ENSURE(tray_move, CDC_CLOSE_TRAY | CDC_OPEN_TRAY);
410 ENSURE(lock_door, CDC_LOCK);
411 ENSURE(select_speed, CDC_SELECT_SPEED);
412 ENSURE(get_last_session, CDC_MULTI_SESSION);
413 ENSURE(get_mcn, CDC_MCN);
414 ENSURE(reset, CDC_RESET);
415 ENSURE(audio_ioctl, CDC_PLAY_AUDIO);
416 ENSURE(dev_ioctl, CDC_IOCTLS);
417 ENSURE(generic_packet, CDC_GENERIC_PACKET);
418 cdi->mc_flags = 0;
419 cdo->n_minors = 0;
420 cdi->options = CDO_USE_FFLAGS;
422 if (autoclose==1 && CDROM_CAN(CDC_CLOSE_TRAY))
423 cdi->options |= (int) CDO_AUTO_CLOSE;
424 if (autoeject==1 && CDROM_CAN(CDC_OPEN_TRAY))
425 cdi->options |= (int) CDO_AUTO_EJECT;
426 if (lockdoor==1)
427 cdi->options |= (int) CDO_LOCK;
428 if (check_media_type==1)
429 cdi->options |= (int) CDO_CHECK_TYPE;
431 if (CDROM_CAN(CDC_MRW_W))
432 cdi->exit = cdrom_mrw_exit;
434 if (cdi->disk)
435 cdi->cdda_method = CDDA_BPC_FULL;
436 else
437 cdi->cdda_method = CDDA_OLD;
439 if (!cdo->generic_packet)
440 cdo->generic_packet = cdrom_dummy_generic_packet;
442 cdinfo(CD_REG_UNREG, "drive \"/dev/%s\" registered\n", cdi->name);
443 spin_lock(&cdrom_lock);
444 cdi->next = topCdromPtr;
445 topCdromPtr = cdi;
446 spin_unlock(&cdrom_lock);
447 return 0;
449 #undef ENSURE
451 int unregister_cdrom(struct cdrom_device_info *unreg)
453 struct cdrom_device_info *cdi, *prev;
454 cdinfo(CD_OPEN, "entering unregister_cdrom\n");
456 prev = NULL;
457 spin_lock(&cdrom_lock);
458 cdi = topCdromPtr;
459 while (cdi && cdi != unreg) {
460 prev = cdi;
461 cdi = cdi->next;
464 if (cdi == NULL) {
465 spin_unlock(&cdrom_lock);
466 return -2;
468 if (prev)
469 prev->next = cdi->next;
470 else
471 topCdromPtr = cdi->next;
473 spin_unlock(&cdrom_lock);
475 if (cdi->exit)
476 cdi->exit(cdi);
478 cdi->ops->n_minors--;
479 cdinfo(CD_REG_UNREG, "drive \"/dev/%s\" unregistered\n", cdi->name);
480 return 0;
483 int cdrom_get_media_event(struct cdrom_device_info *cdi,
484 struct media_event_desc *med)
486 struct packet_command cgc;
487 unsigned char buffer[8];
488 struct event_header *eh = (struct event_header *) buffer;
490 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
491 cgc.cmd[0] = GPCMD_GET_EVENT_STATUS_NOTIFICATION;
492 cgc.cmd[1] = 1; /* IMMED */
493 cgc.cmd[4] = 1 << 4; /* media event */
494 cgc.cmd[8] = sizeof(buffer);
495 cgc.quiet = 1;
497 if (cdi->ops->generic_packet(cdi, &cgc))
498 return 1;
500 if (be16_to_cpu(eh->data_len) < sizeof(*med))
501 return 1;
503 if (eh->nea || eh->notification_class != 0x4)
504 return 1;
506 memcpy(med, &buffer[sizeof(*eh)], sizeof(*med));
507 return 0;
511 * the first prototypes used 0x2c as the page code for the mrw mode page,
512 * subsequently this was changed to 0x03. probe the one used by this drive
514 static int cdrom_mrw_probe_pc(struct cdrom_device_info *cdi)
516 struct packet_command cgc;
517 char buffer[16];
519 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
521 cgc.timeout = HZ;
522 cgc.quiet = 1;
524 if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC, 0)) {
525 cdi->mrw_mode_page = MRW_MODE_PC;
526 return 0;
527 } else if (!cdrom_mode_sense(cdi, &cgc, MRW_MODE_PC_PRE1, 0)) {
528 cdi->mrw_mode_page = MRW_MODE_PC_PRE1;
529 return 0;
532 return 1;
535 static int cdrom_is_mrw(struct cdrom_device_info *cdi, int *write)
537 struct packet_command cgc;
538 struct mrw_feature_desc *mfd;
539 unsigned char buffer[16];
540 int ret;
542 *write = 0;
544 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
546 cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
547 cgc.cmd[3] = CDF_MRW;
548 cgc.cmd[8] = sizeof(buffer);
549 cgc.quiet = 1;
551 if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
552 return ret;
554 mfd = (struct mrw_feature_desc *)&buffer[sizeof(struct feature_header)];
555 if (be16_to_cpu(mfd->feature_code) != CDF_MRW)
556 return 1;
557 *write = mfd->write;
559 if ((ret = cdrom_mrw_probe_pc(cdi))) {
560 *write = 0;
561 return ret;
564 return 0;
567 static int cdrom_mrw_bgformat(struct cdrom_device_info *cdi, int cont)
569 struct packet_command cgc;
570 unsigned char buffer[12];
571 int ret;
573 printk(KERN_INFO "cdrom: %sstarting format\n", cont ? "Re" : "");
576 * FmtData bit set (bit 4), format type is 1
578 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_WRITE);
579 cgc.cmd[0] = GPCMD_FORMAT_UNIT;
580 cgc.cmd[1] = (1 << 4) | 1;
582 cgc.timeout = 5 * 60 * HZ;
585 * 4 byte format list header, 8 byte format list descriptor
587 buffer[1] = 1 << 1;
588 buffer[3] = 8;
591 * nr_blocks field
593 buffer[4] = 0xff;
594 buffer[5] = 0xff;
595 buffer[6] = 0xff;
596 buffer[7] = 0xff;
598 buffer[8] = 0x24 << 2;
599 buffer[11] = cont;
601 ret = cdi->ops->generic_packet(cdi, &cgc);
602 if (ret)
603 printk(KERN_INFO "cdrom: bgformat failed\n");
605 return ret;
608 static int cdrom_mrw_bgformat_susp(struct cdrom_device_info *cdi, int immed)
610 struct packet_command cgc;
612 init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
613 cgc.cmd[0] = GPCMD_CLOSE_TRACK;
616 * Session = 1, Track = 0
618 cgc.cmd[1] = !!immed;
619 cgc.cmd[2] = 1 << 1;
621 cgc.timeout = 5 * 60 * HZ;
623 return cdi->ops->generic_packet(cdi, &cgc);
626 static int cdrom_flush_cache(struct cdrom_device_info *cdi)
628 struct packet_command cgc;
630 init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
631 cgc.cmd[0] = GPCMD_FLUSH_CACHE;
633 cgc.timeout = 5 * 60 * HZ;
635 return cdi->ops->generic_packet(cdi, &cgc);
638 static int cdrom_mrw_exit(struct cdrom_device_info *cdi)
640 disc_information di;
641 int ret;
643 ret = cdrom_get_disc_info(cdi, &di);
644 if (ret < 0 || ret < (int)offsetof(typeof(di),disc_type))
645 return 1;
647 ret = 0;
648 if (di.mrw_status == CDM_MRW_BGFORMAT_ACTIVE) {
649 printk(KERN_INFO "cdrom: issuing MRW back ground "
650 "format suspend\n");
651 ret = cdrom_mrw_bgformat_susp(cdi, 0);
654 if (!ret && cdi->media_written)
655 ret = cdrom_flush_cache(cdi);
657 return ret;
660 static int cdrom_mrw_set_lba_space(struct cdrom_device_info *cdi, int space)
662 struct packet_command cgc;
663 struct mode_page_header *mph;
664 char buffer[16];
665 int ret, offset, size;
667 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
669 cgc.buffer = buffer;
670 cgc.buflen = sizeof(buffer);
672 if ((ret = cdrom_mode_sense(cdi, &cgc, cdi->mrw_mode_page, 0)))
673 return ret;
675 mph = (struct mode_page_header *) buffer;
676 offset = be16_to_cpu(mph->desc_length);
677 size = be16_to_cpu(mph->mode_data_length) + 2;
679 buffer[offset + 3] = space;
680 cgc.buflen = size;
682 if ((ret = cdrom_mode_select(cdi, &cgc)))
683 return ret;
685 printk(KERN_INFO "cdrom: %s: mrw address space %s selected\n", cdi->name, mrw_address_space[space]);
686 return 0;
689 static int cdrom_get_random_writable(struct cdrom_device_info *cdi,
690 struct rwrt_feature_desc *rfd)
692 struct packet_command cgc;
693 char buffer[24];
694 int ret;
696 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
698 cgc.cmd[0] = GPCMD_GET_CONFIGURATION; /* often 0x46 */
699 cgc.cmd[3] = CDF_RWRT; /* often 0x0020 */
700 cgc.cmd[8] = sizeof(buffer); /* often 0x18 */
701 cgc.quiet = 1;
703 if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
704 return ret;
706 memcpy(rfd, &buffer[sizeof(struct feature_header)], sizeof (*rfd));
707 return 0;
710 static int cdrom_has_defect_mgt(struct cdrom_device_info *cdi)
712 struct packet_command cgc;
713 char buffer[16];
714 __u16 *feature_code;
715 int ret;
717 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
719 cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
720 cgc.cmd[3] = CDF_HWDM;
721 cgc.cmd[8] = sizeof(buffer);
722 cgc.quiet = 1;
724 if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
725 return ret;
727 feature_code = (__u16 *) &buffer[sizeof(struct feature_header)];
728 if (be16_to_cpu(*feature_code) == CDF_HWDM)
729 return 0;
731 return 1;
735 static int cdrom_is_random_writable(struct cdrom_device_info *cdi, int *write)
737 struct rwrt_feature_desc rfd;
738 int ret;
740 *write = 0;
742 if ((ret = cdrom_get_random_writable(cdi, &rfd)))
743 return ret;
745 if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
746 *write = 1;
748 return 0;
751 static int cdrom_media_erasable(struct cdrom_device_info *cdi)
753 disc_information di;
754 int ret;
756 ret = cdrom_get_disc_info(cdi, &di);
757 if (ret < 0 || ret < offsetof(typeof(di), n_first_track))
758 return -1;
760 return di.erasable;
764 * FIXME: check RO bit
766 static int cdrom_dvdram_open_write(struct cdrom_device_info *cdi)
768 int ret = cdrom_media_erasable(cdi);
771 * allow writable open if media info read worked and media is
772 * erasable, _or_ if it fails since not all drives support it
774 if (!ret)
775 return 1;
777 return 0;
780 static int cdrom_mrw_open_write(struct cdrom_device_info *cdi)
782 disc_information di;
783 int ret;
786 * always reset to DMA lba space on open
788 if (cdrom_mrw_set_lba_space(cdi, MRW_LBA_DMA)) {
789 printk(KERN_ERR "cdrom: failed setting lba address space\n");
790 return 1;
793 ret = cdrom_get_disc_info(cdi, &di);
794 if (ret < 0 || ret < offsetof(typeof(di),disc_type))
795 return 1;
797 if (!di.erasable)
798 return 1;
801 * mrw_status
802 * 0 - not MRW formatted
803 * 1 - MRW bgformat started, but not running or complete
804 * 2 - MRW bgformat in progress
805 * 3 - MRW formatting complete
807 ret = 0;
808 printk(KERN_INFO "cdrom open: mrw_status '%s'\n",
809 mrw_format_status[di.mrw_status]);
810 if (!di.mrw_status)
811 ret = 1;
812 else if (di.mrw_status == CDM_MRW_BGFORMAT_INACTIVE &&
813 mrw_format_restart)
814 ret = cdrom_mrw_bgformat(cdi, 1);
816 return ret;
819 static int mo_open_write(struct cdrom_device_info *cdi)
821 struct packet_command cgc;
822 char buffer[255];
823 int ret;
825 init_cdrom_command(&cgc, &buffer, 4, CGC_DATA_READ);
826 cgc.quiet = 1;
829 * obtain write protect information as per
830 * drivers/scsi/sd.c:sd_read_write_protect_flag
833 ret = cdrom_mode_sense(cdi, &cgc, GPMODE_ALL_PAGES, 0);
834 if (ret)
835 ret = cdrom_mode_sense(cdi, &cgc, GPMODE_VENDOR_PAGE, 0);
836 if (ret) {
837 cgc.buflen = 255;
838 ret = cdrom_mode_sense(cdi, &cgc, GPMODE_ALL_PAGES, 0);
841 /* drive gave us no info, let the user go ahead */
842 if (ret)
843 return 0;
845 return buffer[3] & 0x80;
848 static int cdrom_ram_open_write(struct cdrom_device_info *cdi)
850 struct rwrt_feature_desc rfd;
851 int ret;
853 if ((ret = cdrom_has_defect_mgt(cdi)))
854 return ret;
856 if ((ret = cdrom_get_random_writable(cdi, &rfd)))
857 return ret;
858 else if (CDF_RWRT == be16_to_cpu(rfd.feature_code))
859 ret = !rfd.curr;
861 cdinfo(CD_OPEN, "can open for random write\n");
862 return ret;
865 static void cdrom_mmc3_profile(struct cdrom_device_info *cdi)
867 struct packet_command cgc;
868 char buffer[32];
869 int ret, mmc3_profile;
871 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_READ);
873 cgc.cmd[0] = GPCMD_GET_CONFIGURATION;
874 cgc.cmd[1] = 0;
875 cgc.cmd[2] = cgc.cmd[3] = 0; /* Starting Feature Number */
876 cgc.cmd[8] = sizeof(buffer); /* Allocation Length */
877 cgc.quiet = 1;
879 if ((ret = cdi->ops->generic_packet(cdi, &cgc)))
880 mmc3_profile = 0xffff;
881 else
882 mmc3_profile = (buffer[6] << 8) | buffer[7];
884 cdi->mmc3_profile = mmc3_profile;
887 static int cdrom_is_dvd_rw(struct cdrom_device_info *cdi)
889 switch (cdi->mmc3_profile) {
890 case 0x12: /* DVD-RAM */
891 case 0x1A: /* DVD+RW */
892 return 0;
893 default:
894 return 1;
899 * returns 0 for ok to open write, non-0 to disallow
901 static int cdrom_open_write(struct cdrom_device_info *cdi)
903 int mrw, mrw_write, ram_write;
904 int ret = 1;
906 mrw = 0;
907 if (!cdrom_is_mrw(cdi, &mrw_write))
908 mrw = 1;
910 if (CDROM_CAN(CDC_MO_DRIVE))
911 ram_write = 1;
912 else
913 (void) cdrom_is_random_writable(cdi, &ram_write);
915 if (mrw)
916 cdi->mask &= ~CDC_MRW;
917 else
918 cdi->mask |= CDC_MRW;
920 if (mrw_write)
921 cdi->mask &= ~CDC_MRW_W;
922 else
923 cdi->mask |= CDC_MRW_W;
925 if (ram_write)
926 cdi->mask &= ~CDC_RAM;
927 else
928 cdi->mask |= CDC_RAM;
930 if (CDROM_CAN(CDC_MRW_W))
931 ret = cdrom_mrw_open_write(cdi);
932 else if (CDROM_CAN(CDC_DVD_RAM))
933 ret = cdrom_dvdram_open_write(cdi);
934 else if (CDROM_CAN(CDC_RAM) &&
935 !CDROM_CAN(CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_MRW|CDC_MO_DRIVE))
936 ret = cdrom_ram_open_write(cdi);
937 else if (CDROM_CAN(CDC_MO_DRIVE))
938 ret = mo_open_write(cdi);
939 else if (!cdrom_is_dvd_rw(cdi))
940 ret = 0;
942 return ret;
945 static void cdrom_dvd_rw_close_write(struct cdrom_device_info *cdi)
947 struct packet_command cgc;
949 if (cdi->mmc3_profile != 0x1a) {
950 cdinfo(CD_CLOSE, "%s: No DVD+RW\n", cdi->name);
951 return;
954 if (!cdi->media_written) {
955 cdinfo(CD_CLOSE, "%s: DVD+RW media clean\n", cdi->name);
956 return;
959 printk(KERN_INFO "cdrom: %s: dirty DVD+RW media, \"finalizing\"\n",
960 cdi->name);
962 init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
963 cgc.cmd[0] = GPCMD_FLUSH_CACHE;
964 cgc.timeout = 30*HZ;
965 cdi->ops->generic_packet(cdi, &cgc);
967 init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
968 cgc.cmd[0] = GPCMD_CLOSE_TRACK;
969 cgc.timeout = 3000*HZ;
970 cgc.quiet = 1;
971 cdi->ops->generic_packet(cdi, &cgc);
973 init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
974 cgc.cmd[0] = GPCMD_CLOSE_TRACK;
975 cgc.cmd[2] = 2; /* Close session */
976 cgc.quiet = 1;
977 cgc.timeout = 3000*HZ;
978 cdi->ops->generic_packet(cdi, &cgc);
980 cdi->media_written = 0;
983 static int cdrom_close_write(struct cdrom_device_info *cdi)
985 #if 0
986 return cdrom_flush_cache(cdi);
987 #else
988 return 0;
989 #endif
992 /* We use the open-option O_NONBLOCK to indicate that the
993 * purpose of opening is only for subsequent ioctl() calls; no device
994 * integrity checks are performed.
996 * We hope that all cd-player programs will adopt this convention. It
997 * is in their own interest: device control becomes a lot easier
998 * this way.
1000 int cdrom_open(struct cdrom_device_info *cdi, struct inode *ip, struct file *fp)
1002 int ret;
1004 cdinfo(CD_OPEN, "entering cdrom_open\n");
1006 /* if this was a O_NONBLOCK open and we should honor the flags,
1007 * do a quick open without drive/disc integrity checks. */
1008 cdi->use_count++;
1009 if ((fp->f_flags & O_NONBLOCK) && (cdi->options & CDO_USE_FFLAGS)) {
1010 ret = cdi->ops->open(cdi, 1);
1011 } else {
1012 ret = open_for_data(cdi);
1013 if (ret)
1014 goto err;
1015 cdrom_mmc3_profile(cdi);
1016 if (fp->f_mode & FMODE_WRITE) {
1017 ret = -EROFS;
1018 if (cdrom_open_write(cdi))
1019 goto err;
1020 if (!CDROM_CAN(CDC_RAM))
1021 goto err;
1022 ret = 0;
1023 cdi->media_written = 0;
1027 if (ret)
1028 goto err;
1030 cdinfo(CD_OPEN, "Use count for \"/dev/%s\" now %d\n",
1031 cdi->name, cdi->use_count);
1032 /* Do this on open. Don't wait for mount, because they might
1033 not be mounting, but opening with O_NONBLOCK */
1034 check_disk_change(ip->i_bdev);
1035 return 0;
1036 err:
1037 cdi->use_count--;
1038 return ret;
1041 static
1042 int open_for_data(struct cdrom_device_info * cdi)
1044 int ret;
1045 struct cdrom_device_ops *cdo = cdi->ops;
1046 tracktype tracks;
1047 cdinfo(CD_OPEN, "entering open_for_data\n");
1048 /* Check if the driver can report drive status. If it can, we
1049 can do clever things. If it can't, well, we at least tried! */
1050 if (cdo->drive_status != NULL) {
1051 ret = cdo->drive_status(cdi, CDSL_CURRENT);
1052 cdinfo(CD_OPEN, "drive_status=%d\n", ret);
1053 if (ret == CDS_TRAY_OPEN) {
1054 cdinfo(CD_OPEN, "the tray is open...\n");
1055 /* can/may i close it? */
1056 if (CDROM_CAN(CDC_CLOSE_TRAY) &&
1057 cdi->options & CDO_AUTO_CLOSE) {
1058 cdinfo(CD_OPEN, "trying to close the tray.\n");
1059 ret=cdo->tray_move(cdi,0);
1060 if (ret) {
1061 cdinfo(CD_OPEN, "bummer. tried to close the tray but failed.\n");
1062 /* Ignore the error from the low
1063 level driver. We don't care why it
1064 couldn't close the tray. We only care
1065 that there is no disc in the drive,
1066 since that is the _REAL_ problem here.*/
1067 ret=-ENOMEDIUM;
1068 goto clean_up_and_return;
1070 } else {
1071 cdinfo(CD_OPEN, "bummer. this drive can't close the tray.\n");
1072 ret=-ENOMEDIUM;
1073 goto clean_up_and_return;
1075 /* Ok, the door should be closed now.. Check again */
1076 ret = cdo->drive_status(cdi, CDSL_CURRENT);
1077 if ((ret == CDS_NO_DISC) || (ret==CDS_TRAY_OPEN)) {
1078 cdinfo(CD_OPEN, "bummer. the tray is still not closed.\n");
1079 cdinfo(CD_OPEN, "tray might not contain a medium.\n");
1080 ret=-ENOMEDIUM;
1081 goto clean_up_and_return;
1083 cdinfo(CD_OPEN, "the tray is now closed.\n");
1085 /* the door should be closed now, check for the disc */
1086 ret = cdo->drive_status(cdi, CDSL_CURRENT);
1087 if (ret!=CDS_DISC_OK) {
1088 ret = -ENOMEDIUM;
1089 goto clean_up_and_return;
1092 cdrom_count_tracks(cdi, &tracks);
1093 if (tracks.error == CDS_NO_DISC) {
1094 cdinfo(CD_OPEN, "bummer. no disc.\n");
1095 ret=-ENOMEDIUM;
1096 goto clean_up_and_return;
1098 /* CD-Players which don't use O_NONBLOCK, workman
1099 * for example, need bit CDO_CHECK_TYPE cleared! */
1100 if (tracks.data==0) {
1101 if (cdi->options & CDO_CHECK_TYPE) {
1102 /* give people a warning shot, now that CDO_CHECK_TYPE
1103 is the default case! */
1104 cdinfo(CD_OPEN, "bummer. wrong media type.\n");
1105 cdinfo(CD_WARNING, "pid %d must open device O_NONBLOCK!\n",
1106 (unsigned int)current->pid);
1107 ret=-EMEDIUMTYPE;
1108 goto clean_up_and_return;
1110 else {
1111 cdinfo(CD_OPEN, "wrong media type, but CDO_CHECK_TYPE not set.\n");
1115 cdinfo(CD_OPEN, "all seems well, opening the device.\n");
1117 /* all seems well, we can open the device */
1118 ret = cdo->open(cdi, 0); /* open for data */
1119 cdinfo(CD_OPEN, "opening the device gave me %d.\n", ret);
1120 /* After all this careful checking, we shouldn't have problems
1121 opening the device, but we don't want the device locked if
1122 this somehow fails... */
1123 if (ret) {
1124 cdinfo(CD_OPEN, "open device failed.\n");
1125 goto clean_up_and_return;
1127 if (CDROM_CAN(CDC_LOCK) && (cdi->options & CDO_LOCK)) {
1128 cdo->lock_door(cdi, 1);
1129 cdinfo(CD_OPEN, "door locked.\n");
1131 cdinfo(CD_OPEN, "device opened successfully.\n");
1132 return ret;
1134 /* Something failed. Try to unlock the drive, because some drivers
1135 (notably ide-cd) lock the drive after every command. This produced
1136 a nasty bug where after mount failed, the drive would remain locked!
1137 This ensures that the drive gets unlocked after a mount fails. This
1138 is a goto to avoid bloating the driver with redundant code. */
1139 clean_up_and_return:
1140 cdinfo(CD_OPEN, "open failed.\n");
1141 if (CDROM_CAN(CDC_LOCK) && cdi->options & CDO_LOCK) {
1142 cdo->lock_door(cdi, 0);
1143 cdinfo(CD_OPEN, "door unlocked.\n");
1145 return ret;
1148 /* This code is similar to that in open_for_data. The routine is called
1149 whenever an audio play operation is requested.
1151 int check_for_audio_disc(struct cdrom_device_info * cdi,
1152 struct cdrom_device_ops * cdo)
1154 int ret;
1155 tracktype tracks;
1156 cdinfo(CD_OPEN, "entering check_for_audio_disc\n");
1157 if (!(cdi->options & CDO_CHECK_TYPE))
1158 return 0;
1159 if (cdo->drive_status != NULL) {
1160 ret = cdo->drive_status(cdi, CDSL_CURRENT);
1161 cdinfo(CD_OPEN, "drive_status=%d\n", ret);
1162 if (ret == CDS_TRAY_OPEN) {
1163 cdinfo(CD_OPEN, "the tray is open...\n");
1164 /* can/may i close it? */
1165 if (CDROM_CAN(CDC_CLOSE_TRAY) &&
1166 cdi->options & CDO_AUTO_CLOSE) {
1167 cdinfo(CD_OPEN, "trying to close the tray.\n");
1168 ret=cdo->tray_move(cdi,0);
1169 if (ret) {
1170 cdinfo(CD_OPEN, "bummer. tried to close tray but failed.\n");
1171 /* Ignore the error from the low
1172 level driver. We don't care why it
1173 couldn't close the tray. We only care
1174 that there is no disc in the drive,
1175 since that is the _REAL_ problem here.*/
1176 return -ENOMEDIUM;
1178 } else {
1179 cdinfo(CD_OPEN, "bummer. this driver can't close the tray.\n");
1180 return -ENOMEDIUM;
1182 /* Ok, the door should be closed now.. Check again */
1183 ret = cdo->drive_status(cdi, CDSL_CURRENT);
1184 if ((ret == CDS_NO_DISC) || (ret==CDS_TRAY_OPEN)) {
1185 cdinfo(CD_OPEN, "bummer. the tray is still not closed.\n");
1186 return -ENOMEDIUM;
1188 if (ret!=CDS_DISC_OK) {
1189 cdinfo(CD_OPEN, "bummer. disc isn't ready.\n");
1190 return -EIO;
1192 cdinfo(CD_OPEN, "the tray is now closed.\n");
1195 cdrom_count_tracks(cdi, &tracks);
1196 if (tracks.error)
1197 return(tracks.error);
1199 if (tracks.audio==0)
1200 return -EMEDIUMTYPE;
1202 return 0;
1205 /* Admittedly, the logic below could be performed in a nicer way. */
1206 int cdrom_release(struct cdrom_device_info *cdi, struct file *fp)
1208 struct cdrom_device_ops *cdo = cdi->ops;
1209 int opened_for_data;
1211 cdinfo(CD_CLOSE, "entering cdrom_release\n");
1213 if (cdi->use_count > 0)
1214 cdi->use_count--;
1215 if (cdi->use_count == 0)
1216 cdinfo(CD_CLOSE, "Use count for \"/dev/%s\" now zero\n", cdi->name);
1217 if (cdi->use_count == 0)
1218 cdrom_dvd_rw_close_write(cdi);
1219 if (cdi->use_count == 0 &&
1220 (cdo->capability & CDC_LOCK) && !keeplocked) {
1221 cdinfo(CD_CLOSE, "Unlocking door!\n");
1222 cdo->lock_door(cdi, 0);
1224 opened_for_data = !(cdi->options & CDO_USE_FFLAGS) ||
1225 !(fp && fp->f_flags & O_NONBLOCK);
1228 * flush cache on last write release
1230 if (CDROM_CAN(CDC_RAM) && !cdi->use_count && cdi->for_data)
1231 cdrom_close_write(cdi);
1233 cdo->release(cdi);
1234 if (cdi->use_count == 0) { /* last process that closes dev*/
1235 if (opened_for_data &&
1236 cdi->options & CDO_AUTO_EJECT && CDROM_CAN(CDC_OPEN_TRAY))
1237 cdo->tray_move(cdi, 1);
1239 return 0;
1242 static int cdrom_read_mech_status(struct cdrom_device_info *cdi,
1243 struct cdrom_changer_info *buf)
1245 struct packet_command cgc;
1246 struct cdrom_device_ops *cdo = cdi->ops;
1247 int length;
1250 * Sanyo changer isn't spec compliant (doesn't use regular change
1251 * LOAD_UNLOAD command, and it doesn't implement the mech status
1252 * command below
1254 if (cdi->sanyo_slot) {
1255 buf->hdr.nslots = 3;
1256 buf->hdr.curslot = cdi->sanyo_slot == 3 ? 0 : cdi->sanyo_slot;
1257 for (length = 0; length < 3; length++) {
1258 buf->slots[length].disc_present = 1;
1259 buf->slots[length].change = 0;
1261 return 0;
1264 length = sizeof(struct cdrom_mechstat_header) +
1265 cdi->capacity * sizeof(struct cdrom_slot);
1267 init_cdrom_command(&cgc, buf, length, CGC_DATA_READ);
1268 cgc.cmd[0] = GPCMD_MECHANISM_STATUS;
1269 cgc.cmd[8] = (length >> 8) & 0xff;
1270 cgc.cmd[9] = length & 0xff;
1271 return cdo->generic_packet(cdi, &cgc);
1274 static int cdrom_slot_status(struct cdrom_device_info *cdi, int slot)
1276 struct cdrom_changer_info *info;
1277 int ret;
1279 cdinfo(CD_CHANGER, "entering cdrom_slot_status()\n");
1280 if (cdi->sanyo_slot)
1281 return CDS_NO_INFO;
1283 info = kmalloc(sizeof(*info), GFP_KERNEL);
1284 if (!info)
1285 return -ENOMEM;
1287 if ((ret = cdrom_read_mech_status(cdi, info)))
1288 goto out_free;
1290 if (info->slots[slot].disc_present)
1291 ret = CDS_DISC_OK;
1292 else
1293 ret = CDS_NO_DISC;
1295 out_free:
1296 kfree(info);
1297 return ret;
1300 /* Return the number of slots for an ATAPI/SCSI cdrom,
1301 * return 1 if not a changer.
1303 int cdrom_number_of_slots(struct cdrom_device_info *cdi)
1305 int status;
1306 int nslots = 1;
1307 struct cdrom_changer_info *info;
1309 cdinfo(CD_CHANGER, "entering cdrom_number_of_slots()\n");
1310 /* cdrom_read_mech_status requires a valid value for capacity: */
1311 cdi->capacity = 0;
1313 info = kmalloc(sizeof(*info), GFP_KERNEL);
1314 if (!info)
1315 return -ENOMEM;
1317 if ((status = cdrom_read_mech_status(cdi, info)) == 0)
1318 nslots = info->hdr.nslots;
1320 kfree(info);
1321 return nslots;
1325 /* If SLOT < 0, unload the current slot. Otherwise, try to load SLOT. */
1326 static int cdrom_load_unload(struct cdrom_device_info *cdi, int slot)
1328 struct packet_command cgc;
1330 cdinfo(CD_CHANGER, "entering cdrom_load_unload()\n");
1331 if (cdi->sanyo_slot && slot < 0)
1332 return 0;
1334 init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
1335 cgc.cmd[0] = GPCMD_LOAD_UNLOAD;
1336 cgc.cmd[4] = 2 + (slot >= 0);
1337 cgc.cmd[8] = slot;
1338 cgc.timeout = 60 * HZ;
1340 /* The Sanyo 3 CD changer uses byte 7 of the
1341 GPCMD_TEST_UNIT_READY to command to switch CDs instead of
1342 using the GPCMD_LOAD_UNLOAD opcode. */
1343 if (cdi->sanyo_slot && -1 < slot) {
1344 cgc.cmd[0] = GPCMD_TEST_UNIT_READY;
1345 cgc.cmd[7] = slot;
1346 cgc.cmd[4] = cgc.cmd[8] = 0;
1347 cdi->sanyo_slot = slot ? slot : 3;
1350 return cdi->ops->generic_packet(cdi, &cgc);
1353 static int cdrom_select_disc(struct cdrom_device_info *cdi, int slot)
1355 struct cdrom_changer_info *info;
1356 int curslot;
1357 int ret;
1359 cdinfo(CD_CHANGER, "entering cdrom_select_disc()\n");
1360 if (!CDROM_CAN(CDC_SELECT_DISC))
1361 return -EDRIVE_CANT_DO_THIS;
1363 (void) cdi->ops->media_changed(cdi, slot);
1365 if (slot == CDSL_NONE) {
1366 /* set media changed bits, on both queues */
1367 cdi->mc_flags = 0x3;
1368 return cdrom_load_unload(cdi, -1);
1371 info = kmalloc(sizeof(*info), GFP_KERNEL);
1372 if (!info)
1373 return -ENOMEM;
1375 if ((ret = cdrom_read_mech_status(cdi, info))) {
1376 kfree(info);
1377 return ret;
1380 curslot = info->hdr.curslot;
1381 kfree(info);
1383 if (cdi->use_count > 1 || keeplocked) {
1384 if (slot == CDSL_CURRENT) {
1385 return curslot;
1386 } else {
1387 return -EBUSY;
1391 /* Specifying CDSL_CURRENT will attempt to load the currnet slot,
1392 which is useful if it had been previously unloaded.
1393 Whether it can or not, it returns the current slot.
1394 Similarly, if slot happens to be the current one, we still
1395 try and load it. */
1396 if (slot == CDSL_CURRENT)
1397 slot = curslot;
1399 /* set media changed bits on both queues */
1400 cdi->mc_flags = 0x3;
1401 if ((ret = cdrom_load_unload(cdi, slot)))
1402 return ret;
1404 return slot;
1407 /* We want to make media_changed accessible to the user through an
1408 * ioctl. The main problem now is that we must double-buffer the
1409 * low-level implementation, to assure that the VFS and the user both
1410 * see a medium change once.
1413 static
1414 int media_changed(struct cdrom_device_info *cdi, int queue)
1416 unsigned int mask = (1 << (queue & 1));
1417 int ret = !!(cdi->mc_flags & mask);
1419 if (!CDROM_CAN(CDC_MEDIA_CHANGED))
1420 return ret;
1421 /* changed since last call? */
1422 if (cdi->ops->media_changed(cdi, CDSL_CURRENT)) {
1423 cdi->mc_flags = 0x3; /* set bit on both queues */
1424 ret |= 1;
1425 cdi->media_written = 0;
1427 cdi->mc_flags &= ~mask; /* clear bit */
1428 return ret;
1431 int cdrom_media_changed(struct cdrom_device_info *cdi)
1433 /* This talks to the VFS, which doesn't like errors - just 1 or 0.
1434 * Returning "0" is always safe (media hasn't been changed). Do that
1435 * if the low-level cdrom driver dosn't support media changed. */
1436 if (cdi == NULL || cdi->ops->media_changed == NULL)
1437 return 0;
1438 if (!CDROM_CAN(CDC_MEDIA_CHANGED))
1439 return 0;
1440 return media_changed(cdi, 0);
1443 /* badly broken, I know. Is due for a fixup anytime. */
1444 static void cdrom_count_tracks(struct cdrom_device_info *cdi, tracktype* tracks)
1446 struct cdrom_tochdr header;
1447 struct cdrom_tocentry entry;
1448 int ret, i;
1449 tracks->data=0;
1450 tracks->audio=0;
1451 tracks->cdi=0;
1452 tracks->xa=0;
1453 tracks->error=0;
1454 cdinfo(CD_COUNT_TRACKS, "entering cdrom_count_tracks\n");
1455 if (!CDROM_CAN(CDC_PLAY_AUDIO)) {
1456 tracks->error=CDS_NO_INFO;
1457 return;
1459 /* Grab the TOC header so we can see how many tracks there are */
1460 if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header))) {
1461 if (ret == -ENOMEDIUM)
1462 tracks->error = CDS_NO_DISC;
1463 else
1464 tracks->error = CDS_NO_INFO;
1465 return;
1467 /* check what type of tracks are on this disc */
1468 entry.cdte_format = CDROM_MSF;
1469 for (i = header.cdth_trk0; i <= header.cdth_trk1; i++) {
1470 entry.cdte_track = i;
1471 if (cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &entry)) {
1472 tracks->error=CDS_NO_INFO;
1473 return;
1475 if (entry.cdte_ctrl & CDROM_DATA_TRACK) {
1476 if (entry.cdte_format == 0x10)
1477 tracks->cdi++;
1478 else if (entry.cdte_format == 0x20)
1479 tracks->xa++;
1480 else
1481 tracks->data++;
1482 } else
1483 tracks->audio++;
1484 cdinfo(CD_COUNT_TRACKS, "track %d: format=%d, ctrl=%d\n",
1485 i, entry.cdte_format, entry.cdte_ctrl);
1487 cdinfo(CD_COUNT_TRACKS, "disc has %d tracks: %d=audio %d=data %d=Cd-I %d=XA\n",
1488 header.cdth_trk1, tracks->audio, tracks->data,
1489 tracks->cdi, tracks->xa);
1492 /* Requests to the low-level drivers will /always/ be done in the
1493 following format convention:
1495 CDROM_LBA: all data-related requests.
1496 CDROM_MSF: all audio-related requests.
1498 However, a low-level implementation is allowed to refuse this
1499 request, and return information in its own favorite format.
1501 It doesn't make sense /at all/ to ask for a play_audio in LBA
1502 format, or ask for multi-session info in MSF format. However, for
1503 backward compatibility these format requests will be satisfied, but
1504 the requests to the low-level drivers will be sanitized in the more
1505 meaningful format indicated above.
1508 static
1509 void sanitize_format(union cdrom_addr *addr,
1510 u_char * curr, u_char requested)
1512 if (*curr == requested)
1513 return; /* nothing to be done! */
1514 if (requested == CDROM_LBA) {
1515 addr->lba = (int) addr->msf.frame +
1516 75 * (addr->msf.second - 2 + 60 * addr->msf.minute);
1517 } else { /* CDROM_MSF */
1518 int lba = addr->lba;
1519 addr->msf.frame = lba % 75;
1520 lba /= 75;
1521 lba += 2;
1522 addr->msf.second = lba % 60;
1523 addr->msf.minute = lba / 60;
1525 *curr = requested;
1528 void init_cdrom_command(struct packet_command *cgc, void *buf, int len,
1529 int type)
1531 memset(cgc, 0, sizeof(struct packet_command));
1532 if (buf)
1533 memset(buf, 0, len);
1534 cgc->buffer = (char *) buf;
1535 cgc->buflen = len;
1536 cgc->data_direction = type;
1537 cgc->timeout = CDROM_DEF_TIMEOUT;
1540 /* DVD handling */
1542 #define copy_key(dest,src) memcpy((dest), (src), sizeof(dvd_key))
1543 #define copy_chal(dest,src) memcpy((dest), (src), sizeof(dvd_challenge))
1545 static void setup_report_key(struct packet_command *cgc, unsigned agid, unsigned type)
1547 cgc->cmd[0] = GPCMD_REPORT_KEY;
1548 cgc->cmd[10] = type | (agid << 6);
1549 switch (type) {
1550 case 0: case 8: case 5: {
1551 cgc->buflen = 8;
1552 break;
1554 case 1: {
1555 cgc->buflen = 16;
1556 break;
1558 case 2: case 4: {
1559 cgc->buflen = 12;
1560 break;
1563 cgc->cmd[9] = cgc->buflen;
1564 cgc->data_direction = CGC_DATA_READ;
1567 static void setup_send_key(struct packet_command *cgc, unsigned agid, unsigned type)
1569 cgc->cmd[0] = GPCMD_SEND_KEY;
1570 cgc->cmd[10] = type | (agid << 6);
1571 switch (type) {
1572 case 1: {
1573 cgc->buflen = 16;
1574 break;
1576 case 3: {
1577 cgc->buflen = 12;
1578 break;
1580 case 6: {
1581 cgc->buflen = 8;
1582 break;
1585 cgc->cmd[9] = cgc->buflen;
1586 cgc->data_direction = CGC_DATA_WRITE;
1589 static int dvd_do_auth(struct cdrom_device_info *cdi, dvd_authinfo *ai)
1591 int ret;
1592 u_char buf[20];
1593 struct packet_command cgc;
1594 struct cdrom_device_ops *cdo = cdi->ops;
1595 rpc_state_t rpc_state;
1597 memset(buf, 0, sizeof(buf));
1598 init_cdrom_command(&cgc, buf, 0, CGC_DATA_READ);
1600 switch (ai->type) {
1601 /* LU data send */
1602 case DVD_LU_SEND_AGID:
1603 cdinfo(CD_DVD, "entering DVD_LU_SEND_AGID\n");
1604 cgc.quiet = 1;
1605 setup_report_key(&cgc, ai->lsa.agid, 0);
1607 if ((ret = cdo->generic_packet(cdi, &cgc)))
1608 return ret;
1610 ai->lsa.agid = buf[7] >> 6;
1611 /* Returning data, let host change state */
1612 break;
1614 case DVD_LU_SEND_KEY1:
1615 cdinfo(CD_DVD, "entering DVD_LU_SEND_KEY1\n");
1616 setup_report_key(&cgc, ai->lsk.agid, 2);
1618 if ((ret = cdo->generic_packet(cdi, &cgc)))
1619 return ret;
1621 copy_key(ai->lsk.key, &buf[4]);
1622 /* Returning data, let host change state */
1623 break;
1625 case DVD_LU_SEND_CHALLENGE:
1626 cdinfo(CD_DVD, "entering DVD_LU_SEND_CHALLENGE\n");
1627 setup_report_key(&cgc, ai->lsc.agid, 1);
1629 if ((ret = cdo->generic_packet(cdi, &cgc)))
1630 return ret;
1632 copy_chal(ai->lsc.chal, &buf[4]);
1633 /* Returning data, let host change state */
1634 break;
1636 /* Post-auth key */
1637 case DVD_LU_SEND_TITLE_KEY:
1638 cdinfo(CD_DVD, "entering DVD_LU_SEND_TITLE_KEY\n");
1639 cgc.quiet = 1;
1640 setup_report_key(&cgc, ai->lstk.agid, 4);
1641 cgc.cmd[5] = ai->lstk.lba;
1642 cgc.cmd[4] = ai->lstk.lba >> 8;
1643 cgc.cmd[3] = ai->lstk.lba >> 16;
1644 cgc.cmd[2] = ai->lstk.lba >> 24;
1646 if ((ret = cdo->generic_packet(cdi, &cgc)))
1647 return ret;
1649 ai->lstk.cpm = (buf[4] >> 7) & 1;
1650 ai->lstk.cp_sec = (buf[4] >> 6) & 1;
1651 ai->lstk.cgms = (buf[4] >> 4) & 3;
1652 copy_key(ai->lstk.title_key, &buf[5]);
1653 /* Returning data, let host change state */
1654 break;
1656 case DVD_LU_SEND_ASF:
1657 cdinfo(CD_DVD, "entering DVD_LU_SEND_ASF\n");
1658 setup_report_key(&cgc, ai->lsasf.agid, 5);
1660 if ((ret = cdo->generic_packet(cdi, &cgc)))
1661 return ret;
1663 ai->lsasf.asf = buf[7] & 1;
1664 break;
1666 /* LU data receive (LU changes state) */
1667 case DVD_HOST_SEND_CHALLENGE:
1668 cdinfo(CD_DVD, "entering DVD_HOST_SEND_CHALLENGE\n");
1669 setup_send_key(&cgc, ai->hsc.agid, 1);
1670 buf[1] = 0xe;
1671 copy_chal(&buf[4], ai->hsc.chal);
1673 if ((ret = cdo->generic_packet(cdi, &cgc)))
1674 return ret;
1676 ai->type = DVD_LU_SEND_KEY1;
1677 break;
1679 case DVD_HOST_SEND_KEY2:
1680 cdinfo(CD_DVD, "entering DVD_HOST_SEND_KEY2\n");
1681 setup_send_key(&cgc, ai->hsk.agid, 3);
1682 buf[1] = 0xa;
1683 copy_key(&buf[4], ai->hsk.key);
1685 if ((ret = cdo->generic_packet(cdi, &cgc))) {
1686 ai->type = DVD_AUTH_FAILURE;
1687 return ret;
1689 ai->type = DVD_AUTH_ESTABLISHED;
1690 break;
1692 /* Misc */
1693 case DVD_INVALIDATE_AGID:
1694 cgc.quiet = 1;
1695 cdinfo(CD_DVD, "entering DVD_INVALIDATE_AGID\n");
1696 setup_report_key(&cgc, ai->lsa.agid, 0x3f);
1697 if ((ret = cdo->generic_packet(cdi, &cgc)))
1698 return ret;
1699 break;
1701 /* Get region settings */
1702 case DVD_LU_SEND_RPC_STATE:
1703 cdinfo(CD_DVD, "entering DVD_LU_SEND_RPC_STATE\n");
1704 setup_report_key(&cgc, 0, 8);
1705 memset(&rpc_state, 0, sizeof(rpc_state_t));
1706 cgc.buffer = (char *) &rpc_state;
1708 if ((ret = cdo->generic_packet(cdi, &cgc)))
1709 return ret;
1711 ai->lrpcs.type = rpc_state.type_code;
1712 ai->lrpcs.vra = rpc_state.vra;
1713 ai->lrpcs.ucca = rpc_state.ucca;
1714 ai->lrpcs.region_mask = rpc_state.region_mask;
1715 ai->lrpcs.rpc_scheme = rpc_state.rpc_scheme;
1716 break;
1718 /* Set region settings */
1719 case DVD_HOST_SEND_RPC_STATE:
1720 cdinfo(CD_DVD, "entering DVD_HOST_SEND_RPC_STATE\n");
1721 setup_send_key(&cgc, 0, 6);
1722 buf[1] = 6;
1723 buf[4] = ai->hrpcs.pdrc;
1725 if ((ret = cdo->generic_packet(cdi, &cgc)))
1726 return ret;
1727 break;
1729 default:
1730 cdinfo(CD_WARNING, "Invalid DVD key ioctl (%d)\n", ai->type);
1731 return -ENOTTY;
1734 return 0;
1737 static int dvd_read_physical(struct cdrom_device_info *cdi, dvd_struct *s)
1739 unsigned char buf[21], *base;
1740 struct dvd_layer *layer;
1741 struct packet_command cgc;
1742 struct cdrom_device_ops *cdo = cdi->ops;
1743 int ret, layer_num = s->physical.layer_num;
1745 if (layer_num >= DVD_LAYERS)
1746 return -EINVAL;
1748 init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ);
1749 cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1750 cgc.cmd[6] = layer_num;
1751 cgc.cmd[7] = s->type;
1752 cgc.cmd[9] = cgc.buflen & 0xff;
1755 * refrain from reporting errors on non-existing layers (mainly)
1757 cgc.quiet = 1;
1759 if ((ret = cdo->generic_packet(cdi, &cgc)))
1760 return ret;
1762 base = &buf[4];
1763 layer = &s->physical.layer[layer_num];
1766 * place the data... really ugly, but at least we won't have to
1767 * worry about endianess in userspace.
1769 memset(layer, 0, sizeof(*layer));
1770 layer->book_version = base[0] & 0xf;
1771 layer->book_type = base[0] >> 4;
1772 layer->min_rate = base[1] & 0xf;
1773 layer->disc_size = base[1] >> 4;
1774 layer->layer_type = base[2] & 0xf;
1775 layer->track_path = (base[2] >> 4) & 1;
1776 layer->nlayers = (base[2] >> 5) & 3;
1777 layer->track_density = base[3] & 0xf;
1778 layer->linear_density = base[3] >> 4;
1779 layer->start_sector = base[5] << 16 | base[6] << 8 | base[7];
1780 layer->end_sector = base[9] << 16 | base[10] << 8 | base[11];
1781 layer->end_sector_l0 = base[13] << 16 | base[14] << 8 | base[15];
1782 layer->bca = base[16] >> 7;
1784 return 0;
1787 static int dvd_read_copyright(struct cdrom_device_info *cdi, dvd_struct *s)
1789 int ret;
1790 u_char buf[8];
1791 struct packet_command cgc;
1792 struct cdrom_device_ops *cdo = cdi->ops;
1794 init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ);
1795 cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1796 cgc.cmd[6] = s->copyright.layer_num;
1797 cgc.cmd[7] = s->type;
1798 cgc.cmd[8] = cgc.buflen >> 8;
1799 cgc.cmd[9] = cgc.buflen & 0xff;
1801 if ((ret = cdo->generic_packet(cdi, &cgc)))
1802 return ret;
1804 s->copyright.cpst = buf[4];
1805 s->copyright.rmi = buf[5];
1807 return 0;
1810 static int dvd_read_disckey(struct cdrom_device_info *cdi, dvd_struct *s)
1812 int ret, size;
1813 u_char *buf;
1814 struct packet_command cgc;
1815 struct cdrom_device_ops *cdo = cdi->ops;
1817 size = sizeof(s->disckey.value) + 4;
1819 if ((buf = (u_char *) kmalloc(size, GFP_KERNEL)) == NULL)
1820 return -ENOMEM;
1822 init_cdrom_command(&cgc, buf, size, CGC_DATA_READ);
1823 cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1824 cgc.cmd[7] = s->type;
1825 cgc.cmd[8] = size >> 8;
1826 cgc.cmd[9] = size & 0xff;
1827 cgc.cmd[10] = s->disckey.agid << 6;
1829 if (!(ret = cdo->generic_packet(cdi, &cgc)))
1830 memcpy(s->disckey.value, &buf[4], sizeof(s->disckey.value));
1832 kfree(buf);
1833 return ret;
1836 static int dvd_read_bca(struct cdrom_device_info *cdi, dvd_struct *s)
1838 int ret;
1839 u_char buf[4 + 188];
1840 struct packet_command cgc;
1841 struct cdrom_device_ops *cdo = cdi->ops;
1843 init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ);
1844 cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1845 cgc.cmd[7] = s->type;
1846 cgc.cmd[9] = cgc.buflen & 0xff;
1848 if ((ret = cdo->generic_packet(cdi, &cgc)))
1849 return ret;
1851 s->bca.len = buf[0] << 8 | buf[1];
1852 if (s->bca.len < 12 || s->bca.len > 188) {
1853 cdinfo(CD_WARNING, "Received invalid BCA length (%d)\n", s->bca.len);
1854 return -EIO;
1856 memcpy(s->bca.value, &buf[4], s->bca.len);
1858 return 0;
1861 static int dvd_read_manufact(struct cdrom_device_info *cdi, dvd_struct *s)
1863 int ret = 0, size;
1864 u_char *buf;
1865 struct packet_command cgc;
1866 struct cdrom_device_ops *cdo = cdi->ops;
1868 size = sizeof(s->manufact.value) + 4;
1870 if ((buf = (u_char *) kmalloc(size, GFP_KERNEL)) == NULL)
1871 return -ENOMEM;
1873 init_cdrom_command(&cgc, buf, size, CGC_DATA_READ);
1874 cgc.cmd[0] = GPCMD_READ_DVD_STRUCTURE;
1875 cgc.cmd[7] = s->type;
1876 cgc.cmd[8] = size >> 8;
1877 cgc.cmd[9] = size & 0xff;
1879 if ((ret = cdo->generic_packet(cdi, &cgc))) {
1880 kfree(buf);
1881 return ret;
1884 s->manufact.len = buf[0] << 8 | buf[1];
1885 if (s->manufact.len < 0 || s->manufact.len > 2048) {
1886 cdinfo(CD_WARNING, "Received invalid manufacture info length"
1887 " (%d)\n", s->manufact.len);
1888 ret = -EIO;
1889 } else {
1890 memcpy(s->manufact.value, &buf[4], s->manufact.len);
1893 kfree(buf);
1894 return ret;
1897 static int dvd_read_struct(struct cdrom_device_info *cdi, dvd_struct *s)
1899 switch (s->type) {
1900 case DVD_STRUCT_PHYSICAL:
1901 return dvd_read_physical(cdi, s);
1903 case DVD_STRUCT_COPYRIGHT:
1904 return dvd_read_copyright(cdi, s);
1906 case DVD_STRUCT_DISCKEY:
1907 return dvd_read_disckey(cdi, s);
1909 case DVD_STRUCT_BCA:
1910 return dvd_read_bca(cdi, s);
1912 case DVD_STRUCT_MANUFACT:
1913 return dvd_read_manufact(cdi, s);
1915 default:
1916 cdinfo(CD_WARNING, ": Invalid DVD structure read requested (%d)\n",
1917 s->type);
1918 return -EINVAL;
1922 int cdrom_mode_sense(struct cdrom_device_info *cdi,
1923 struct packet_command *cgc,
1924 int page_code, int page_control)
1926 struct cdrom_device_ops *cdo = cdi->ops;
1928 memset(cgc->cmd, 0, sizeof(cgc->cmd));
1930 cgc->cmd[0] = GPCMD_MODE_SENSE_10;
1931 cgc->cmd[2] = page_code | (page_control << 6);
1932 cgc->cmd[7] = cgc->buflen >> 8;
1933 cgc->cmd[8] = cgc->buflen & 0xff;
1934 cgc->data_direction = CGC_DATA_READ;
1935 return cdo->generic_packet(cdi, cgc);
1938 int cdrom_mode_select(struct cdrom_device_info *cdi,
1939 struct packet_command *cgc)
1941 struct cdrom_device_ops *cdo = cdi->ops;
1943 memset(cgc->cmd, 0, sizeof(cgc->cmd));
1944 memset(cgc->buffer, 0, 2);
1945 cgc->cmd[0] = GPCMD_MODE_SELECT_10;
1946 cgc->cmd[1] = 0x10; /* PF */
1947 cgc->cmd[7] = cgc->buflen >> 8;
1948 cgc->cmd[8] = cgc->buflen & 0xff;
1949 cgc->data_direction = CGC_DATA_WRITE;
1950 return cdo->generic_packet(cdi, cgc);
1953 static int cdrom_read_subchannel(struct cdrom_device_info *cdi,
1954 struct cdrom_subchnl *subchnl, int mcn)
1956 struct cdrom_device_ops *cdo = cdi->ops;
1957 struct packet_command cgc;
1958 char buffer[32];
1959 int ret;
1961 init_cdrom_command(&cgc, buffer, 16, CGC_DATA_READ);
1962 cgc.cmd[0] = GPCMD_READ_SUBCHANNEL;
1963 cgc.cmd[1] = 2; /* MSF addressing */
1964 cgc.cmd[2] = 0x40; /* request subQ data */
1965 cgc.cmd[3] = mcn ? 2 : 1;
1966 cgc.cmd[8] = 16;
1968 if ((ret = cdo->generic_packet(cdi, &cgc)))
1969 return ret;
1971 subchnl->cdsc_audiostatus = cgc.buffer[1];
1972 subchnl->cdsc_format = CDROM_MSF;
1973 subchnl->cdsc_ctrl = cgc.buffer[5] & 0xf;
1974 subchnl->cdsc_trk = cgc.buffer[6];
1975 subchnl->cdsc_ind = cgc.buffer[7];
1977 subchnl->cdsc_reladdr.msf.minute = cgc.buffer[13];
1978 subchnl->cdsc_reladdr.msf.second = cgc.buffer[14];
1979 subchnl->cdsc_reladdr.msf.frame = cgc.buffer[15];
1980 subchnl->cdsc_absaddr.msf.minute = cgc.buffer[9];
1981 subchnl->cdsc_absaddr.msf.second = cgc.buffer[10];
1982 subchnl->cdsc_absaddr.msf.frame = cgc.buffer[11];
1984 return 0;
1988 * Specific READ_10 interface
1990 static int cdrom_read_cd(struct cdrom_device_info *cdi,
1991 struct packet_command *cgc, int lba,
1992 int blocksize, int nblocks)
1994 struct cdrom_device_ops *cdo = cdi->ops;
1996 memset(&cgc->cmd, 0, sizeof(cgc->cmd));
1997 cgc->cmd[0] = GPCMD_READ_10;
1998 cgc->cmd[2] = (lba >> 24) & 0xff;
1999 cgc->cmd[3] = (lba >> 16) & 0xff;
2000 cgc->cmd[4] = (lba >> 8) & 0xff;
2001 cgc->cmd[5] = lba & 0xff;
2002 cgc->cmd[6] = (nblocks >> 16) & 0xff;
2003 cgc->cmd[7] = (nblocks >> 8) & 0xff;
2004 cgc->cmd[8] = nblocks & 0xff;
2005 cgc->buflen = blocksize * nblocks;
2006 return cdo->generic_packet(cdi, cgc);
2009 /* very generic interface for reading the various types of blocks */
2010 static int cdrom_read_block(struct cdrom_device_info *cdi,
2011 struct packet_command *cgc,
2012 int lba, int nblocks, int format, int blksize)
2014 struct cdrom_device_ops *cdo = cdi->ops;
2016 memset(&cgc->cmd, 0, sizeof(cgc->cmd));
2017 cgc->cmd[0] = GPCMD_READ_CD;
2018 /* expected sector size - cdda,mode1,etc. */
2019 cgc->cmd[1] = format << 2;
2020 /* starting address */
2021 cgc->cmd[2] = (lba >> 24) & 0xff;
2022 cgc->cmd[3] = (lba >> 16) & 0xff;
2023 cgc->cmd[4] = (lba >> 8) & 0xff;
2024 cgc->cmd[5] = lba & 0xff;
2025 /* number of blocks */
2026 cgc->cmd[6] = (nblocks >> 16) & 0xff;
2027 cgc->cmd[7] = (nblocks >> 8) & 0xff;
2028 cgc->cmd[8] = nblocks & 0xff;
2029 cgc->buflen = blksize * nblocks;
2031 /* set the header info returned */
2032 switch (blksize) {
2033 case CD_FRAMESIZE_RAW0 : cgc->cmd[9] = 0x58; break;
2034 case CD_FRAMESIZE_RAW1 : cgc->cmd[9] = 0x78; break;
2035 case CD_FRAMESIZE_RAW : cgc->cmd[9] = 0xf8; break;
2036 default : cgc->cmd[9] = 0x10;
2039 return cdo->generic_packet(cdi, cgc);
2042 static int cdrom_read_cdda_old(struct cdrom_device_info *cdi, __u8 __user *ubuf,
2043 int lba, int nframes)
2045 struct packet_command cgc;
2046 int ret = 0;
2047 int nr;
2049 cdi->last_sense = 0;
2051 memset(&cgc, 0, sizeof(cgc));
2054 * start with will ra.nframes size, back down if alloc fails
2056 nr = nframes;
2057 do {
2058 cgc.buffer = kmalloc(CD_FRAMESIZE_RAW * nr, GFP_KERNEL);
2059 if (cgc.buffer)
2060 break;
2062 nr >>= 1;
2063 } while (nr);
2065 if (!nr)
2066 return -ENOMEM;
2068 if (!access_ok(VERIFY_WRITE, ubuf, nframes * CD_FRAMESIZE_RAW)) {
2069 ret = -EFAULT;
2070 goto out;
2073 cgc.data_direction = CGC_DATA_READ;
2074 while (nframes > 0) {
2075 if (nr > nframes)
2076 nr = nframes;
2078 ret = cdrom_read_block(cdi, &cgc, lba, nr, 1, CD_FRAMESIZE_RAW);
2079 if (ret)
2080 break;
2081 if (__copy_to_user(ubuf, cgc.buffer, CD_FRAMESIZE_RAW * nr)) {
2082 ret = -EFAULT;
2083 break;
2085 ubuf += CD_FRAMESIZE_RAW * nr;
2086 nframes -= nr;
2087 lba += nr;
2089 out:
2090 kfree(cgc.buffer);
2091 return ret;
2094 static int cdrom_read_cdda_bpc(struct cdrom_device_info *cdi, __u8 __user *ubuf,
2095 int lba, int nframes)
2097 request_queue_t *q = cdi->disk->queue;
2098 struct request *rq;
2099 struct bio *bio;
2100 unsigned int len;
2101 int nr, ret = 0;
2103 if (!q)
2104 return -ENXIO;
2106 rq = blk_get_request(q, READ, GFP_KERNEL);
2107 if (!rq)
2108 return -ENOMEM;
2110 cdi->last_sense = 0;
2112 while (nframes) {
2113 nr = nframes;
2114 if (cdi->cdda_method == CDDA_BPC_SINGLE)
2115 nr = 1;
2116 if (nr * CD_FRAMESIZE_RAW > (q->max_sectors << 9))
2117 nr = (q->max_sectors << 9) / CD_FRAMESIZE_RAW;
2119 len = nr * CD_FRAMESIZE_RAW;
2121 ret = blk_rq_map_user(q, rq, ubuf, len);
2122 if (ret)
2123 break;
2125 memset(rq->cmd, 0, sizeof(rq->cmd));
2126 rq->cmd[0] = GPCMD_READ_CD;
2127 rq->cmd[1] = 1 << 2;
2128 rq->cmd[2] = (lba >> 24) & 0xff;
2129 rq->cmd[3] = (lba >> 16) & 0xff;
2130 rq->cmd[4] = (lba >> 8) & 0xff;
2131 rq->cmd[5] = lba & 0xff;
2132 rq->cmd[6] = (nr >> 16) & 0xff;
2133 rq->cmd[7] = (nr >> 8) & 0xff;
2134 rq->cmd[8] = nr & 0xff;
2135 rq->cmd[9] = 0xf8;
2137 rq->cmd_len = 12;
2138 rq->flags |= REQ_BLOCK_PC;
2139 rq->timeout = 60 * HZ;
2140 bio = rq->bio;
2142 if (rq->bio)
2143 blk_queue_bounce(q, &rq->bio);
2145 if (blk_execute_rq(q, cdi->disk, rq, 0)) {
2146 struct request_sense *s = rq->sense;
2147 ret = -EIO;
2148 cdi->last_sense = s->sense_key;
2151 if (blk_rq_unmap_user(bio, len))
2152 ret = -EFAULT;
2154 if (ret)
2155 break;
2157 nframes -= nr;
2158 lba += nr;
2159 ubuf += len;
2162 blk_put_request(rq);
2163 return ret;
2166 static int cdrom_read_cdda(struct cdrom_device_info *cdi, __u8 __user *ubuf,
2167 int lba, int nframes)
2169 int ret;
2171 if (cdi->cdda_method == CDDA_OLD)
2172 return cdrom_read_cdda_old(cdi, ubuf, lba, nframes);
2174 retry:
2176 * for anything else than success and io error, we need to retry
2178 ret = cdrom_read_cdda_bpc(cdi, ubuf, lba, nframes);
2179 if (!ret || ret != -EIO)
2180 return ret;
2183 * I've seen drives get sense 4/8/3 udma crc errors on multi
2184 * frame dma, so drop to single frame dma if we need to
2186 if (cdi->cdda_method == CDDA_BPC_FULL && nframes > 1) {
2187 printk("cdrom: dropping to single frame dma\n");
2188 cdi->cdda_method = CDDA_BPC_SINGLE;
2189 goto retry;
2193 * so we have an io error of some sort with multi frame dma. if the
2194 * condition wasn't a hardware error
2195 * problems, not for any error
2197 if (cdi->last_sense != 0x04 && cdi->last_sense != 0x0b)
2198 return ret;
2200 printk("cdrom: dropping to old style cdda (sense=%x)\n", cdi->last_sense);
2201 cdi->cdda_method = CDDA_OLD;
2202 return cdrom_read_cdda_old(cdi, ubuf, lba, nframes);
2205 /* Just about every imaginable ioctl is supported in the Uniform layer
2206 * these days. ATAPI / SCSI specific code now mainly resides in
2207 * mmc_ioct().
2209 int cdrom_ioctl(struct file * file, struct cdrom_device_info *cdi,
2210 struct inode *ip, unsigned int cmd, unsigned long arg)
2212 struct cdrom_device_ops *cdo = cdi->ops;
2213 int ret;
2215 /* Try the generic SCSI command ioctl's first.. */
2216 ret = scsi_cmd_ioctl(file, ip->i_bdev->bd_disk, cmd, (void __user *)arg);
2217 if (ret != -ENOTTY)
2218 return ret;
2220 /* the first few commands do not deal with audio drive_info, but
2221 only with routines in cdrom device operations. */
2222 switch (cmd) {
2223 case CDROMMULTISESSION: {
2224 struct cdrom_multisession ms_info;
2225 u_char requested_format;
2226 cdinfo(CD_DO_IOCTL, "entering CDROMMULTISESSION\n");
2227 if (!(cdo->capability & CDC_MULTI_SESSION))
2228 return -ENOSYS;
2229 IOCTL_IN(arg, struct cdrom_multisession, ms_info);
2230 requested_format = ms_info.addr_format;
2231 if (!((requested_format == CDROM_MSF) ||
2232 (requested_format == CDROM_LBA)))
2233 return -EINVAL;
2234 ms_info.addr_format = CDROM_LBA;
2235 if ((ret=cdo->get_last_session(cdi, &ms_info)))
2236 return ret;
2237 sanitize_format(&ms_info.addr, &ms_info.addr_format,
2238 requested_format);
2239 IOCTL_OUT(arg, struct cdrom_multisession, ms_info);
2240 cdinfo(CD_DO_IOCTL, "CDROMMULTISESSION successful\n");
2241 return 0;
2244 case CDROMEJECT: {
2245 cdinfo(CD_DO_IOCTL, "entering CDROMEJECT\n");
2246 if (!CDROM_CAN(CDC_OPEN_TRAY))
2247 return -ENOSYS;
2248 if (cdi->use_count != 1 || keeplocked)
2249 return -EBUSY;
2250 if (CDROM_CAN(CDC_LOCK))
2251 if ((ret=cdo->lock_door(cdi, 0)))
2252 return ret;
2254 return cdo->tray_move(cdi, 1);
2257 case CDROMCLOSETRAY: {
2258 cdinfo(CD_DO_IOCTL, "entering CDROMCLOSETRAY\n");
2259 if (!CDROM_CAN(CDC_CLOSE_TRAY))
2260 return -ENOSYS;
2261 return cdo->tray_move(cdi, 0);
2264 case CDROMEJECT_SW: {
2265 cdinfo(CD_DO_IOCTL, "entering CDROMEJECT_SW\n");
2266 if (!CDROM_CAN(CDC_OPEN_TRAY))
2267 return -ENOSYS;
2268 if (keeplocked)
2269 return -EBUSY;
2270 cdi->options &= ~(CDO_AUTO_CLOSE | CDO_AUTO_EJECT);
2271 if (arg)
2272 cdi->options |= CDO_AUTO_CLOSE | CDO_AUTO_EJECT;
2273 return 0;
2276 case CDROM_MEDIA_CHANGED: {
2277 struct cdrom_changer_info *info;
2278 int changed;
2280 cdinfo(CD_DO_IOCTL, "entering CDROM_MEDIA_CHANGED\n");
2281 if (!CDROM_CAN(CDC_MEDIA_CHANGED))
2282 return -ENOSYS;
2284 /* cannot select disc or select current disc */
2285 if (!CDROM_CAN(CDC_SELECT_DISC) || arg == CDSL_CURRENT)
2286 return media_changed(cdi, 1);
2288 if ((unsigned int)arg >= cdi->capacity)
2289 return -EINVAL;
2291 info = kmalloc(sizeof(*info), GFP_KERNEL);
2292 if (!info)
2293 return -ENOMEM;
2295 if ((ret = cdrom_read_mech_status(cdi, info))) {
2296 kfree(info);
2297 return ret;
2300 changed = info->slots[arg].change;
2301 kfree(info);
2302 return changed;
2305 case CDROM_SET_OPTIONS: {
2306 cdinfo(CD_DO_IOCTL, "entering CDROM_SET_OPTIONS\n");
2307 /* options need to be in sync with capability. too late for
2308 that, so we have to check each one separately... */
2309 switch (arg) {
2310 case CDO_USE_FFLAGS:
2311 case CDO_CHECK_TYPE:
2312 break;
2313 case CDO_LOCK:
2314 if (!CDROM_CAN(CDC_LOCK))
2315 return -ENOSYS;
2316 break;
2317 case 0:
2318 return cdi->options;
2319 /* default is basically CDO_[AUTO_CLOSE|AUTO_EJECT] */
2320 default:
2321 if (!CDROM_CAN(arg))
2322 return -ENOSYS;
2324 cdi->options |= (int) arg;
2325 return cdi->options;
2328 case CDROM_CLEAR_OPTIONS: {
2329 cdinfo(CD_DO_IOCTL, "entering CDROM_CLEAR_OPTIONS\n");
2330 cdi->options &= ~(int) arg;
2331 return cdi->options;
2334 case CDROM_SELECT_SPEED: {
2335 cdinfo(CD_DO_IOCTL, "entering CDROM_SELECT_SPEED\n");
2336 if (!CDROM_CAN(CDC_SELECT_SPEED))
2337 return -ENOSYS;
2338 return cdo->select_speed(cdi, arg);
2341 case CDROM_SELECT_DISC: {
2342 cdinfo(CD_DO_IOCTL, "entering CDROM_SELECT_DISC\n");
2343 if (!CDROM_CAN(CDC_SELECT_DISC))
2344 return -ENOSYS;
2346 if ((arg != CDSL_CURRENT) && (arg != CDSL_NONE))
2347 if ((int)arg >= cdi->capacity)
2348 return -EINVAL;
2350 /* cdo->select_disc is a hook to allow a driver-specific
2351 * way of seleting disc. However, since there is no
2352 * equiv hook for cdrom_slot_status this may not
2353 * actually be useful...
2355 if (cdo->select_disc != NULL)
2356 return cdo->select_disc(cdi, arg);
2358 /* no driver specific select_disc(), call our own */
2359 cdinfo(CD_CHANGER, "Using generic cdrom_select_disc()\n");
2360 return cdrom_select_disc(cdi, arg);
2363 case CDROMRESET: {
2364 if (!capable(CAP_SYS_ADMIN))
2365 return -EACCES;
2366 cdinfo(CD_DO_IOCTL, "entering CDROM_RESET\n");
2367 if (!CDROM_CAN(CDC_RESET))
2368 return -ENOSYS;
2369 invalidate_bdev(ip->i_bdev, 0);
2370 return cdo->reset(cdi);
2373 case CDROM_LOCKDOOR: {
2374 cdinfo(CD_DO_IOCTL, "%socking door.\n", arg ? "L" : "Unl");
2375 if (!CDROM_CAN(CDC_LOCK))
2376 return -EDRIVE_CANT_DO_THIS;
2377 keeplocked = arg ? 1 : 0;
2378 /* don't unlock the door on multiple opens,but allow root
2379 * to do so */
2380 if ((cdi->use_count != 1) && !arg && !capable(CAP_SYS_ADMIN))
2381 return -EBUSY;
2382 return cdo->lock_door(cdi, arg);
2385 case CDROM_DEBUG: {
2386 if (!capable(CAP_SYS_ADMIN))
2387 return -EACCES;
2388 cdinfo(CD_DO_IOCTL, "%sabling debug.\n", arg ? "En" : "Dis");
2389 debug = arg ? 1 : 0;
2390 return debug;
2393 case CDROM_GET_CAPABILITY: {
2394 cdinfo(CD_DO_IOCTL, "entering CDROM_GET_CAPABILITY\n");
2395 return (cdo->capability & ~cdi->mask);
2398 /* The following function is implemented, although very few audio
2399 * discs give Universal Product Code information, which should just be
2400 * the Medium Catalog Number on the box. Note, that the way the code
2401 * is written on the CD is /not/ uniform across all discs!
2403 case CDROM_GET_MCN: {
2404 struct cdrom_mcn mcn;
2405 cdinfo(CD_DO_IOCTL, "entering CDROM_GET_MCN\n");
2406 if (!(cdo->capability & CDC_MCN))
2407 return -ENOSYS;
2408 if ((ret=cdo->get_mcn(cdi, &mcn)))
2409 return ret;
2410 IOCTL_OUT(arg, struct cdrom_mcn, mcn);
2411 cdinfo(CD_DO_IOCTL, "CDROM_GET_MCN successful\n");
2412 return 0;
2415 case CDROM_DRIVE_STATUS: {
2416 cdinfo(CD_DO_IOCTL, "entering CDROM_DRIVE_STATUS\n");
2417 if (!(cdo->capability & CDC_DRIVE_STATUS))
2418 return -ENOSYS;
2419 if (!CDROM_CAN(CDC_SELECT_DISC))
2420 return cdo->drive_status(cdi, CDSL_CURRENT);
2421 if ((arg == CDSL_CURRENT) || (arg == CDSL_NONE))
2422 return cdo->drive_status(cdi, CDSL_CURRENT);
2423 if (((int)arg >= cdi->capacity))
2424 return -EINVAL;
2425 return cdrom_slot_status(cdi, arg);
2428 /* Ok, this is where problems start. The current interface for the
2429 CDROM_DISC_STATUS ioctl is flawed. It makes the false assumption
2430 that CDs are all CDS_DATA_1 or all CDS_AUDIO, etc. Unfortunatly,
2431 while this is often the case, it is also very common for CDs to
2432 have some tracks with data, and some tracks with audio. Just
2433 because I feel like it, I declare the following to be the best
2434 way to cope. If the CD has ANY data tracks on it, it will be
2435 returned as a data CD. If it has any XA tracks, I will return
2436 it as that. Now I could simplify this interface by combining these
2437 returns with the above, but this more clearly demonstrates
2438 the problem with the current interface. Too bad this wasn't
2439 designed to use bitmasks... -Erik
2441 Well, now we have the option CDS_MIXED: a mixed-type CD.
2442 User level programmers might feel the ioctl is not very useful.
2443 ---david
2445 case CDROM_DISC_STATUS: {
2446 tracktype tracks;
2447 cdinfo(CD_DO_IOCTL, "entering CDROM_DISC_STATUS\n");
2448 cdrom_count_tracks(cdi, &tracks);
2449 if (tracks.error)
2450 return(tracks.error);
2452 /* Policy mode on */
2453 if (tracks.audio > 0) {
2454 if (tracks.data==0 && tracks.cdi==0 && tracks.xa==0)
2455 return CDS_AUDIO;
2456 else
2457 return CDS_MIXED;
2459 if (tracks.cdi > 0) return CDS_XA_2_2;
2460 if (tracks.xa > 0) return CDS_XA_2_1;
2461 if (tracks.data > 0) return CDS_DATA_1;
2462 /* Policy mode off */
2464 cdinfo(CD_WARNING,"This disc doesn't have any tracks I recognize!\n");
2465 return CDS_NO_INFO;
2468 case CDROM_CHANGER_NSLOTS: {
2469 cdinfo(CD_DO_IOCTL, "entering CDROM_CHANGER_NSLOTS\n");
2470 return cdi->capacity;
2474 /* use the ioctls that are implemented through the generic_packet()
2475 interface. this may look at bit funny, but if -ENOTTY is
2476 returned that particular ioctl is not implemented and we
2477 let it go through the device specific ones. */
2478 if (CDROM_CAN(CDC_GENERIC_PACKET)) {
2479 ret = mmc_ioctl(cdi, cmd, arg);
2480 if (ret != -ENOTTY) {
2481 return ret;
2485 /* note: most of the cdinfo() calls are commented out here,
2486 because they fill up the sys log when CD players poll
2487 the drive. */
2488 switch (cmd) {
2489 case CDROMSUBCHNL: {
2490 struct cdrom_subchnl q;
2491 u_char requested, back;
2492 if (!CDROM_CAN(CDC_PLAY_AUDIO))
2493 return -ENOSYS;
2494 /* cdinfo(CD_DO_IOCTL,"entering CDROMSUBCHNL\n");*/
2495 IOCTL_IN(arg, struct cdrom_subchnl, q);
2496 requested = q.cdsc_format;
2497 if (!((requested == CDROM_MSF) ||
2498 (requested == CDROM_LBA)))
2499 return -EINVAL;
2500 q.cdsc_format = CDROM_MSF;
2501 if ((ret=cdo->audio_ioctl(cdi, cmd, &q)))
2502 return ret;
2503 back = q.cdsc_format; /* local copy */
2504 sanitize_format(&q.cdsc_absaddr, &back, requested);
2505 sanitize_format(&q.cdsc_reladdr, &q.cdsc_format, requested);
2506 IOCTL_OUT(arg, struct cdrom_subchnl, q);
2507 /* cdinfo(CD_DO_IOCTL, "CDROMSUBCHNL successful\n"); */
2508 return 0;
2510 case CDROMREADTOCHDR: {
2511 struct cdrom_tochdr header;
2512 if (!CDROM_CAN(CDC_PLAY_AUDIO))
2513 return -ENOSYS;
2514 /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCHDR\n"); */
2515 IOCTL_IN(arg, struct cdrom_tochdr, header);
2516 if ((ret=cdo->audio_ioctl(cdi, cmd, &header)))
2517 return ret;
2518 IOCTL_OUT(arg, struct cdrom_tochdr, header);
2519 /* cdinfo(CD_DO_IOCTL, "CDROMREADTOCHDR successful\n"); */
2520 return 0;
2522 case CDROMREADTOCENTRY: {
2523 struct cdrom_tocentry entry;
2524 u_char requested_format;
2525 if (!CDROM_CAN(CDC_PLAY_AUDIO))
2526 return -ENOSYS;
2527 /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCENTRY\n"); */
2528 IOCTL_IN(arg, struct cdrom_tocentry, entry);
2529 requested_format = entry.cdte_format;
2530 if (!((requested_format == CDROM_MSF) ||
2531 (requested_format == CDROM_LBA)))
2532 return -EINVAL;
2533 /* make interface to low-level uniform */
2534 entry.cdte_format = CDROM_MSF;
2535 if ((ret=cdo->audio_ioctl(cdi, cmd, &entry)))
2536 return ret;
2537 sanitize_format(&entry.cdte_addr,
2538 &entry.cdte_format, requested_format);
2539 IOCTL_OUT(arg, struct cdrom_tocentry, entry);
2540 /* cdinfo(CD_DO_IOCTL, "CDROMREADTOCENTRY successful\n"); */
2541 return 0;
2543 case CDROMPLAYMSF: {
2544 struct cdrom_msf msf;
2545 if (!CDROM_CAN(CDC_PLAY_AUDIO))
2546 return -ENOSYS;
2547 cdinfo(CD_DO_IOCTL, "entering CDROMPLAYMSF\n");
2548 IOCTL_IN(arg, struct cdrom_msf, msf);
2549 return cdo->audio_ioctl(cdi, cmd, &msf);
2551 case CDROMPLAYTRKIND: {
2552 struct cdrom_ti ti;
2553 if (!CDROM_CAN(CDC_PLAY_AUDIO))
2554 return -ENOSYS;
2555 cdinfo(CD_DO_IOCTL, "entering CDROMPLAYTRKIND\n");
2556 IOCTL_IN(arg, struct cdrom_ti, ti);
2557 CHECKAUDIO;
2558 return cdo->audio_ioctl(cdi, cmd, &ti);
2560 case CDROMVOLCTRL: {
2561 struct cdrom_volctrl volume;
2562 if (!CDROM_CAN(CDC_PLAY_AUDIO))
2563 return -ENOSYS;
2564 cdinfo(CD_DO_IOCTL, "entering CDROMVOLCTRL\n");
2565 IOCTL_IN(arg, struct cdrom_volctrl, volume);
2566 return cdo->audio_ioctl(cdi, cmd, &volume);
2568 case CDROMVOLREAD: {
2569 struct cdrom_volctrl volume;
2570 if (!CDROM_CAN(CDC_PLAY_AUDIO))
2571 return -ENOSYS;
2572 cdinfo(CD_DO_IOCTL, "entering CDROMVOLREAD\n");
2573 if ((ret=cdo->audio_ioctl(cdi, cmd, &volume)))
2574 return ret;
2575 IOCTL_OUT(arg, struct cdrom_volctrl, volume);
2576 return 0;
2578 case CDROMSTART:
2579 case CDROMSTOP:
2580 case CDROMPAUSE:
2581 case CDROMRESUME: {
2582 if (!CDROM_CAN(CDC_PLAY_AUDIO))
2583 return -ENOSYS;
2584 cdinfo(CD_DO_IOCTL, "doing audio ioctl (start/stop/pause/resume)\n");
2585 CHECKAUDIO;
2586 return cdo->audio_ioctl(cdi, cmd, NULL);
2588 } /* switch */
2590 /* do the device specific ioctls */
2591 if (CDROM_CAN(CDC_IOCTLS))
2592 return cdo->dev_ioctl(cdi, cmd, arg);
2594 return -ENOSYS;
2597 static inline
2598 int msf_to_lba(char m, char s, char f)
2600 return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
2604 * Required when we need to use READ_10 to issue other than 2048 block
2605 * reads
2607 static int cdrom_switch_blocksize(struct cdrom_device_info *cdi, int size)
2609 struct cdrom_device_ops *cdo = cdi->ops;
2610 struct packet_command cgc;
2611 struct modesel_head mh;
2613 memset(&mh, 0, sizeof(mh));
2614 mh.block_desc_length = 0x08;
2615 mh.block_length_med = (size >> 8) & 0xff;
2616 mh.block_length_lo = size & 0xff;
2618 memset(&cgc, 0, sizeof(cgc));
2619 cgc.cmd[0] = 0x15;
2620 cgc.cmd[1] = 1 << 4;
2621 cgc.cmd[4] = 12;
2622 cgc.buflen = sizeof(mh);
2623 cgc.buffer = (char *) &mh;
2624 cgc.data_direction = CGC_DATA_WRITE;
2625 mh.block_desc_length = 0x08;
2626 mh.block_length_med = (size >> 8) & 0xff;
2627 mh.block_length_lo = size & 0xff;
2629 return cdo->generic_packet(cdi, &cgc);
2632 static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
2633 unsigned long arg)
2635 struct cdrom_device_ops *cdo = cdi->ops;
2636 struct packet_command cgc;
2637 struct request_sense sense;
2638 unsigned char buffer[32];
2639 int ret = 0;
2641 memset(&cgc, 0, sizeof(cgc));
2643 /* build a unified command and queue it through
2644 cdo->generic_packet() */
2645 switch (cmd) {
2646 case CDROMREADRAW:
2647 case CDROMREADMODE1:
2648 case CDROMREADMODE2: {
2649 struct cdrom_msf msf;
2650 int blocksize = 0, format = 0, lba;
2652 switch (cmd) {
2653 case CDROMREADRAW:
2654 blocksize = CD_FRAMESIZE_RAW;
2655 break;
2656 case CDROMREADMODE1:
2657 blocksize = CD_FRAMESIZE;
2658 format = 2;
2659 break;
2660 case CDROMREADMODE2:
2661 blocksize = CD_FRAMESIZE_RAW0;
2662 break;
2664 IOCTL_IN(arg, struct cdrom_msf, msf);
2665 lba = msf_to_lba(msf.cdmsf_min0,msf.cdmsf_sec0,msf.cdmsf_frame0);
2666 /* FIXME: we need upper bound checking, too!! */
2667 if (lba < 0)
2668 return -EINVAL;
2669 cgc.buffer = (char *) kmalloc(blocksize, GFP_KERNEL);
2670 if (cgc.buffer == NULL)
2671 return -ENOMEM;
2672 memset(&sense, 0, sizeof(sense));
2673 cgc.sense = &sense;
2674 cgc.data_direction = CGC_DATA_READ;
2675 ret = cdrom_read_block(cdi, &cgc, lba, 1, format, blocksize);
2676 if (ret && sense.sense_key==0x05 && sense.asc==0x20 && sense.ascq==0x00) {
2678 * SCSI-II devices are not required to support
2679 * READ_CD, so let's try switching block size
2681 /* FIXME: switch back again... */
2682 if ((ret = cdrom_switch_blocksize(cdi, blocksize))) {
2683 kfree(cgc.buffer);
2684 return ret;
2686 cgc.sense = NULL;
2687 ret = cdrom_read_cd(cdi, &cgc, lba, blocksize, 1);
2688 ret |= cdrom_switch_blocksize(cdi, blocksize);
2690 if (!ret && copy_to_user((char __user *)arg, cgc.buffer, blocksize))
2691 ret = -EFAULT;
2692 kfree(cgc.buffer);
2693 return ret;
2695 case CDROMREADAUDIO: {
2696 struct cdrom_read_audio ra;
2697 int lba;
2699 IOCTL_IN(arg, struct cdrom_read_audio, ra);
2701 if (ra.addr_format == CDROM_MSF)
2702 lba = msf_to_lba(ra.addr.msf.minute,
2703 ra.addr.msf.second,
2704 ra.addr.msf.frame);
2705 else if (ra.addr_format == CDROM_LBA)
2706 lba = ra.addr.lba;
2707 else
2708 return -EINVAL;
2710 /* FIXME: we need upper bound checking, too!! */
2711 if (lba < 0 || ra.nframes <= 0 || ra.nframes > CD_FRAMES)
2712 return -EINVAL;
2714 return cdrom_read_cdda(cdi, ra.buf, lba, ra.nframes);
2716 case CDROMSUBCHNL: {
2717 struct cdrom_subchnl q;
2718 u_char requested, back;
2719 IOCTL_IN(arg, struct cdrom_subchnl, q);
2720 requested = q.cdsc_format;
2721 if (!((requested == CDROM_MSF) ||
2722 (requested == CDROM_LBA)))
2723 return -EINVAL;
2724 q.cdsc_format = CDROM_MSF;
2725 if ((ret = cdrom_read_subchannel(cdi, &q, 0)))
2726 return ret;
2727 back = q.cdsc_format; /* local copy */
2728 sanitize_format(&q.cdsc_absaddr, &back, requested);
2729 sanitize_format(&q.cdsc_reladdr, &q.cdsc_format, requested);
2730 IOCTL_OUT(arg, struct cdrom_subchnl, q);
2731 /* cdinfo(CD_DO_IOCTL, "CDROMSUBCHNL successful\n"); */
2732 return 0;
2734 case CDROMPLAYMSF: {
2735 struct cdrom_msf msf;
2736 cdinfo(CD_DO_IOCTL, "entering CDROMPLAYMSF\n");
2737 IOCTL_IN(arg, struct cdrom_msf, msf);
2738 cgc.cmd[0] = GPCMD_PLAY_AUDIO_MSF;
2739 cgc.cmd[3] = msf.cdmsf_min0;
2740 cgc.cmd[4] = msf.cdmsf_sec0;
2741 cgc.cmd[5] = msf.cdmsf_frame0;
2742 cgc.cmd[6] = msf.cdmsf_min1;
2743 cgc.cmd[7] = msf.cdmsf_sec1;
2744 cgc.cmd[8] = msf.cdmsf_frame1;
2745 cgc.data_direction = CGC_DATA_NONE;
2746 return cdo->generic_packet(cdi, &cgc);
2748 case CDROMPLAYBLK: {
2749 struct cdrom_blk blk;
2750 cdinfo(CD_DO_IOCTL, "entering CDROMPLAYBLK\n");
2751 IOCTL_IN(arg, struct cdrom_blk, blk);
2752 cgc.cmd[0] = GPCMD_PLAY_AUDIO_10;
2753 cgc.cmd[2] = (blk.from >> 24) & 0xff;
2754 cgc.cmd[3] = (blk.from >> 16) & 0xff;
2755 cgc.cmd[4] = (blk.from >> 8) & 0xff;
2756 cgc.cmd[5] = blk.from & 0xff;
2757 cgc.cmd[7] = (blk.len >> 8) & 0xff;
2758 cgc.cmd[8] = blk.len & 0xff;
2759 cgc.data_direction = CGC_DATA_NONE;
2760 return cdo->generic_packet(cdi, &cgc);
2762 case CDROMVOLCTRL:
2763 case CDROMVOLREAD: {
2764 struct cdrom_volctrl volctrl;
2765 char mask[sizeof(buffer)];
2766 unsigned short offset;
2768 cdinfo(CD_DO_IOCTL, "entering CDROMVOLUME\n");
2770 IOCTL_IN(arg, struct cdrom_volctrl, volctrl);
2772 cgc.buffer = buffer;
2773 cgc.buflen = 24;
2774 if ((ret = cdrom_mode_sense(cdi, &cgc, GPMODE_AUDIO_CTL_PAGE, 0)))
2775 return ret;
2777 /* originally the code depended on buffer[1] to determine
2778 how much data is available for transfer. buffer[1] is
2779 unfortunately ambigious and the only reliable way seem
2780 to be to simply skip over the block descriptor... */
2781 offset = 8 + be16_to_cpu(*(unsigned short *)(buffer+6));
2783 if (offset + 16 > sizeof(buffer))
2784 return -E2BIG;
2786 if (offset + 16 > cgc.buflen) {
2787 cgc.buflen = offset+16;
2788 ret = cdrom_mode_sense(cdi, &cgc,
2789 GPMODE_AUDIO_CTL_PAGE, 0);
2790 if (ret)
2791 return ret;
2794 /* sanity check */
2795 if ((buffer[offset] & 0x3f) != GPMODE_AUDIO_CTL_PAGE ||
2796 buffer[offset+1] < 14)
2797 return -EINVAL;
2799 /* now we have the current volume settings. if it was only
2800 a CDROMVOLREAD, return these values */
2801 if (cmd == CDROMVOLREAD) {
2802 volctrl.channel0 = buffer[offset+9];
2803 volctrl.channel1 = buffer[offset+11];
2804 volctrl.channel2 = buffer[offset+13];
2805 volctrl.channel3 = buffer[offset+15];
2806 IOCTL_OUT(arg, struct cdrom_volctrl, volctrl);
2807 return 0;
2810 /* get the volume mask */
2811 cgc.buffer = mask;
2812 if ((ret = cdrom_mode_sense(cdi, &cgc,
2813 GPMODE_AUDIO_CTL_PAGE, 1)))
2814 return ret;
2816 buffer[offset+9] = volctrl.channel0 & mask[offset+9];
2817 buffer[offset+11] = volctrl.channel1 & mask[offset+11];
2818 buffer[offset+13] = volctrl.channel2 & mask[offset+13];
2819 buffer[offset+15] = volctrl.channel3 & mask[offset+15];
2821 /* set volume */
2822 cgc.buffer = buffer + offset - 8;
2823 memset(cgc.buffer, 0, 8);
2824 return cdrom_mode_select(cdi, &cgc);
2827 case CDROMSTART:
2828 case CDROMSTOP: {
2829 cdinfo(CD_DO_IOCTL, "entering CDROMSTART/CDROMSTOP\n");
2830 cgc.cmd[0] = GPCMD_START_STOP_UNIT;
2831 cgc.cmd[1] = 1;
2832 cgc.cmd[4] = (cmd == CDROMSTART) ? 1 : 0;
2833 cgc.data_direction = CGC_DATA_NONE;
2834 return cdo->generic_packet(cdi, &cgc);
2837 case CDROMPAUSE:
2838 case CDROMRESUME: {
2839 cdinfo(CD_DO_IOCTL, "entering CDROMPAUSE/CDROMRESUME\n");
2840 cgc.cmd[0] = GPCMD_PAUSE_RESUME;
2841 cgc.cmd[8] = (cmd == CDROMRESUME) ? 1 : 0;
2842 cgc.data_direction = CGC_DATA_NONE;
2843 return cdo->generic_packet(cdi, &cgc);
2846 case DVD_READ_STRUCT: {
2847 dvd_struct *s;
2848 int size = sizeof(dvd_struct);
2849 if (!CDROM_CAN(CDC_DVD))
2850 return -ENOSYS;
2851 if ((s = (dvd_struct *) kmalloc(size, GFP_KERNEL)) == NULL)
2852 return -ENOMEM;
2853 cdinfo(CD_DO_IOCTL, "entering DVD_READ_STRUCT\n");
2854 if (copy_from_user(s, (dvd_struct __user *)arg, size)) {
2855 kfree(s);
2856 return -EFAULT;
2858 if ((ret = dvd_read_struct(cdi, s))) {
2859 kfree(s);
2860 return ret;
2862 if (copy_to_user((dvd_struct __user *)arg, s, size))
2863 ret = -EFAULT;
2864 kfree(s);
2865 return ret;
2868 case DVD_AUTH: {
2869 dvd_authinfo ai;
2870 if (!CDROM_CAN(CDC_DVD))
2871 return -ENOSYS;
2872 cdinfo(CD_DO_IOCTL, "entering DVD_AUTH\n");
2873 IOCTL_IN(arg, dvd_authinfo, ai);
2874 if ((ret = dvd_do_auth (cdi, &ai)))
2875 return ret;
2876 IOCTL_OUT(arg, dvd_authinfo, ai);
2877 return 0;
2880 case CDROM_NEXT_WRITABLE: {
2881 long next = 0;
2882 cdinfo(CD_DO_IOCTL, "entering CDROM_NEXT_WRITABLE\n");
2883 if ((ret = cdrom_get_next_writable(cdi, &next)))
2884 return ret;
2885 IOCTL_OUT(arg, long, next);
2886 return 0;
2888 case CDROM_LAST_WRITTEN: {
2889 long last = 0;
2890 cdinfo(CD_DO_IOCTL, "entering CDROM_LAST_WRITTEN\n");
2891 if ((ret = cdrom_get_last_written(cdi, &last)))
2892 return ret;
2893 IOCTL_OUT(arg, long, last);
2894 return 0;
2896 } /* switch */
2898 return -ENOTTY;
2901 static int cdrom_get_track_info(struct cdrom_device_info *cdi, __u16 track, __u8 type,
2902 track_information *ti)
2904 struct cdrom_device_ops *cdo = cdi->ops;
2905 struct packet_command cgc;
2906 int ret, buflen;
2908 init_cdrom_command(&cgc, ti, 8, CGC_DATA_READ);
2909 cgc.cmd[0] = GPCMD_READ_TRACK_RZONE_INFO;
2910 cgc.cmd[1] = type & 3;
2911 cgc.cmd[4] = (track & 0xff00) >> 8;
2912 cgc.cmd[5] = track & 0xff;
2913 cgc.cmd[8] = 8;
2914 cgc.quiet = 1;
2916 if ((ret = cdo->generic_packet(cdi, &cgc)))
2917 return ret;
2919 buflen = be16_to_cpu(ti->track_information_length) +
2920 sizeof(ti->track_information_length);
2922 if (buflen > sizeof(track_information))
2923 buflen = sizeof(track_information);
2925 cgc.cmd[8] = cgc.buflen = buflen;
2926 if ((ret = cdo->generic_packet(cdi, &cgc)))
2927 return ret;
2929 /* return actual fill size */
2930 return buflen;
2933 /* requires CD R/RW */
2934 static int cdrom_get_disc_info(struct cdrom_device_info *cdi, disc_information *di)
2936 struct cdrom_device_ops *cdo = cdi->ops;
2937 struct packet_command cgc;
2938 int ret, buflen;
2940 /* set up command and get the disc info */
2941 init_cdrom_command(&cgc, di, sizeof(*di), CGC_DATA_READ);
2942 cgc.cmd[0] = GPCMD_READ_DISC_INFO;
2943 cgc.cmd[8] = cgc.buflen = 2;
2944 cgc.quiet = 1;
2946 if ((ret = cdo->generic_packet(cdi, &cgc)))
2947 return ret;
2949 /* not all drives have the same disc_info length, so requeue
2950 * packet with the length the drive tells us it can supply
2952 buflen = be16_to_cpu(di->disc_information_length) +
2953 sizeof(di->disc_information_length);
2955 if (buflen > sizeof(disc_information))
2956 buflen = sizeof(disc_information);
2958 cgc.cmd[8] = cgc.buflen = buflen;
2959 if ((ret = cdo->generic_packet(cdi, &cgc)))
2960 return ret;
2962 /* return actual fill size */
2963 return buflen;
2966 /* return the last written block on the CD-R media. this is for the udf
2967 file system. */
2968 int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written)
2970 struct cdrom_tocentry toc;
2971 disc_information di;
2972 track_information ti;
2973 __u32 last_track;
2974 int ret = -1, ti_size;
2976 if (!CDROM_CAN(CDC_GENERIC_PACKET))
2977 goto use_toc;
2979 ret = cdrom_get_disc_info(cdi, &di);
2980 if (ret < (int)(offsetof(typeof(di), last_track_lsb)
2981 + sizeof(di.last_track_lsb)))
2982 goto use_toc;
2984 /* if unit didn't return msb, it's zeroed by cdrom_get_disc_info */
2985 last_track = (di.last_track_msb << 8) | di.last_track_lsb;
2986 ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
2987 if (ti_size < (int)offsetof(typeof(ti), track_start))
2988 goto use_toc;
2990 /* if this track is blank, try the previous. */
2991 if (ti.blank) {
2992 if (last_track==1)
2993 goto use_toc;
2994 last_track--;
2995 ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
2998 if (ti_size < (int)(offsetof(typeof(ti), track_size)
2999 + sizeof(ti.track_size)))
3000 goto use_toc;
3002 /* if last recorded field is valid, return it. */
3003 if (ti.lra_v && ti_size >= (int)(offsetof(typeof(ti), last_rec_address)
3004 + sizeof(ti.last_rec_address))) {
3005 *last_written = be32_to_cpu(ti.last_rec_address);
3006 } else {
3007 /* make it up instead */
3008 *last_written = be32_to_cpu(ti.track_start) +
3009 be32_to_cpu(ti.track_size);
3010 if (ti.free_blocks)
3011 *last_written -= (be32_to_cpu(ti.free_blocks) + 7);
3013 return 0;
3015 /* this is where we end up if the drive either can't do a
3016 GPCMD_READ_DISC_INFO or GPCMD_READ_TRACK_RZONE_INFO or if
3017 it doesn't give enough information or fails. then we return
3018 the toc contents. */
3019 use_toc:
3020 toc.cdte_format = CDROM_MSF;
3021 toc.cdte_track = CDROM_LEADOUT;
3022 if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &toc)))
3023 return ret;
3024 sanitize_format(&toc.cdte_addr, &toc.cdte_format, CDROM_LBA);
3025 *last_written = toc.cdte_addr.lba;
3026 return 0;
3029 /* return the next writable block. also for udf file system. */
3030 static int cdrom_get_next_writable(struct cdrom_device_info *cdi, long *next_writable)
3032 disc_information di;
3033 track_information ti;
3034 __u16 last_track;
3035 int ret, ti_size;
3037 if (!CDROM_CAN(CDC_GENERIC_PACKET))
3038 goto use_last_written;
3040 ret = cdrom_get_disc_info(cdi, &di);
3041 if (ret < 0 || ret < offsetof(typeof(di), last_track_lsb)
3042 + sizeof(di.last_track_lsb))
3043 goto use_last_written;
3045 /* if unit didn't return msb, it's zeroed by cdrom_get_disc_info */
3046 last_track = (di.last_track_msb << 8) | di.last_track_lsb;
3047 ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
3048 if (ti_size < 0 || ti_size < offsetof(typeof(ti), track_start))
3049 goto use_last_written;
3051 /* if this track is blank, try the previous. */
3052 if (ti.blank) {
3053 if (last_track == 1)
3054 goto use_last_written;
3055 last_track--;
3056 ti_size = cdrom_get_track_info(cdi, last_track, 1, &ti);
3057 if (ti_size < 0)
3058 goto use_last_written;
3061 /* if next recordable address field is valid, use it. */
3062 if (ti.nwa_v && ti_size >= offsetof(typeof(ti), next_writable)
3063 + sizeof(ti.next_writable)) {
3064 *next_writable = be32_to_cpu(ti.next_writable);
3065 return 0;
3068 use_last_written:
3069 if ((ret = cdrom_get_last_written(cdi, next_writable))) {
3070 *next_writable = 0;
3071 return ret;
3072 } else {
3073 *next_writable += 7;
3074 return 0;
3078 EXPORT_SYMBOL(cdrom_get_last_written);
3079 EXPORT_SYMBOL(register_cdrom);
3080 EXPORT_SYMBOL(unregister_cdrom);
3081 EXPORT_SYMBOL(cdrom_open);
3082 EXPORT_SYMBOL(cdrom_release);
3083 EXPORT_SYMBOL(cdrom_ioctl);
3084 EXPORT_SYMBOL(cdrom_media_changed);
3085 EXPORT_SYMBOL(cdrom_number_of_slots);
3086 EXPORT_SYMBOL(cdrom_mode_select);
3087 EXPORT_SYMBOL(cdrom_mode_sense);
3088 EXPORT_SYMBOL(init_cdrom_command);
3089 EXPORT_SYMBOL(cdrom_get_media_event);
3091 #ifdef CONFIG_SYSCTL
3093 #define CDROM_STR_SIZE 1000
3095 static struct cdrom_sysctl_settings {
3096 char info[CDROM_STR_SIZE]; /* general info */
3097 int autoclose; /* close tray upon mount, etc */
3098 int autoeject; /* eject on umount */
3099 int debug; /* turn on debugging messages */
3100 int lock; /* lock the door on device open */
3101 int check; /* check media type */
3102 } cdrom_sysctl_settings;
3104 static int cdrom_sysctl_info(ctl_table *ctl, int write, struct file * filp,
3105 void __user *buffer, size_t *lenp, loff_t *ppos)
3107 int pos;
3108 struct cdrom_device_info *cdi;
3109 char *info = cdrom_sysctl_settings.info;
3111 if (!*lenp || (*ppos && !write)) {
3112 *lenp = 0;
3113 return 0;
3116 pos = sprintf(info, "CD-ROM information, " VERSION "\n");
3118 pos += sprintf(info+pos, "\ndrive name:\t");
3119 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3120 pos += sprintf(info+pos, "\t%s", cdi->name);
3122 pos += sprintf(info+pos, "\ndrive speed:\t");
3123 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3124 pos += sprintf(info+pos, "\t%d", cdi->speed);
3126 pos += sprintf(info+pos, "\ndrive # of slots:");
3127 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3128 pos += sprintf(info+pos, "\t%d", cdi->capacity);
3130 pos += sprintf(info+pos, "\nCan close tray:\t");
3131 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3132 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_CLOSE_TRAY) != 0);
3134 pos += sprintf(info+pos, "\nCan open tray:\t");
3135 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3136 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_OPEN_TRAY) != 0);
3138 pos += sprintf(info+pos, "\nCan lock tray:\t");
3139 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3140 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_LOCK) != 0);
3142 pos += sprintf(info+pos, "\nCan change speed:");
3143 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3144 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_SELECT_SPEED) != 0);
3146 pos += sprintf(info+pos, "\nCan select disk:");
3147 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3148 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_SELECT_DISC) != 0);
3150 pos += sprintf(info+pos, "\nCan read multisession:");
3151 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3152 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MULTI_SESSION) != 0);
3154 pos += sprintf(info+pos, "\nCan read MCN:\t");
3155 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3156 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MCN) != 0);
3158 pos += sprintf(info+pos, "\nReports media changed:");
3159 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3160 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MEDIA_CHANGED) != 0);
3162 pos += sprintf(info+pos, "\nCan play audio:\t");
3163 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3164 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_PLAY_AUDIO) != 0);
3166 pos += sprintf(info+pos, "\nCan write CD-R:\t");
3167 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3168 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_CD_R) != 0);
3170 pos += sprintf(info+pos, "\nCan write CD-RW:");
3171 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3172 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_CD_RW) != 0);
3174 pos += sprintf(info+pos, "\nCan read DVD:\t");
3175 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3176 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD) != 0);
3178 pos += sprintf(info+pos, "\nCan write DVD-R:");
3179 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3180 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD_R) != 0);
3182 pos += sprintf(info+pos, "\nCan write DVD-RAM:");
3183 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3184 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_DVD_RAM) != 0);
3186 pos += sprintf(info+pos, "\nCan read MRW:\t");
3187 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3188 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MRW) != 0);
3190 pos += sprintf(info+pos, "\nCan write MRW:\t");
3191 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3192 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_MRW_W) != 0);
3194 pos += sprintf(info+pos, "\nCan write RAM:\t");
3195 for (cdi=topCdromPtr;cdi!=NULL;cdi=cdi->next)
3196 pos += sprintf(info+pos, "\t%d", CDROM_CAN(CDC_RAM) != 0);
3198 strcpy(info+pos,"\n\n");
3200 return proc_dostring(ctl, write, filp, buffer, lenp, ppos);
3203 /* Unfortunately, per device settings are not implemented through
3204 procfs/sysctl yet. When they are, this will naturally disappear. For now
3205 just update all drives. Later this will become the template on which
3206 new registered drives will be based. */
3207 static void cdrom_update_settings(void)
3209 struct cdrom_device_info *cdi;
3211 for (cdi = topCdromPtr; cdi != NULL; cdi = cdi->next) {
3212 if (autoclose && CDROM_CAN(CDC_CLOSE_TRAY))
3213 cdi->options |= CDO_AUTO_CLOSE;
3214 else if (!autoclose)
3215 cdi->options &= ~CDO_AUTO_CLOSE;
3216 if (autoeject && CDROM_CAN(CDC_OPEN_TRAY))
3217 cdi->options |= CDO_AUTO_EJECT;
3218 else if (!autoeject)
3219 cdi->options &= ~CDO_AUTO_EJECT;
3220 if (lockdoor && CDROM_CAN(CDC_LOCK))
3221 cdi->options |= CDO_LOCK;
3222 else if (!lockdoor)
3223 cdi->options &= ~CDO_LOCK;
3224 if (check_media_type)
3225 cdi->options |= CDO_CHECK_TYPE;
3226 else
3227 cdi->options &= ~CDO_CHECK_TYPE;
3231 static int cdrom_sysctl_handler(ctl_table *ctl, int write, struct file * filp,
3232 void __user *buffer, size_t *lenp, loff_t *ppos)
3234 int *valp = ctl->data;
3235 int val = *valp;
3236 int ret;
3238 ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
3240 if (write && *valp != val) {
3242 /* we only care for 1 or 0. */
3243 if (*valp)
3244 *valp = 1;
3245 else
3246 *valp = 0;
3248 switch (ctl->ctl_name) {
3249 case DEV_CDROM_AUTOCLOSE: {
3250 if (valp == &cdrom_sysctl_settings.autoclose)
3251 autoclose = cdrom_sysctl_settings.autoclose;
3252 break;
3254 case DEV_CDROM_AUTOEJECT: {
3255 if (valp == &cdrom_sysctl_settings.autoeject)
3256 autoeject = cdrom_sysctl_settings.autoeject;
3257 break;
3259 case DEV_CDROM_DEBUG: {
3260 if (valp == &cdrom_sysctl_settings.debug)
3261 debug = cdrom_sysctl_settings.debug;
3262 break;
3264 case DEV_CDROM_LOCK: {
3265 if (valp == &cdrom_sysctl_settings.lock)
3266 lockdoor = cdrom_sysctl_settings.lock;
3267 break;
3269 case DEV_CDROM_CHECK_MEDIA: {
3270 if (valp == &cdrom_sysctl_settings.check)
3271 check_media_type = cdrom_sysctl_settings.check;
3272 break;
3275 /* update the option flags according to the changes. we
3276 don't have per device options through sysctl yet,
3277 but we will have and then this will disappear. */
3278 cdrom_update_settings();
3281 return ret;
3284 /* Place files in /proc/sys/dev/cdrom */
3285 static ctl_table cdrom_table[] = {
3287 .ctl_name = DEV_CDROM_INFO,
3288 .procname = "info",
3289 .data = &cdrom_sysctl_settings.info,
3290 .maxlen = CDROM_STR_SIZE,
3291 .mode = 0444,
3292 .proc_handler = &cdrom_sysctl_info,
3295 .ctl_name = DEV_CDROM_AUTOCLOSE,
3296 .procname = "autoclose",
3297 .data = &cdrom_sysctl_settings.autoclose,
3298 .maxlen = sizeof(int),
3299 .mode = 0644,
3300 .proc_handler = &cdrom_sysctl_handler,
3303 .ctl_name = DEV_CDROM_AUTOEJECT,
3304 .procname = "autoeject",
3305 .data = &cdrom_sysctl_settings.autoeject,
3306 .maxlen = sizeof(int),
3307 .mode = 0644,
3308 .proc_handler = &cdrom_sysctl_handler,
3311 .ctl_name = DEV_CDROM_DEBUG,
3312 .procname = "debug",
3313 .data = &cdrom_sysctl_settings.debug,
3314 .maxlen = sizeof(int),
3315 .mode = 0644,
3316 .proc_handler = &cdrom_sysctl_handler,
3319 .ctl_name = DEV_CDROM_LOCK,
3320 .procname = "lock",
3321 .data = &cdrom_sysctl_settings.lock,
3322 .maxlen = sizeof(int),
3323 .mode = 0644,
3324 .proc_handler = &cdrom_sysctl_handler,
3327 .ctl_name = DEV_CDROM_CHECK_MEDIA,
3328 .procname = "check_media",
3329 .data = &cdrom_sysctl_settings.check,
3330 .maxlen = sizeof(int),
3331 .mode = 0644,
3332 .proc_handler = &cdrom_sysctl_handler
3334 { .ctl_name = 0 }
3337 static ctl_table cdrom_cdrom_table[] = {
3339 .ctl_name = DEV_CDROM,
3340 .procname = "cdrom",
3341 .maxlen = 0,
3342 .mode = 0555,
3343 .child = cdrom_table,
3345 { .ctl_name = 0 }
3348 /* Make sure that /proc/sys/dev is there */
3349 static ctl_table cdrom_root_table[] = {
3351 .ctl_name = CTL_DEV,
3352 .procname = "dev",
3353 .maxlen = 0,
3354 .mode = 0555,
3355 .child = cdrom_cdrom_table,
3357 { .ctl_name = 0 }
3359 static struct ctl_table_header *cdrom_sysctl_header;
3361 static void cdrom_sysctl_register(void)
3363 static int initialized;
3365 if (initialized == 1)
3366 return;
3368 cdrom_sysctl_header = register_sysctl_table(cdrom_root_table, 1);
3369 if (cdrom_root_table->ctl_name && cdrom_root_table->child->de)
3370 cdrom_root_table->child->de->owner = THIS_MODULE;
3372 /* set the defaults */
3373 cdrom_sysctl_settings.autoclose = autoclose;
3374 cdrom_sysctl_settings.autoeject = autoeject;
3375 cdrom_sysctl_settings.debug = debug;
3376 cdrom_sysctl_settings.lock = lockdoor;
3377 cdrom_sysctl_settings.check = check_media_type;
3379 initialized = 1;
3382 static void cdrom_sysctl_unregister(void)
3384 if (cdrom_sysctl_header)
3385 unregister_sysctl_table(cdrom_sysctl_header);
3388 #endif /* CONFIG_SYSCTL */
3390 static int __init cdrom_init(void)
3392 #ifdef CONFIG_SYSCTL
3393 cdrom_sysctl_register();
3394 #endif
3395 return 0;
3398 static void __exit cdrom_exit(void)
3400 printk(KERN_INFO "Uniform CD-ROM driver unloaded\n");
3401 #ifdef CONFIG_SYSCTL
3402 cdrom_sysctl_unregister();
3403 #endif
3406 module_init(cdrom_init);
3407 module_exit(cdrom_exit);
3408 MODULE_LICENSE("GPL");