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. ;-)
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!
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
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
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
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
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,
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
144 -- Fix up ioctl handling so the device specific ones actually get
147 3.02 Aug 8, 1999 - Jens Axboe <axboe@image.dk>
148 -- Fixed volume control on SCSI drives (or others with longer audio
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
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
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
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 :-)
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
255 #define CD_CLOSE 0x10
256 #define CD_COUNT_TRACKS 0x20
257 #define CD_CHANGER 0x40
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 */
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
[] = {
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)
322 #define cdinfo(type, fmt, args...)
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))) \
330 #define IOCTL_OUT(arg, type, out) \
331 if (copy_to_user((type __user *) (arg), &(out), sizeof (out))) \
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
,
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
);
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
)
373 cgc
->sense
->sense_key
= 0x05;
374 cgc
->sense
->asc
= 0x20;
375 cgc
->sense
->ascq
= 0x00;
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
)
399 if (!banner_printed
) {
400 printk(KERN_INFO
"Uniform CD-ROM driver " REVISION
"\n");
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
);
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
;
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
;
435 cdi
->cdda_method
= CDDA_BPC_FULL
;
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
;
446 spin_unlock(&cdrom_lock
);
451 int unregister_cdrom(struct cdrom_device_info
*unreg
)
453 struct cdrom_device_info
*cdi
, *prev
;
454 cdinfo(CD_OPEN
, "entering unregister_cdrom\n");
457 spin_lock(&cdrom_lock
);
459 while (cdi
&& cdi
!= unreg
) {
465 spin_unlock(&cdrom_lock
);
469 prev
->next
= cdi
->next
;
471 topCdromPtr
= cdi
->next
;
473 spin_unlock(&cdrom_lock
);
478 cdi
->ops
->n_minors
--;
479 cdinfo(CD_REG_UNREG
, "drive \"/dev/%s\" unregistered\n", cdi
->name
);
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
);
497 if (cdi
->ops
->generic_packet(cdi
, &cgc
))
500 if (be16_to_cpu(eh
->data_len
) < sizeof(*med
))
503 if (eh
->nea
|| eh
->notification_class
!= 0x4)
506 memcpy(med
, &buffer
[sizeof(*eh
)], sizeof(*med
));
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
;
519 init_cdrom_command(&cgc
, buffer
, sizeof(buffer
), CGC_DATA_READ
);
524 if (!cdrom_mode_sense(cdi
, &cgc
, MRW_MODE_PC
, 0)) {
525 cdi
->mrw_mode_page
= MRW_MODE_PC
;
527 } else if (!cdrom_mode_sense(cdi
, &cgc
, MRW_MODE_PC_PRE1
, 0)) {
528 cdi
->mrw_mode_page
= MRW_MODE_PC_PRE1
;
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];
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
);
551 if ((ret
= cdi
->ops
->generic_packet(cdi
, &cgc
)))
554 mfd
= (struct mrw_feature_desc
*)&buffer
[sizeof(struct feature_header
)];
555 if (be16_to_cpu(mfd
->feature_code
) != CDF_MRW
)
559 if ((ret
= cdrom_mrw_probe_pc(cdi
))) {
567 static int cdrom_mrw_bgformat(struct cdrom_device_info
*cdi
, int cont
)
569 struct packet_command cgc
;
570 unsigned char buffer
[12];
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
598 buffer
[8] = 0x24 << 2;
601 ret
= cdi
->ops
->generic_packet(cdi
, &cgc
);
603 printk(KERN_INFO
"cdrom: bgformat failed\n");
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
;
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
)
643 ret
= cdrom_get_disc_info(cdi
, &di
);
644 if (ret
< 0 || ret
< (int)offsetof(typeof(di
),disc_type
))
648 if (di
.mrw_status
== CDM_MRW_BGFORMAT_ACTIVE
) {
649 printk(KERN_INFO
"cdrom: issuing MRW back ground "
651 ret
= cdrom_mrw_bgformat_susp(cdi
, 0);
654 if (!ret
&& cdi
->media_written
)
655 ret
= cdrom_flush_cache(cdi
);
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
;
665 int ret
, offset
, size
;
667 init_cdrom_command(&cgc
, buffer
, sizeof(buffer
), CGC_DATA_READ
);
670 cgc
.buflen
= sizeof(buffer
);
672 if ((ret
= cdrom_mode_sense(cdi
, &cgc
, cdi
->mrw_mode_page
, 0)))
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
;
682 if ((ret
= cdrom_mode_select(cdi
, &cgc
)))
685 printk(KERN_INFO
"cdrom: %s: mrw address space %s selected\n", cdi
->name
, mrw_address_space
[space
]);
689 static int cdrom_get_random_writable(struct cdrom_device_info
*cdi
,
690 struct rwrt_feature_desc
*rfd
)
692 struct packet_command cgc
;
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 */
703 if ((ret
= cdi
->ops
->generic_packet(cdi
, &cgc
)))
706 memcpy(rfd
, &buffer
[sizeof(struct feature_header
)], sizeof (*rfd
));
710 static int cdrom_has_defect_mgt(struct cdrom_device_info
*cdi
)
712 struct packet_command cgc
;
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
);
724 if ((ret
= cdi
->ops
->generic_packet(cdi
, &cgc
)))
727 feature_code
= (__u16
*) &buffer
[sizeof(struct feature_header
)];
728 if (be16_to_cpu(*feature_code
) == CDF_HWDM
)
735 static int cdrom_is_random_writable(struct cdrom_device_info
*cdi
, int *write
)
737 struct rwrt_feature_desc rfd
;
742 if ((ret
= cdrom_get_random_writable(cdi
, &rfd
)))
745 if (CDF_RWRT
== be16_to_cpu(rfd
.feature_code
))
751 static int cdrom_media_erasable(struct cdrom_device_info
*cdi
)
756 ret
= cdrom_get_disc_info(cdi
, &di
);
757 if (ret
< 0 || ret
< offsetof(typeof(di
), n_first_track
))
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
780 static int cdrom_mrw_open_write(struct cdrom_device_info
*cdi
)
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");
793 ret
= cdrom_get_disc_info(cdi
, &di
);
794 if (ret
< 0 || ret
< offsetof(typeof(di
),disc_type
))
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
808 printk(KERN_INFO
"cdrom open: mrw_status '%s'\n",
809 mrw_format_status
[di
.mrw_status
]);
812 else if (di
.mrw_status
== CDM_MRW_BGFORMAT_INACTIVE
&&
814 ret
= cdrom_mrw_bgformat(cdi
, 1);
819 static int mo_open_write(struct cdrom_device_info
*cdi
)
821 struct packet_command cgc
;
825 init_cdrom_command(&cgc
, &buffer
, 4, CGC_DATA_READ
);
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);
835 ret
= cdrom_mode_sense(cdi
, &cgc
, GPMODE_VENDOR_PAGE
, 0);
838 ret
= cdrom_mode_sense(cdi
, &cgc
, GPMODE_ALL_PAGES
, 0);
841 /* drive gave us no info, let the user go ahead */
845 return buffer
[3] & 0x80;
848 static int cdrom_ram_open_write(struct cdrom_device_info
*cdi
)
850 struct rwrt_feature_desc rfd
;
853 if ((ret
= cdrom_has_defect_mgt(cdi
)))
856 if ((ret
= cdrom_get_random_writable(cdi
, &rfd
)))
858 else if (CDF_RWRT
== be16_to_cpu(rfd
.feature_code
))
861 cdinfo(CD_OPEN
, "can open for random write\n");
865 static void cdrom_mmc3_profile(struct cdrom_device_info
*cdi
)
867 struct packet_command cgc
;
869 int ret
, mmc3_profile
;
871 init_cdrom_command(&cgc
, buffer
, sizeof(buffer
), CGC_DATA_READ
);
873 cgc
.cmd
[0] = GPCMD_GET_CONFIGURATION
;
875 cgc
.cmd
[2] = cgc
.cmd
[3] = 0; /* Starting Feature Number */
876 cgc
.cmd
[8] = sizeof(buffer
); /* Allocation Length */
879 if ((ret
= cdi
->ops
->generic_packet(cdi
, &cgc
)))
880 mmc3_profile
= 0xffff;
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 */
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
;
907 if (!cdrom_is_mrw(cdi
, &mrw_write
))
910 if (CDROM_CAN(CDC_MO_DRIVE
))
913 (void) cdrom_is_random_writable(cdi
, &ram_write
);
916 cdi
->mask
&= ~CDC_MRW
;
918 cdi
->mask
|= CDC_MRW
;
921 cdi
->mask
&= ~CDC_MRW_W
;
923 cdi
->mask
|= CDC_MRW_W
;
926 cdi
->mask
&= ~CDC_RAM
;
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
))
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
);
954 if (!cdi
->media_written
) {
955 cdinfo(CD_CLOSE
, "%s: DVD+RW media clean\n", cdi
->name
);
959 printk(KERN_INFO
"cdrom: %s: dirty DVD+RW media, \"finalizing\"\n",
962 init_cdrom_command(&cgc
, NULL
, 0, CGC_DATA_NONE
);
963 cgc
.cmd
[0] = GPCMD_FLUSH_CACHE
;
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
;
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 */
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
)
986 return cdrom_flush_cache(cdi
);
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
1000 int cdrom_open(struct cdrom_device_info
*cdi
, struct inode
*ip
, struct file
*fp
)
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. */
1009 if ((fp
->f_flags
& O_NONBLOCK
) && (cdi
->options
& CDO_USE_FFLAGS
)) {
1010 ret
= cdi
->ops
->open(cdi
, 1);
1012 ret
= open_for_data(cdi
);
1015 cdrom_mmc3_profile(cdi
);
1016 if (fp
->f_mode
& FMODE_WRITE
) {
1018 if (cdrom_open_write(cdi
))
1020 if (!CDROM_CAN(CDC_RAM
))
1023 cdi
->media_written
= 0;
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
);
1042 int open_for_data(struct cdrom_device_info
* cdi
)
1045 struct cdrom_device_ops
*cdo
= cdi
->ops
;
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);
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.*/
1068 goto clean_up_and_return
;
1071 cdinfo(CD_OPEN
, "bummer. this drive can't close the tray.\n");
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");
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
) {
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");
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
);
1108 goto clean_up_and_return
;
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... */
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");
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");
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
)
1156 cdinfo(CD_OPEN
, "entering check_for_audio_disc\n");
1157 if (!(cdi
->options
& CDO_CHECK_TYPE
))
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);
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.*/
1179 cdinfo(CD_OPEN
, "bummer. this driver can't close the tray.\n");
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");
1188 if (ret
!=CDS_DISC_OK
) {
1189 cdinfo(CD_OPEN
, "bummer. disc isn't ready.\n");
1192 cdinfo(CD_OPEN
, "the tray is now closed.\n");
1195 cdrom_count_tracks(cdi
, &tracks
);
1197 return(tracks
.error
);
1199 if (tracks
.audio
==0)
1200 return -EMEDIUMTYPE
;
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)
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
);
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);
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
;
1250 * Sanyo changer isn't spec compliant (doesn't use regular change
1251 * LOAD_UNLOAD command, and it doesn't implement the mech status
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;
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
;
1279 cdinfo(CD_CHANGER
, "entering cdrom_slot_status()\n");
1280 if (cdi
->sanyo_slot
)
1283 info
= kmalloc(sizeof(*info
), GFP_KERNEL
);
1287 if ((ret
= cdrom_read_mech_status(cdi
, info
)))
1290 if (info
->slots
[slot
].disc_present
)
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
)
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: */
1313 info
= kmalloc(sizeof(*info
), GFP_KERNEL
);
1317 if ((status
= cdrom_read_mech_status(cdi
, info
)) == 0)
1318 nslots
= info
->hdr
.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)
1334 init_cdrom_command(&cgc
, NULL
, 0, CGC_DATA_NONE
);
1335 cgc
.cmd
[0] = GPCMD_LOAD_UNLOAD
;
1336 cgc
.cmd
[4] = 2 + (slot
>= 0);
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
;
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
;
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
);
1375 if ((ret
= cdrom_read_mech_status(cdi
, info
))) {
1380 curslot
= info
->hdr
.curslot
;
1383 if (cdi
->use_count
> 1 || keeplocked
) {
1384 if (slot
== CDSL_CURRENT
) {
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
1396 if (slot
== CDSL_CURRENT
)
1399 /* set media changed bits on both queues */
1400 cdi
->mc_flags
= 0x3;
1401 if ((ret
= cdrom_load_unload(cdi
, 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.
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
))
1421 /* changed since last call? */
1422 if (cdi
->ops
->media_changed(cdi
, CDSL_CURRENT
)) {
1423 cdi
->mc_flags
= 0x3; /* set bit on both queues */
1425 cdi
->media_written
= 0;
1427 cdi
->mc_flags
&= ~mask
; /* clear bit */
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
)
1438 if (!CDROM_CAN(CDC_MEDIA_CHANGED
))
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
;
1454 cdinfo(CD_COUNT_TRACKS
, "entering cdrom_count_tracks\n");
1455 if (!CDROM_CAN(CDC_PLAY_AUDIO
)) {
1456 tracks
->error
=CDS_NO_INFO
;
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
;
1464 tracks
->error
= CDS_NO_INFO
;
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
;
1475 if (entry
.cdte_ctrl
& CDROM_DATA_TRACK
) {
1476 if (entry
.cdte_format
== 0x10)
1478 else if (entry
.cdte_format
== 0x20)
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.
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;
1522 addr
->msf
.second
= lba
% 60;
1523 addr
->msf
.minute
= lba
/ 60;
1528 void init_cdrom_command(struct packet_command
*cgc
, void *buf
, int len
,
1531 memset(cgc
, 0, sizeof(struct packet_command
));
1533 memset(buf
, 0, len
);
1534 cgc
->buffer
= (char *) buf
;
1536 cgc
->data_direction
= type
;
1537 cgc
->timeout
= CDROM_DEF_TIMEOUT
;
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);
1550 case 0: case 8: case 5: {
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);
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
)
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
);
1602 case DVD_LU_SEND_AGID
:
1603 cdinfo(CD_DVD
, "entering DVD_LU_SEND_AGID\n");
1605 setup_report_key(&cgc
, ai
->lsa
.agid
, 0);
1607 if ((ret
= cdo
->generic_packet(cdi
, &cgc
)))
1610 ai
->lsa
.agid
= buf
[7] >> 6;
1611 /* Returning data, let host change state */
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
)))
1621 copy_key(ai
->lsk
.key
, &buf
[4]);
1622 /* Returning data, let host change state */
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
)))
1632 copy_chal(ai
->lsc
.chal
, &buf
[4]);
1633 /* Returning data, let host change state */
1637 case DVD_LU_SEND_TITLE_KEY
:
1638 cdinfo(CD_DVD
, "entering DVD_LU_SEND_TITLE_KEY\n");
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
)))
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 */
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
)))
1663 ai
->lsasf
.asf
= buf
[7] & 1;
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);
1671 copy_chal(&buf
[4], ai
->hsc
.chal
);
1673 if ((ret
= cdo
->generic_packet(cdi
, &cgc
)))
1676 ai
->type
= DVD_LU_SEND_KEY1
;
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);
1683 copy_key(&buf
[4], ai
->hsk
.key
);
1685 if ((ret
= cdo
->generic_packet(cdi
, &cgc
))) {
1686 ai
->type
= DVD_AUTH_FAILURE
;
1689 ai
->type
= DVD_AUTH_ESTABLISHED
;
1693 case DVD_INVALIDATE_AGID
:
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
)))
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
)))
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
;
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);
1723 buf
[4] = ai
->hrpcs
.pdrc
;
1725 if ((ret
= cdo
->generic_packet(cdi
, &cgc
)))
1730 cdinfo(CD_WARNING
, "Invalid DVD key ioctl (%d)\n", ai
->type
);
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
)
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)
1759 if ((ret
= cdo
->generic_packet(cdi
, &cgc
)))
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;
1787 static int dvd_read_copyright(struct cdrom_device_info
*cdi
, dvd_struct
*s
)
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
)))
1804 s
->copyright
.cpst
= buf
[4];
1805 s
->copyright
.rmi
= buf
[5];
1810 static int dvd_read_disckey(struct cdrom_device_info
*cdi
, dvd_struct
*s
)
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
)
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
));
1836 static int dvd_read_bca(struct cdrom_device_info
*cdi
, dvd_struct
*s
)
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
)))
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
);
1856 memcpy(s
->bca
.value
, &buf
[4], s
->bca
.len
);
1861 static int dvd_read_manufact(struct cdrom_device_info
*cdi
, dvd_struct
*s
)
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
)
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
))) {
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
);
1890 memcpy(s
->manufact
.value
, &buf
[4], s
->manufact
.len
);
1897 static int dvd_read_struct(struct cdrom_device_info
*cdi
, dvd_struct
*s
)
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
);
1916 cdinfo(CD_WARNING
, ": Invalid DVD structure read requested (%d)\n",
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
;
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;
1968 if ((ret
= cdo
->generic_packet(cdi
, &cgc
)))
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];
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 */
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
;
2049 cdi
->last_sense
= 0;
2051 memset(&cgc
, 0, sizeof(cgc
));
2054 * start with will ra.nframes size, back down if alloc fails
2058 cgc
.buffer
= kmalloc(CD_FRAMESIZE_RAW
* nr
, GFP_KERNEL
);
2068 if (!access_ok(VERIFY_WRITE
, ubuf
, nframes
* CD_FRAMESIZE_RAW
)) {
2073 cgc
.data_direction
= CGC_DATA_READ
;
2074 while (nframes
> 0) {
2078 ret
= cdrom_read_block(cdi
, &cgc
, lba
, nr
, 1, CD_FRAMESIZE_RAW
);
2081 if (__copy_to_user(ubuf
, cgc
.buffer
, CD_FRAMESIZE_RAW
* nr
)) {
2085 ubuf
+= CD_FRAMESIZE_RAW
* nr
;
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
;
2106 rq
= blk_get_request(q
, READ
, GFP_KERNEL
);
2110 cdi
->last_sense
= 0;
2114 if (cdi
->cdda_method
== CDDA_BPC_SINGLE
)
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
);
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;
2138 rq
->flags
|= REQ_BLOCK_PC
;
2139 rq
->timeout
= 60 * HZ
;
2143 blk_queue_bounce(q
, &rq
->bio
);
2145 if (blk_execute_rq(q
, cdi
->disk
, rq
, 0)) {
2146 struct request_sense
*s
= rq
->sense
;
2148 cdi
->last_sense
= s
->sense_key
;
2151 if (blk_rq_unmap_user(bio
, len
))
2162 blk_put_request(rq
);
2166 static int cdrom_read_cdda(struct cdrom_device_info
*cdi
, __u8 __user
*ubuf
,
2167 int lba
, int nframes
)
2171 if (cdi
->cdda_method
== CDDA_OLD
)
2172 return cdrom_read_cdda_old(cdi
, ubuf
, lba
, nframes
);
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
)
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
;
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)
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
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
;
2215 /* Try the generic SCSI command ioctl's first.. */
2216 ret
= scsi_cmd_ioctl(file
, ip
->i_bdev
->bd_disk
, cmd
, (void __user
*)arg
);
2220 /* the first few commands do not deal with audio drive_info, but
2221 only with routines in cdrom device operations. */
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
))
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
)))
2234 ms_info
.addr_format
= CDROM_LBA
;
2235 if ((ret
=cdo
->get_last_session(cdi
, &ms_info
)))
2237 sanitize_format(&ms_info
.addr
, &ms_info
.addr_format
,
2239 IOCTL_OUT(arg
, struct cdrom_multisession
, ms_info
);
2240 cdinfo(CD_DO_IOCTL
, "CDROMMULTISESSION successful\n");
2245 cdinfo(CD_DO_IOCTL
, "entering CDROMEJECT\n");
2246 if (!CDROM_CAN(CDC_OPEN_TRAY
))
2248 if (cdi
->use_count
!= 1 || keeplocked
)
2250 if (CDROM_CAN(CDC_LOCK
))
2251 if ((ret
=cdo
->lock_door(cdi
, 0)))
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
))
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
))
2270 cdi
->options
&= ~(CDO_AUTO_CLOSE
| CDO_AUTO_EJECT
);
2272 cdi
->options
|= CDO_AUTO_CLOSE
| CDO_AUTO_EJECT
;
2276 case CDROM_MEDIA_CHANGED
: {
2277 struct cdrom_changer_info
*info
;
2280 cdinfo(CD_DO_IOCTL
, "entering CDROM_MEDIA_CHANGED\n");
2281 if (!CDROM_CAN(CDC_MEDIA_CHANGED
))
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
)
2291 info
= kmalloc(sizeof(*info
), GFP_KERNEL
);
2295 if ((ret
= cdrom_read_mech_status(cdi
, info
))) {
2300 changed
= info
->slots
[arg
].change
;
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... */
2310 case CDO_USE_FFLAGS
:
2311 case CDO_CHECK_TYPE
:
2314 if (!CDROM_CAN(CDC_LOCK
))
2318 return cdi
->options
;
2319 /* default is basically CDO_[AUTO_CLOSE|AUTO_EJECT] */
2321 if (!CDROM_CAN(arg
))
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
))
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
))
2346 if ((arg
!= CDSL_CURRENT
) && (arg
!= CDSL_NONE
))
2347 if ((int)arg
>= cdi
->capacity
)
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
);
2364 if (!capable(CAP_SYS_ADMIN
))
2366 cdinfo(CD_DO_IOCTL
, "entering CDROM_RESET\n");
2367 if (!CDROM_CAN(CDC_RESET
))
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
2380 if ((cdi
->use_count
!= 1) && !arg
&& !capable(CAP_SYS_ADMIN
))
2382 return cdo
->lock_door(cdi
, arg
);
2386 if (!capable(CAP_SYS_ADMIN
))
2388 cdinfo(CD_DO_IOCTL
, "%sabling debug.\n", arg
? "En" : "Dis");
2389 debug
= arg
? 1 : 0;
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
))
2408 if ((ret
=cdo
->get_mcn(cdi
, &mcn
)))
2410 IOCTL_OUT(arg
, struct cdrom_mcn
, mcn
);
2411 cdinfo(CD_DO_IOCTL
, "CDROM_GET_MCN successful\n");
2415 case CDROM_DRIVE_STATUS
: {
2416 cdinfo(CD_DO_IOCTL
, "entering CDROM_DRIVE_STATUS\n");
2417 if (!(cdo
->capability
& CDC_DRIVE_STATUS
))
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
))
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.
2445 case CDROM_DISC_STATUS
: {
2447 cdinfo(CD_DO_IOCTL
, "entering CDROM_DISC_STATUS\n");
2448 cdrom_count_tracks(cdi
, &tracks
);
2450 return(tracks
.error
);
2452 /* Policy mode on */
2453 if (tracks
.audio
> 0) {
2454 if (tracks
.data
==0 && tracks
.cdi
==0 && tracks
.xa
==0)
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");
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
) {
2485 /* note: most of the cdinfo() calls are commented out here,
2486 because they fill up the sys log when CD players poll
2489 case CDROMSUBCHNL
: {
2490 struct cdrom_subchnl q
;
2491 u_char requested
, back
;
2492 if (!CDROM_CAN(CDC_PLAY_AUDIO
))
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
)))
2500 q
.cdsc_format
= CDROM_MSF
;
2501 if ((ret
=cdo
->audio_ioctl(cdi
, cmd
, &q
)))
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"); */
2510 case CDROMREADTOCHDR
: {
2511 struct cdrom_tochdr header
;
2512 if (!CDROM_CAN(CDC_PLAY_AUDIO
))
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
)))
2518 IOCTL_OUT(arg
, struct cdrom_tochdr
, header
);
2519 /* cdinfo(CD_DO_IOCTL, "CDROMREADTOCHDR successful\n"); */
2522 case CDROMREADTOCENTRY
: {
2523 struct cdrom_tocentry entry
;
2524 u_char requested_format
;
2525 if (!CDROM_CAN(CDC_PLAY_AUDIO
))
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
)))
2533 /* make interface to low-level uniform */
2534 entry
.cdte_format
= CDROM_MSF
;
2535 if ((ret
=cdo
->audio_ioctl(cdi
, cmd
, &entry
)))
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"); */
2543 case CDROMPLAYMSF
: {
2544 struct cdrom_msf msf
;
2545 if (!CDROM_CAN(CDC_PLAY_AUDIO
))
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
: {
2553 if (!CDROM_CAN(CDC_PLAY_AUDIO
))
2555 cdinfo(CD_DO_IOCTL
, "entering CDROMPLAYTRKIND\n");
2556 IOCTL_IN(arg
, struct cdrom_ti
, ti
);
2558 return cdo
->audio_ioctl(cdi
, cmd
, &ti
);
2560 case CDROMVOLCTRL
: {
2561 struct cdrom_volctrl volume
;
2562 if (!CDROM_CAN(CDC_PLAY_AUDIO
))
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
))
2572 cdinfo(CD_DO_IOCTL
, "entering CDROMVOLREAD\n");
2573 if ((ret
=cdo
->audio_ioctl(cdi
, cmd
, &volume
)))
2575 IOCTL_OUT(arg
, struct cdrom_volctrl
, volume
);
2582 if (!CDROM_CAN(CDC_PLAY_AUDIO
))
2584 cdinfo(CD_DO_IOCTL
, "doing audio ioctl (start/stop/pause/resume)\n");
2586 return cdo
->audio_ioctl(cdi
, cmd
, NULL
);
2590 /* do the device specific ioctls */
2591 if (CDROM_CAN(CDC_IOCTLS
))
2592 return cdo
->dev_ioctl(cdi
, cmd
, arg
);
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
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
));
2620 cgc
.cmd
[1] = 1 << 4;
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
,
2635 struct cdrom_device_ops
*cdo
= cdi
->ops
;
2636 struct packet_command cgc
;
2637 struct request_sense sense
;
2638 unsigned char buffer
[32];
2641 memset(&cgc
, 0, sizeof(cgc
));
2643 /* build a unified command and queue it through
2644 cdo->generic_packet() */
2647 case CDROMREADMODE1
:
2648 case CDROMREADMODE2
: {
2649 struct cdrom_msf msf
;
2650 int blocksize
= 0, format
= 0, lba
;
2654 blocksize
= CD_FRAMESIZE_RAW
;
2656 case CDROMREADMODE1
:
2657 blocksize
= CD_FRAMESIZE
;
2660 case CDROMREADMODE2
:
2661 blocksize
= CD_FRAMESIZE_RAW0
;
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!! */
2669 cgc
.buffer
= (char *) kmalloc(blocksize
, GFP_KERNEL
);
2670 if (cgc
.buffer
== NULL
)
2672 memset(&sense
, 0, sizeof(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
))) {
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
))
2695 case CDROMREADAUDIO
: {
2696 struct cdrom_read_audio ra
;
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
,
2705 else if (ra
.addr_format
== CDROM_LBA
)
2710 /* FIXME: we need upper bound checking, too!! */
2711 if (lba
< 0 || ra
.nframes
<= 0 || ra
.nframes
> CD_FRAMES
)
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
)))
2724 q
.cdsc_format
= CDROM_MSF
;
2725 if ((ret
= cdrom_read_subchannel(cdi
, &q
, 0)))
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"); */
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
);
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
;
2774 if ((ret
= cdrom_mode_sense(cdi
, &cgc
, GPMODE_AUDIO_CTL_PAGE
, 0)))
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
))
2786 if (offset
+ 16 > cgc
.buflen
) {
2787 cgc
.buflen
= offset
+16;
2788 ret
= cdrom_mode_sense(cdi
, &cgc
,
2789 GPMODE_AUDIO_CTL_PAGE
, 0);
2795 if ((buffer
[offset
] & 0x3f) != GPMODE_AUDIO_CTL_PAGE
||
2796 buffer
[offset
+1] < 14)
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
);
2810 /* get the volume mask */
2812 if ((ret
= cdrom_mode_sense(cdi
, &cgc
,
2813 GPMODE_AUDIO_CTL_PAGE
, 1)))
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];
2822 cgc
.buffer
= buffer
+ offset
- 8;
2823 memset(cgc
.buffer
, 0, 8);
2824 return cdrom_mode_select(cdi
, &cgc
);
2829 cdinfo(CD_DO_IOCTL
, "entering CDROMSTART/CDROMSTOP\n");
2830 cgc
.cmd
[0] = GPCMD_START_STOP_UNIT
;
2832 cgc
.cmd
[4] = (cmd
== CDROMSTART
) ? 1 : 0;
2833 cgc
.data_direction
= CGC_DATA_NONE
;
2834 return cdo
->generic_packet(cdi
, &cgc
);
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
: {
2848 int size
= sizeof(dvd_struct
);
2849 if (!CDROM_CAN(CDC_DVD
))
2851 if ((s
= (dvd_struct
*) kmalloc(size
, GFP_KERNEL
)) == NULL
)
2853 cdinfo(CD_DO_IOCTL
, "entering DVD_READ_STRUCT\n");
2854 if (copy_from_user(s
, (dvd_struct __user
*)arg
, size
)) {
2858 if ((ret
= dvd_read_struct(cdi
, s
))) {
2862 if (copy_to_user((dvd_struct __user
*)arg
, s
, size
))
2870 if (!CDROM_CAN(CDC_DVD
))
2872 cdinfo(CD_DO_IOCTL
, "entering DVD_AUTH\n");
2873 IOCTL_IN(arg
, dvd_authinfo
, ai
);
2874 if ((ret
= dvd_do_auth (cdi
, &ai
)))
2876 IOCTL_OUT(arg
, dvd_authinfo
, ai
);
2880 case CDROM_NEXT_WRITABLE
: {
2882 cdinfo(CD_DO_IOCTL
, "entering CDROM_NEXT_WRITABLE\n");
2883 if ((ret
= cdrom_get_next_writable(cdi
, &next
)))
2885 IOCTL_OUT(arg
, long, next
);
2888 case CDROM_LAST_WRITTEN
: {
2890 cdinfo(CD_DO_IOCTL
, "entering CDROM_LAST_WRITTEN\n");
2891 if ((ret
= cdrom_get_last_written(cdi
, &last
)))
2893 IOCTL_OUT(arg
, long, last
);
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
;
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;
2916 if ((ret
= cdo
->generic_packet(cdi
, &cgc
)))
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
)))
2929 /* return actual fill size */
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
;
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;
2946 if ((ret
= cdo
->generic_packet(cdi
, &cgc
)))
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
)))
2962 /* return actual fill size */
2966 /* return the last written block on the CD-R media. this is for the udf
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
;
2974 int ret
= -1, ti_size
;
2976 if (!CDROM_CAN(CDC_GENERIC_PACKET
))
2979 ret
= cdrom_get_disc_info(cdi
, &di
);
2980 if (ret
< (int)(offsetof(typeof(di
), last_track_lsb
)
2981 + sizeof(di
.last_track_lsb
)))
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
))
2990 /* if this track is blank, try the previous. */
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
)))
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
);
3007 /* make it up instead */
3008 *last_written
= be32_to_cpu(ti
.track_start
) +
3009 be32_to_cpu(ti
.track_size
);
3011 *last_written
-= (be32_to_cpu(ti
.free_blocks
) + 7);
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. */
3020 toc
.cdte_format
= CDROM_MSF
;
3021 toc
.cdte_track
= CDROM_LEADOUT
;
3022 if ((ret
= cdi
->ops
->audio_ioctl(cdi
, CDROMREADTOCENTRY
, &toc
)))
3024 sanitize_format(&toc
.cdte_addr
, &toc
.cdte_format
, CDROM_LBA
);
3025 *last_written
= toc
.cdte_addr
.lba
;
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
;
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. */
3053 if (last_track
== 1)
3054 goto use_last_written
;
3056 ti_size
= cdrom_get_track_info(cdi
, last_track
, 1, &ti
);
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
);
3069 if ((ret
= cdrom_get_last_written(cdi
, next_writable
))) {
3073 *next_writable
+= 7;
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
)
3108 struct cdrom_device_info
*cdi
;
3109 char *info
= cdrom_sysctl_settings
.info
;
3111 if (!*lenp
|| (*ppos
&& !write
)) {
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
;
3223 cdi
->options
&= ~CDO_LOCK
;
3224 if (check_media_type
)
3225 cdi
->options
|= CDO_CHECK_TYPE
;
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
;
3238 ret
= proc_dointvec(ctl
, write
, filp
, buffer
, lenp
, ppos
);
3240 if (write
&& *valp
!= val
) {
3242 /* we only care for 1 or 0. */
3248 switch (ctl
->ctl_name
) {
3249 case DEV_CDROM_AUTOCLOSE
: {
3250 if (valp
== &cdrom_sysctl_settings
.autoclose
)
3251 autoclose
= cdrom_sysctl_settings
.autoclose
;
3254 case DEV_CDROM_AUTOEJECT
: {
3255 if (valp
== &cdrom_sysctl_settings
.autoeject
)
3256 autoeject
= cdrom_sysctl_settings
.autoeject
;
3259 case DEV_CDROM_DEBUG
: {
3260 if (valp
== &cdrom_sysctl_settings
.debug
)
3261 debug
= cdrom_sysctl_settings
.debug
;
3264 case DEV_CDROM_LOCK
: {
3265 if (valp
== &cdrom_sysctl_settings
.lock
)
3266 lockdoor
= cdrom_sysctl_settings
.lock
;
3269 case DEV_CDROM_CHECK_MEDIA
: {
3270 if (valp
== &cdrom_sysctl_settings
.check
)
3271 check_media_type
= cdrom_sysctl_settings
.check
;
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();
3284 /* Place files in /proc/sys/dev/cdrom */
3285 static ctl_table cdrom_table
[] = {
3287 .ctl_name
= DEV_CDROM_INFO
,
3289 .data
= &cdrom_sysctl_settings
.info
,
3290 .maxlen
= CDROM_STR_SIZE
,
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),
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),
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),
3316 .proc_handler
= &cdrom_sysctl_handler
,
3319 .ctl_name
= DEV_CDROM_LOCK
,
3321 .data
= &cdrom_sysctl_settings
.lock
,
3322 .maxlen
= sizeof(int),
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),
3332 .proc_handler
= &cdrom_sysctl_handler
3337 static ctl_table cdrom_cdrom_table
[] = {
3339 .ctl_name
= DEV_CDROM
,
3340 .procname
= "cdrom",
3343 .child
= cdrom_table
,
3348 /* Make sure that /proc/sys/dev is there */
3349 static ctl_table cdrom_root_table
[] = {
3351 .ctl_name
= CTL_DEV
,
3355 .child
= cdrom_cdrom_table
,
3359 static struct ctl_table_header
*cdrom_sysctl_header
;
3361 static void cdrom_sysctl_register(void)
3363 static int initialized
;
3365 if (initialized
== 1)
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
;
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();
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();
3406 module_init(cdrom_init
);
3407 module_exit(cdrom_exit
);
3408 MODULE_LICENSE("GPL");