blob: 591768c8ba0bfe84340cae945dfd2e8671821c12 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * linux/drivers/ide/ide-cd.c
3 *
4 * Copyright (C) 1994, 1995, 1996 scott snyder <snyder@fnald0.fnal.gov>
5 * Copyright (C) 1996-1998 Erik Andersen <andersee@debian.org>
6 * Copyright (C) 1998-2000 Jens Axboe <axboe@suse.de>
7 *
8 * May be copied or modified under the terms of the GNU General Public
9 * License. See linux/COPYING for more information.
10 *
11 * ATAPI CD-ROM driver. To be used with ide.c.
12 * See Documentation/cdrom/ide-cd for usage information.
13 *
14 * Suggestions are welcome. Patches that work are more welcome though. ;-)
15 * For those wishing to work on this driver, please be sure you download
16 * and comply with the latest Mt. Fuji (SFF8090 version 4) and ATAPI
17 * (SFF-8020i rev 2.6) standards. These documents can be obtained by
18 * anonymous ftp from:
19 * ftp://fission.dt.wdc.com/pub/standards/SFF_atapi/spec/SFF8020-r2.6/PS/8020r26.ps
20 * ftp://ftp.avc-pioneer.com/Mtfuji4/Spec/Fuji4r10.pdf
21 *
22 * Drives that deviate from these standards will be accommodated as much
23 * as possible via compile time or command-line options. Since I only have
24 * a few drives, you generally need to send me patches...
25 *
26 * ----------------------------------
27 * TO DO LIST:
28 * -Make it so that Pioneer CD DR-A24X and friends don't get screwed up on
29 * boot
30 *
31 * ----------------------------------
32 * 1.00 Oct 31, 1994 -- Initial version.
33 * 1.01 Nov 2, 1994 -- Fixed problem with starting request in
34 * cdrom_check_status.
35 * 1.03 Nov 25, 1994 -- leaving unmask_intr[] as a user-setting (as for disks)
36 * (from mlord) -- minor changes to cdrom_setup()
37 * -- renamed ide_dev_s to ide_drive_t, enable irq on command
38 * 2.00 Nov 27, 1994 -- Generalize packet command interface;
39 * add audio ioctls.
40 * 2.01 Dec 3, 1994 -- Rework packet command interface to handle devices
41 * which send an interrupt when ready for a command.
42 * 2.02 Dec 11, 1994 -- Cache the TOC in the driver.
43 * Don't use SCMD_PLAYAUDIO_TI; it's not included
44 * in the current version of ATAPI.
45 * Try to use LBA instead of track or MSF addressing
46 * when possible.
47 * Don't wait for READY_STAT.
48 * 2.03 Jan 10, 1995 -- Rewrite block read routines to handle block sizes
49 * other than 2k and to move multiple sectors in a
50 * single transaction.
51 * 2.04 Apr 21, 1995 -- Add work-around for Creative Labs CD220E drives.
52 * Thanks to Nick Saw <cwsaw@pts7.pts.mot.com> for
53 * help in figuring this out. Ditto for Acer and
54 * Aztech drives, which seem to have the same problem.
55 * 2.04b May 30, 1995 -- Fix to match changes in ide.c version 3.16 -ml
56 * 2.05 Jun 8, 1995 -- Don't attempt to retry after an illegal request
57 * or data protect error.
58 * Use HWIF and DEV_HWIF macros as in ide.c.
59 * Always try to do a request_sense after
60 * a failed command.
61 * Include an option to give textual descriptions
62 * of ATAPI errors.
63 * Fix a bug in handling the sector cache which
64 * showed up if the drive returned data in 512 byte
65 * blocks (like Pioneer drives). Thanks to
66 * Richard Hirst <srh@gpt.co.uk> for diagnosing this.
67 * Properly supply the page number field in the
68 * MODE_SELECT command.
69 * PLAYAUDIO12 is broken on the Aztech; work around it.
70 * 2.05x Aug 11, 1995 -- lots of data structure renaming/restructuring in ide.c
71 * (my apologies to Scott, but now ide-cd.c is independent)
72 * 3.00 Aug 22, 1995 -- Implement CDROMMULTISESSION ioctl.
73 * Implement CDROMREADAUDIO ioctl (UNTESTED).
74 * Use input_ide_data() and output_ide_data().
75 * Add door locking.
76 * Fix usage count leak in cdrom_open, which happened
77 * when a read-write mount was attempted.
78 * Try to load the disk on open.
79 * Implement CDROMEJECT_SW ioctl (off by default).
80 * Read total cdrom capacity during open.
81 * Rearrange logic in cdrom_decode_status. Issue
82 * request sense commands for failed packet commands
83 * from here instead of from cdrom_queue_packet_command.
84 * Fix a race condition in retrieving error information.
85 * Suppress printing normal unit attention errors and
86 * some drive not ready errors.
87 * Implement CDROMVOLREAD ioctl.
88 * Implement CDROMREADMODE1/2 ioctls.
89 * Fix race condition in setting up interrupt handlers
90 * when the `serialize' option is used.
91 * 3.01 Sep 2, 1995 -- Fix ordering of reenabling interrupts in
92 * cdrom_queue_request.
93 * Another try at using ide_[input,output]_data.
94 * 3.02 Sep 16, 1995 -- Stick total disk capacity in partition table as well.
95 * Make VERBOSE_IDE_CD_ERRORS dump failed command again.
96 * Dump out more information for ILLEGAL REQUEST errs.
97 * Fix handling of errors occurring before the
98 * packet command is transferred.
99 * Fix transfers with odd bytelengths.
100 * 3.03 Oct 27, 1995 -- Some Creative drives have an id of just `CD'.
101 * `DCI-2S10' drives are broken too.
102 * 3.04 Nov 20, 1995 -- So are Vertos drives.
103 * 3.05 Dec 1, 1995 -- Changes to go with overhaul of ide.c and ide-tape.c
104 * 3.06 Dec 16, 1995 -- Add support needed for partitions.
105 * More workarounds for Vertos bugs (based on patches
106 * from Holger Dietze <dietze@aix520.informatik.uni-leipzig.de>).
107 * Try to eliminate byteorder assumptions.
108 * Use atapi_cdrom_subchnl struct definition.
109 * Add STANDARD_ATAPI compilation option.
110 * 3.07 Jan 29, 1996 -- More twiddling for broken drives: Sony 55D,
111 * Vertos 300.
112 * Add NO_DOOR_LOCKING configuration option.
113 * Handle drive_cmd requests w/NULL args (for hdparm -t).
114 * Work around sporadic Sony55e audio play problem.
115 * 3.07a Feb 11, 1996 -- check drive->id for NULL before dereferencing, to fix
116 * problem with "hde=cdrom" with no drive present. -ml
117 * 3.08 Mar 6, 1996 -- More Vertos workarounds.
118 * 3.09 Apr 5, 1996 -- Add CDROMCLOSETRAY ioctl.
119 * Switch to using MSF addressing for audio commands.
120 * Reformat to match kernel tabbing style.
121 * Add CDROM_GET_UPC ioctl.
122 * 3.10 Apr 10, 1996 -- Fix compilation error with STANDARD_ATAPI.
Jan Engelhardt96de0e22007-10-19 23:21:04 +0200123 * 3.11 Apr 29, 1996 -- Patch from Heiko Eißfeldt <heiko@colossus.escape.de>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124 * to remove redundant verify_area calls.
125 * 3.12 May 7, 1996 -- Rudimentary changer support. Based on patches
126 * from Gerhard Zuber <zuber@berlin.snafu.de>.
127 * Let open succeed even if there's no loaded disc.
128 * 3.13 May 19, 1996 -- Fixes for changer code.
129 * 3.14 May 29, 1996 -- Add work-around for Vertos 600.
130 * (From Hennus Bergman <hennus@sky.ow.nl>.)
131 * 3.15 July 2, 1996 -- Added support for Sanyo 3 CD changers
Bartlomiej Zolnierkiewiczcc6dbef2008-02-01 23:09:18 +0100132 * from Ben Galliart <bgallia@luc.edu> with
133 * special help from Jeff Lightfoot
Linus Torvalds1da177e2005-04-16 15:20:36 -0700134 * <jeffml@pobox.com>
135 * 3.15a July 9, 1996 -- Improved Sanyo 3 CD changer identification
136 * 3.16 Jul 28, 1996 -- Fix from Gadi to reduce kernel stack usage for ioctl.
137 * 3.17 Sep 17, 1996 -- Tweak audio reads for some drives.
138 * Start changing CDROMLOADFROMSLOT to CDROM_SELECT_DISC.
139 * 3.18 Oct 31, 1996 -- Added module and DMA support.
Bartlomiej Zolnierkiewiczcc6dbef2008-02-01 23:09:18 +0100140 *
Linus Torvalds1da177e2005-04-16 15:20:36 -0700141 * 4.00 Nov 5, 1996 -- New ide-cd maintainer,
142 * Erik B. Andersen <andersee@debian.org>
143 * -- Newer Creative drives don't always set the error
144 * register correctly. Make sure we see media changes
145 * regardless.
146 * -- Integrate with generic cdrom driver.
147 * -- CDROMGETSPINDOWN and CDROMSETSPINDOWN ioctls, based on
148 * a patch from Ciro Cattuto <>.
149 * -- Call set_device_ro.
150 * -- Implement CDROMMECHANISMSTATUS and CDROMSLOTTABLE
151 * ioctls, based on patch by Erik Andersen
152 * -- Add some probes of drive capability during setup.
153 *
154 * 4.01 Nov 11, 1996 -- Split into ide-cd.c and ide-cd.h
Bartlomiej Zolnierkiewiczcc6dbef2008-02-01 23:09:18 +0100155 * -- Removed CDROMMECHANISMSTATUS and CDROMSLOTTABLE
156 * ioctls in favor of a generalized approach
Linus Torvalds1da177e2005-04-16 15:20:36 -0700157 * using the generic cdrom driver.
158 * -- Fully integrated with the 2.1.X kernel.
159 * -- Other stuff that I forgot (lots of changes)
160 *
161 * 4.02 Dec 01, 1996 -- Applied patch from Gadi Oxman <gadio@netvision.net.il>
162 * to fix the drive door locking problems.
163 *
164 * 4.03 Dec 04, 1996 -- Added DSC overlap support.
Bartlomiej Zolnierkiewiczcc6dbef2008-02-01 23:09:18 +0100165 * 4.04 Dec 29, 1996 -- Added CDROMREADRAW ioclt based on patch
Linus Torvalds1da177e2005-04-16 15:20:36 -0700166 * by Ales Makarov (xmakarov@sun.felk.cvut.cz)
167 *
168 * 4.05 Nov 20, 1997 -- Modified to print more drive info on init
169 * Minor other changes
170 * Fix errors on CDROMSTOP (If you have a "Dolphin",
171 * you must define IHAVEADOLPHIN)
172 * Added identifier so new Sanyo CD-changer works
173 * Better detection if door locking isn't supported
174 *
175 * 4.06 Dec 17, 1997 -- fixed endless "tray open" messages -ml
176 * 4.07 Dec 17, 1997 -- fallback to set pc->stat on "tray open"
177 * 4.08 Dec 18, 1997 -- spew less noise when tray is empty
178 * -- fix speed display for ACER 24X, 18X
179 * 4.09 Jan 04, 1998 -- fix handling of the last block so we return
180 * an end of file instead of an I/O error (Gadi)
181 * 4.10 Jan 24, 1998 -- fixed a bug so now changers can change to a new
182 * slot when there is no disc in the current slot.
183 * -- Fixed a memory leak where info->changer_info was
184 * malloc'ed but never free'd when closing the device.
185 * -- Cleaned up the global namespace a bit by making more
186 * functions static that should already have been.
187 * 4.11 Mar 12, 1998 -- Added support for the CDROM_SELECT_SPEED ioctl
Bartlomiej Zolnierkiewiczcc6dbef2008-02-01 23:09:18 +0100188 * based on a patch for 2.0.33 by Jelle Foks
Linus Torvalds1da177e2005-04-16 15:20:36 -0700189 * <jelle@scintilla.utwente.nl>, a patch for 2.0.33
190 * by Toni Giorgino <toni@pcape2.pi.infn.it>, the SCSI
191 * version, and my own efforts. -erik
192 * -- Fixed a stupid bug which egcs was kind enough to
193 * inform me of where "Illegal mode for this track"
194 * was never returned due to a comparison on data
195 * types of limited range.
Bartlomiej Zolnierkiewiczcc6dbef2008-02-01 23:09:18 +0100196 * 4.12 Mar 29, 1998 -- Fixed bug in CDROM_SELECT_SPEED so write speed is
197 * now set ionly for CD-R and CD-RW drives. I had
Linus Torvalds1da177e2005-04-16 15:20:36 -0700198 * removed this support because it produced errors.
199 * It produced errors _only_ for non-writers. duh.
200 * 4.13 May 05, 1998 -- Suppress useless "in progress of becoming ready"
201 * messages, since this is not an error.
202 * -- Change error messages to be const
203 * -- Remove a "\t" which looks ugly in the syslogs
204 * 4.14 July 17, 1998 -- Change to pointing to .ps version of ATAPI spec
205 * since the .pdf version doesn't seem to work...
206 * -- Updated the TODO list to something more current.
207 *
Bartlomiej Zolnierkiewiczcc6dbef2008-02-01 23:09:18 +0100208 * 4.15 Aug 25, 1998 -- Updated ide-cd.h to respect mechine endianess,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700209 * patch thanks to "Eddie C. Dost" <ecd@skynet.be>
210 *
211 * 4.50 Oct 19, 1998 -- New maintainers!
212 * Jens Axboe <axboe@image.dk>
213 * Chris Zwilling <chris@cloudnet.com>
214 *
215 * 4.51 Dec 23, 1998 -- Jens Axboe <axboe@image.dk>
216 * - ide_cdrom_reset enabled since the ide subsystem
217 * handles resets fine now. <axboe@image.dk>
218 * - Transfer size fix for Samsung CD-ROMs, thanks to
219 * "Ville Hallik" <ville.hallik@mail.ee>.
220 * - other minor stuff.
221 *
222 * 4.52 Jan 19, 1999 -- Jens Axboe <axboe@image.dk>
223 * - Detect DVD-ROM/RAM drives
224 *
225 * 4.53 Feb 22, 1999 - Include other model Samsung and one Goldstar
226 * drive in transfer size limit.
227 * - Fix the I/O error when doing eject without a medium
228 * loaded on some drives.
229 * - CDROMREADMODE2 is now implemented through
230 * CDROMREADRAW, since many drives don't support
231 * MODE2 (even though ATAPI 2.6 says they must).
232 * - Added ignore parameter to ide-cd (as a module), eg
233 * insmod ide-cd ignore='hda hdb'
234 * Useful when using ide-cd in conjunction with
235 * ide-scsi. TODO: non-modular way of doing the
236 * same.
237 *
238 * 4.54 Aug 5, 1999 - Support for MMC2 class commands through the generic
239 * packet interface to cdrom.c.
240 * - Unified audio ioctl support, most of it.
241 * - cleaned up various deprecated verify_area().
242 * - Added ide_cdrom_packet() as the interface for
243 * the Uniform generic_packet().
244 * - bunch of other stuff, will fill in logs later.
245 * - report 1 slot for non-changers, like the other
246 * cd-rom drivers. don't report select disc for
247 * non-changers as well.
248 * - mask out audio playing, if the device can't do it.
249 *
250 * 4.55 Sep 1, 1999 - Eliminated the rest of the audio ioctls, except
251 * for CDROMREADTOC[ENTRY|HEADER]. Some of the drivers
252 * use this independently of the actual audio handling.
253 * They will disappear later when I get the time to
254 * do it cleanly.
255 * - Minimize the TOC reading - only do it when we
256 * know a media change has occurred.
257 * - Moved all the CDROMREADx ioctls to the Uniform layer.
Jan Engelhardt96de0e22007-10-19 23:21:04 +0200258 * - Heiko Eißfeldt <heiko@colossus.escape.de> supplied
Linus Torvalds1da177e2005-04-16 15:20:36 -0700259 * some fixes for CDI.
260 * - CD-ROM leaving door locked fix from Andries
261 * Brouwer <Andries.Brouwer@cwi.nl>
262 * - Erik Andersen <andersen@xmission.com> unified
263 * commands across the various drivers and how
264 * sense errors are handled.
265 *
266 * 4.56 Sep 12, 1999 - Removed changer support - it is now in the
267 * Uniform layer.
268 * - Added partition based multisession handling.
269 * - Mode sense and mode select moved to the
270 * Uniform layer.
271 * - Fixed a problem with WPI CDS-32X drive - it
Bartlomiej Zolnierkiewiczcc6dbef2008-02-01 23:09:18 +0100272 * failed the capabilities
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273 *
274 * 4.57 Apr 7, 2000 - Fixed sense reporting.
275 * - Fixed possible oops in ide_cdrom_get_last_session()
276 * - Fix locking mania and make ide_cdrom_reset relock
277 * - Stop spewing errors to log when magicdev polls with
278 * TEST_UNIT_READY on some drives.
279 * - Various fixes from Tobias Ringstrom:
280 * tray if it was locked prior to the reset.
281 * - cdrom_read_capacity returns one frame too little.
282 * - Fix real capacity reporting.
283 *
284 * 4.58 May 1, 2000 - Clean up ACER50 stuff.
285 * - Fix small problem with ide_cdrom_capacity
286 *
287 * 4.59 Aug 11, 2000 - Fix changer problem in cdrom_read_toc, we weren't
288 * correctly sensing a disc change.
289 * - Rearranged some code
290 * - Use extended sense on drives that support it for
291 * correctly reporting tray status -- from
292 * Michael D Johnson <johnsom@orst.edu>
293 * 4.60 Dec 17, 2003 - Add mt rainier support
294 * - Bump timeout for packet commands, matches sr
295 * - Odd stuff
296 * 4.61 Jan 22, 2004 - support hardware sector sizes other than 2kB,
297 * Pascal Schmidt <der.eremit@email.de>
298 *
299 *************************************************************************/
300
301#define IDECD_VERSION "4.61"
302
Linus Torvalds1da177e2005-04-16 15:20:36 -0700303#include <linux/module.h>
304#include <linux/types.h>
305#include <linux/kernel.h>
306#include <linux/delay.h>
307#include <linux/timer.h>
308#include <linux/slab.h>
309#include <linux/interrupt.h>
310#include <linux/errno.h>
311#include <linux/cdrom.h>
312#include <linux/ide.h>
313#include <linux/completion.h>
Arjan van de Vencf8b8972006-03-23 03:00:45 -0800314#include <linux/mutex.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700315
316#include <scsi/scsi.h> /* For SCSI -> ATAPI command conversion */
317
318#include <asm/irq.h>
319#include <asm/io.h>
320#include <asm/byteorder.h>
321#include <asm/uaccess.h>
322#include <asm/unaligned.h>
323
324#include "ide-cd.h"
325
Arjan van de Vencf8b8972006-03-23 03:00:45 -0800326static DEFINE_MUTEX(idecd_ref_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700327
328#define to_ide_cd(obj) container_of(obj, struct cdrom_info, kref)
329
330#define ide_cd_g(disk) \
331 container_of((disk)->private_data, struct cdrom_info, driver)
332
333static struct cdrom_info *ide_cd_get(struct gendisk *disk)
334{
335 struct cdrom_info *cd = NULL;
336
Arjan van de Vencf8b8972006-03-23 03:00:45 -0800337 mutex_lock(&idecd_ref_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700338 cd = ide_cd_g(disk);
339 if (cd)
340 kref_get(&cd->kref);
Arjan van de Vencf8b8972006-03-23 03:00:45 -0800341 mutex_unlock(&idecd_ref_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700342 return cd;
343}
344
345static void ide_cd_release(struct kref *);
346
347static void ide_cd_put(struct cdrom_info *cd)
348{
Arjan van de Vencf8b8972006-03-23 03:00:45 -0800349 mutex_lock(&idecd_ref_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700350 kref_put(&cd->kref, ide_cd_release);
Arjan van de Vencf8b8972006-03-23 03:00:45 -0800351 mutex_unlock(&idecd_ref_mutex);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352}
353
354/****************************************************************************
355 * Generic packet command support and error handling routines.
356 */
357
358/* Mark that we've seen a media change, and invalidate our internal
359 buffers. */
360static void cdrom_saw_media_change (ide_drive_t *drive)
361{
362 struct cdrom_info *info = drive->driver_data;
363
364 CDROM_STATE_FLAGS (drive)->media_changed = 1;
365 CDROM_STATE_FLAGS (drive)->toc_valid = 0;
366 info->nsectors_buffered = 0;
367}
368
369static int cdrom_log_sense(ide_drive_t *drive, struct request *rq,
370 struct request_sense *sense)
371{
372 int log = 0;
373
Jens Axboe4aff5e22006-08-10 08:44:47 +0200374 if (!sense || !rq || (rq->cmd_flags & REQ_QUIET))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700375 return 0;
376
377 switch (sense->sense_key) {
378 case NO_SENSE: case RECOVERED_ERROR:
379 break;
380 case NOT_READY:
381 /*
382 * don't care about tray state messages for
383 * e.g. capacity commands or in-progress or
384 * becoming ready
385 */
386 if (sense->asc == 0x3a || sense->asc == 0x04)
387 break;
388 log = 1;
389 break;
390 case ILLEGAL_REQUEST:
391 /*
392 * don't log START_STOP unit with LoEj set, since
393 * we cannot reliably check if drive can auto-close
394 */
395 if (rq->cmd[0] == GPCMD_START_STOP_UNIT && sense->asc == 0x24)
Alan Coxdbe217a2006-06-25 05:47:44 -0700396 break;
397 log = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700398 break;
399 case UNIT_ATTENTION:
400 /*
401 * Make good and sure we've seen this potential media
402 * change. Some drives (i.e. Creative) fail to present
403 * the correct sense key in the error register.
404 */
405 cdrom_saw_media_change(drive);
406 break;
407 default:
408 log = 1;
409 break;
410 }
411 return log;
412}
413
414static
415void cdrom_analyze_sense_data(ide_drive_t *drive,
416 struct request *failed_command,
417 struct request_sense *sense)
418{
Alan Coxdbe217a2006-06-25 05:47:44 -0700419 unsigned long sector;
420 unsigned long bio_sectors;
421 unsigned long valid;
422 struct cdrom_info *info = drive->driver_data;
423
Linus Torvalds1da177e2005-04-16 15:20:36 -0700424 if (!cdrom_log_sense(drive, failed_command, sense))
425 return;
426
427 /*
428 * If a read toc is executed for a CD-R or CD-RW medium where
429 * the first toc has not been recorded yet, it will fail with
430 * 05/24/00 (which is a confusing error)
431 */
432 if (failed_command && failed_command->cmd[0] == GPCMD_READ_TOC_PMA_ATIP)
433 if (sense->sense_key == 0x05 && sense->asc == 0x24)
434 return;
435
Alan Coxdbe217a2006-06-25 05:47:44 -0700436 if (sense->error_code == 0x70) { /* Current Error */
437 switch(sense->sense_key) {
438 case MEDIUM_ERROR:
439 case VOLUME_OVERFLOW:
440 case ILLEGAL_REQUEST:
441 if (!sense->valid)
442 break;
443 if (failed_command == NULL ||
444 !blk_fs_request(failed_command))
445 break;
446 sector = (sense->information[0] << 24) |
447 (sense->information[1] << 16) |
448 (sense->information[2] << 8) |
449 (sense->information[3]);
450
451 bio_sectors = bio_sectors(failed_command->bio);
452 if (bio_sectors < 4)
453 bio_sectors = 4;
454 if (drive->queue->hardsect_size == 2048)
455 sector <<= 2; /* Device sector size is 2K */
456 sector &= ~(bio_sectors -1);
457 valid = (sector - failed_command->sector) << 9;
458
459 if (valid < 0)
460 valid = 0;
461 if (sector < get_capacity(info->disk) &&
462 drive->probed_capacity - sector < 4 * 75) {
463 set_capacity(info->disk, sector);
464 }
465 }
466 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700467#if VERBOSE_IDE_CD_ERRORS
468 {
469 int i;
Matt Mackall70d1d472005-07-12 13:58:09 -0700470 const char *s = "bad sense key!";
Linus Torvalds1da177e2005-04-16 15:20:36 -0700471 char buf[80];
472
473 printk ("ATAPI device %s:\n", drive->name);
474 if (sense->error_code==0x70)
475 printk(" Error: ");
476 else if (sense->error_code==0x71)
477 printk(" Deferred Error: ");
478 else if (sense->error_code == 0x7f)
479 printk(" Vendor-specific Error: ");
480 else
481 printk(" Unknown Error Type: ");
482
Robert P. J. Day74c8f972007-07-09 23:17:57 +0200483 if (sense->sense_key < ARRAY_SIZE(sense_key_texts))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700484 s = sense_key_texts[sense->sense_key];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700485
486 printk("%s -- (Sense key=0x%02x)\n", s, sense->sense_key);
487
488 if (sense->asc == 0x40) {
489 sprintf(buf, "Diagnostic failure on component 0x%02x",
490 sense->ascq);
491 s = buf;
492 } else {
Robert P. J. Day74c8f972007-07-09 23:17:57 +0200493 int lo = 0, mid, hi = ARRAY_SIZE(sense_data_texts);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494 unsigned long key = (sense->sense_key << 16);
495 key |= (sense->asc << 8);
496 if (!(sense->ascq >= 0x80 && sense->ascq <= 0xdd))
497 key |= sense->ascq;
498 s = NULL;
499
500 while (hi > lo) {
501 mid = (lo + hi) / 2;
502 if (sense_data_texts[mid].asc_ascq == key ||
503 sense_data_texts[mid].asc_ascq == (0xff0000|key)) {
504 s = sense_data_texts[mid].text;
505 break;
506 }
507 else if (sense_data_texts[mid].asc_ascq > key)
508 hi = mid;
509 else
510 lo = mid+1;
511 }
512 }
513
514 if (s == NULL) {
515 if (sense->asc > 0x80)
516 s = "(vendor-specific error)";
517 else
518 s = "(reserved error code)";
519 }
520
521 printk(KERN_ERR " %s -- (asc=0x%02x, ascq=0x%02x)\n",
522 s, sense->asc, sense->ascq);
523
524 if (failed_command != NULL) {
525
Robert P. J. Day74c8f972007-07-09 23:17:57 +0200526 int lo=0, mid, hi= ARRAY_SIZE(packet_command_texts);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527 s = NULL;
528
529 while (hi > lo) {
530 mid = (lo + hi) / 2;
531 if (packet_command_texts[mid].packet_command ==
532 failed_command->cmd[0]) {
533 s = packet_command_texts[mid].text;
534 break;
535 }
536 if (packet_command_texts[mid].packet_command >
537 failed_command->cmd[0])
538 hi = mid;
539 else
540 lo = mid+1;
541 }
542
543 printk (KERN_ERR " The failed \"%s\" packet command was: \n \"", s);
544 for (i=0; i<sizeof (failed_command->cmd); i++)
545 printk ("%02x ", failed_command->cmd[i]);
546 printk ("\"\n");
547 }
548
549 /* The SKSV bit specifies validity of the sense_key_specific
550 * in the next two commands. It is bit 7 of the first byte.
551 * In the case of NOT_READY, if SKSV is set the drive can
552 * give us nice ETA readings.
553 */
554 if (sense->sense_key == NOT_READY && (sense->sks[0] & 0x80)) {
555 int progress = (sense->sks[1] << 8 | sense->sks[2]) * 100;
556 printk(KERN_ERR " Command is %02d%% complete\n", progress / 0xffff);
557
558 }
559
560 if (sense->sense_key == ILLEGAL_REQUEST &&
561 (sense->sks[0] & 0x80) != 0) {
562 printk(KERN_ERR " Error in %s byte %d",
563 (sense->sks[0] & 0x40) != 0 ?
564 "command packet" : "command data",
565 (sense->sks[1] << 8) + sense->sks[2]);
566
567 if ((sense->sks[0] & 0x40) != 0)
568 printk (" bit %d", sense->sks[0] & 0x07);
569
570 printk ("\n");
571 }
572 }
573
574#else /* not VERBOSE_IDE_CD_ERRORS */
575
576 /* Suppress printing unit attention and `in progress of becoming ready'
577 errors when we're not being verbose. */
578
579 if (sense->sense_key == UNIT_ATTENTION ||
580 (sense->sense_key == NOT_READY && (sense->asc == 4 ||
581 sense->asc == 0x3a)))
582 return;
583
584 printk(KERN_ERR "%s: error code: 0x%02x sense_key: 0x%02x asc: 0x%02x ascq: 0x%02x\n",
585 drive->name,
586 sense->error_code, sense->sense_key,
587 sense->asc, sense->ascq);
588#endif /* not VERBOSE_IDE_CD_ERRORS */
589}
590
591/*
592 * Initialize a ide-cd packet command request
593 */
594static void cdrom_prepare_request(ide_drive_t *drive, struct request *rq)
595{
596 struct cdrom_info *cd = drive->driver_data;
597
598 ide_init_drive_cmd(rq);
Jens Axboecea28852006-10-12 15:08:45 +0200599 rq->cmd_type = REQ_TYPE_ATA_PC;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700600 rq->rq_disk = cd->disk;
601}
602
603static void cdrom_queue_request_sense(ide_drive_t *drive, void *sense,
604 struct request *failed_command)
605{
606 struct cdrom_info *info = drive->driver_data;
607 struct request *rq = &info->request_sense_request;
608
609 if (sense == NULL)
610 sense = &info->sense_data;
611
612 /* stuff the sense request in front of our current request */
613 cdrom_prepare_request(drive, rq);
614
615 rq->data = sense;
616 rq->cmd[0] = GPCMD_REQUEST_SENSE;
617 rq->cmd[4] = rq->data_len = 18;
618
Jens Axboe4aff5e22006-08-10 08:44:47 +0200619 rq->cmd_type = REQ_TYPE_SENSE;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700620
621 /* NOTE! Save the failed command in "rq->buffer" */
622 rq->buffer = (void *) failed_command;
623
624 (void) ide_do_drive_cmd(drive, rq, ide_preempt);
625}
626
627static void cdrom_end_request (ide_drive_t *drive, int uptodate)
628{
629 struct request *rq = HWGROUP(drive)->rq;
630 int nsectors = rq->hard_cur_sectors;
631
Jens Axboe4aff5e22006-08-10 08:44:47 +0200632 if (blk_sense_request(rq) && uptodate) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700633 /*
Jens Axboe4aff5e22006-08-10 08:44:47 +0200634 * For REQ_TYPE_SENSE, "rq->buffer" points to the original
635 * failed request
Linus Torvalds1da177e2005-04-16 15:20:36 -0700636 */
637 struct request *failed = (struct request *) rq->buffer;
638 struct cdrom_info *info = drive->driver_data;
639 void *sense = &info->sense_data;
640 unsigned long flags;
641
642 if (failed) {
643 if (failed->sense) {
644 sense = failed->sense;
645 failed->sense_len = rq->sense_len;
646 }
Alan Coxdbe217a2006-06-25 05:47:44 -0700647 cdrom_analyze_sense_data(drive, failed, sense);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700648 /*
649 * now end failed request
650 */
Alan Coxdbe217a2006-06-25 05:47:44 -0700651 if (blk_fs_request(failed)) {
652 if (ide_end_dequeued_request(drive, failed, 0,
653 failed->hard_nr_sectors))
654 BUG();
655 } else {
656 spin_lock_irqsave(&ide_lock, flags);
Kiyoshi Ueda5e36bb62008-01-28 10:34:20 +0100657 if (__blk_end_request(failed, -EIO,
658 failed->data_len))
659 BUG();
Alan Coxdbe217a2006-06-25 05:47:44 -0700660 spin_unlock_irqrestore(&ide_lock, flags);
661 }
662 } else
663 cdrom_analyze_sense_data(drive, NULL, sense);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664 }
665
666 if (!rq->current_nr_sectors && blk_fs_request(rq))
667 uptodate = 1;
668 /* make sure it's fully ended */
669 if (blk_pc_request(rq))
670 nsectors = (rq->data_len + 511) >> 9;
671 if (!nsectors)
672 nsectors = 1;
673
674 ide_end_request(drive, uptodate, nsectors);
675}
676
Alan Coxdbe217a2006-06-25 05:47:44 -0700677static void ide_dump_status_no_sense(ide_drive_t *drive, const char *msg, u8 stat)
678{
679 if (stat & 0x80)
680 return;
681 ide_dump_status(drive, msg, stat);
682}
683
Linus Torvalds1da177e2005-04-16 15:20:36 -0700684/* Returns 0 if the request should be continued.
685 Returns 1 if the request was ended. */
686static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
687{
688 struct request *rq = HWGROUP(drive)->rq;
689 int stat, err, sense_key;
690
691 /* Check for errors. */
692 stat = HWIF(drive)->INB(IDE_STATUS_REG);
693 if (stat_ret)
694 *stat_ret = stat;
695
696 if (OK_STAT(stat, good_stat, BAD_R_STAT))
697 return 0;
698
699 /* Get the IDE error register. */
700 err = HWIF(drive)->INB(IDE_ERROR_REG);
701 sense_key = err >> 4;
702
703 if (rq == NULL) {
704 printk("%s: missing rq in cdrom_decode_status\n", drive->name);
705 return 1;
706 }
707
Jens Axboe4aff5e22006-08-10 08:44:47 +0200708 if (blk_sense_request(rq)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700709 /* We got an error trying to get sense info
710 from the drive (probably while trying
711 to recover from a former error). Just give up. */
712
Jens Axboe4aff5e22006-08-10 08:44:47 +0200713 rq->cmd_flags |= REQ_FAILED;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714 cdrom_end_request(drive, 0);
715 ide_error(drive, "request sense failure", stat);
716 return 1;
717
Jens Axboe8770c012006-10-12 17:24:52 +0200718 } else if (blk_pc_request(rq) || rq->cmd_type == REQ_TYPE_ATA_PC) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700719 /* All other functions, except for READ. */
720 unsigned long flags;
721
722 /*
723 * if we have an error, pass back CHECK_CONDITION as the
724 * scsi status byte
725 */
Jens Axboeb7156732006-11-13 18:05:02 +0100726 if (blk_pc_request(rq) && !rq->errors)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700727 rq->errors = SAM_STAT_CHECK_CONDITION;
728
729 /* Check for tray open. */
730 if (sense_key == NOT_READY) {
731 cdrom_saw_media_change (drive);
732 } else if (sense_key == UNIT_ATTENTION) {
733 /* Check for media change. */
734 cdrom_saw_media_change (drive);
735 /*printk("%s: media changed\n",drive->name);*/
736 return 0;
Stuart Hayes76ca1af2007-04-10 22:38:43 +0200737 } else if ((sense_key == ILLEGAL_REQUEST) &&
738 (rq->cmd[0] == GPCMD_START_STOP_UNIT)) {
739 /*
740 * Don't print error message for this condition--
741 * SFF8090i indicates that 5/24/00 is the correct
742 * response to a request to close the tray if the
743 * drive doesn't have that capability.
744 * cdrom_log_sense() knows this!
745 */
Jens Axboe4aff5e22006-08-10 08:44:47 +0200746 } else if (!(rq->cmd_flags & REQ_QUIET)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700747 /* Otherwise, print an error. */
748 ide_dump_status(drive, "packet command error", stat);
749 }
750
Jens Axboe4aff5e22006-08-10 08:44:47 +0200751 rq->cmd_flags |= REQ_FAILED;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700752
753 /*
754 * instead of playing games with moving completions around,
755 * remove failed request completely and end it when the
756 * request sense has completed
757 */
758 if (stat & ERR_STAT) {
759 spin_lock_irqsave(&ide_lock, flags);
760 blkdev_dequeue_request(rq);
761 HWGROUP(drive)->rq = NULL;
762 spin_unlock_irqrestore(&ide_lock, flags);
763
764 cdrom_queue_request_sense(drive, rq->sense, rq);
765 } else
766 cdrom_end_request(drive, 0);
767
768 } else if (blk_fs_request(rq)) {
769 int do_end_request = 0;
770
771 /* Handle errors from READ and WRITE requests. */
772
773 if (blk_noretry_request(rq))
774 do_end_request = 1;
775
776 if (sense_key == NOT_READY) {
777 /* Tray open. */
778 if (rq_data_dir(rq) == READ) {
779 cdrom_saw_media_change (drive);
780
781 /* Fail the request. */
782 printk ("%s: tray open\n", drive->name);
783 do_end_request = 1;
784 } else {
785 struct cdrom_info *info = drive->driver_data;
786
787 /* allow the drive 5 seconds to recover, some
788 * devices will return this error while flushing
789 * data from cache */
790 if (!rq->errors)
791 info->write_timeout = jiffies + ATAPI_WAIT_WRITE_BUSY;
792 rq->errors = 1;
793 if (time_after(jiffies, info->write_timeout))
794 do_end_request = 1;
795 else {
796 unsigned long flags;
797
798 /*
799 * take a breather relying on the
800 * unplug timer to kick us again
801 */
802 spin_lock_irqsave(&ide_lock, flags);
803 blk_plug_device(drive->queue);
804 spin_unlock_irqrestore(&ide_lock,flags);
805 return 1;
806 }
807 }
808 } else if (sense_key == UNIT_ATTENTION) {
809 /* Media change. */
810 cdrom_saw_media_change (drive);
811
812 /* Arrange to retry the request.
813 But be sure to give up if we've retried
814 too many times. */
815 if (++rq->errors > ERROR_MAX)
816 do_end_request = 1;
817 } else if (sense_key == ILLEGAL_REQUEST ||
818 sense_key == DATA_PROTECT) {
819 /* No point in retrying after an illegal
820 request or data protect error.*/
Alan Coxdbe217a2006-06-25 05:47:44 -0700821 ide_dump_status_no_sense (drive, "command error", stat);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700822 do_end_request = 1;
823 } else if (sense_key == MEDIUM_ERROR) {
824 /* No point in re-trying a zillion times on a bad
825 * sector... If we got here the error is not correctable */
Alan Coxdbe217a2006-06-25 05:47:44 -0700826 ide_dump_status_no_sense (drive, "media error (bad sector)", stat);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700827 do_end_request = 1;
828 } else if (sense_key == BLANK_CHECK) {
829 /* Disk appears blank ?? */
Alan Coxdbe217a2006-06-25 05:47:44 -0700830 ide_dump_status_no_sense (drive, "media error (blank)", stat);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700831 do_end_request = 1;
832 } else if ((err & ~ABRT_ERR) != 0) {
833 /* Go to the default handler
834 for other errors. */
835 ide_error(drive, "cdrom_decode_status", stat);
836 return 1;
837 } else if ((++rq->errors > ERROR_MAX)) {
838 /* We've racked up too many retries. Abort. */
839 do_end_request = 1;
840 }
841
Alan Coxdbe217a2006-06-25 05:47:44 -0700842 /* End a request through request sense analysis when we have
843 sense data. We need this in order to perform end of media
844 processing */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700845
Alan Coxdbe217a2006-06-25 05:47:44 -0700846 if (do_end_request) {
847 if (stat & ERR_STAT) {
848 unsigned long flags;
849 spin_lock_irqsave(&ide_lock, flags);
850 blkdev_dequeue_request(rq);
851 HWGROUP(drive)->rq = NULL;
852 spin_unlock_irqrestore(&ide_lock, flags);
853
854 cdrom_queue_request_sense(drive, rq->sense, rq);
855 } else
856 cdrom_end_request(drive, 0);
857 } else {
858 /* If we got a CHECK_CONDITION status,
859 queue a request sense command. */
860 if (stat & ERR_STAT)
861 cdrom_queue_request_sense(drive, NULL, NULL);
862 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700863 } else {
864 blk_dump_rq_flags(rq, "ide-cd: bad rq");
865 cdrom_end_request(drive, 0);
866 }
867
868 /* Retry, or handle the next request. */
869 return 1;
870}
871
872static int cdrom_timer_expiry(ide_drive_t *drive)
873{
874 struct request *rq = HWGROUP(drive)->rq;
875 unsigned long wait = 0;
876
877 /*
878 * Some commands are *slow* and normally take a long time to
879 * complete. Usually we can use the ATAPI "disconnect" to bypass
880 * this, but not all commands/drives support that. Let
881 * ide_timer_expiry keep polling us for these.
882 */
883 switch (rq->cmd[0]) {
884 case GPCMD_BLANK:
885 case GPCMD_FORMAT_UNIT:
886 case GPCMD_RESERVE_RZONE_TRACK:
887 case GPCMD_CLOSE_TRACK:
888 case GPCMD_FLUSH_CACHE:
889 wait = ATAPI_WAIT_PC;
890 break;
891 default:
Jens Axboe4aff5e22006-08-10 08:44:47 +0200892 if (!(rq->cmd_flags & REQ_QUIET))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700893 printk(KERN_INFO "ide-cd: cmd 0x%x timed out\n", rq->cmd[0]);
894 wait = 0;
895 break;
896 }
897 return wait;
898}
899
900/* Set up the device registers for transferring a packet command on DEV,
901 expecting to later transfer XFERLEN bytes. HANDLER is the routine
902 which actually transfers the command to the drive. If this is a
903 drq_interrupt device, this routine will arrange for HANDLER to be
904 called when the interrupt from the drive arrives. Otherwise, HANDLER
905 will be called immediately after the drive is prepared for the transfer. */
906
907static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive,
908 int xferlen,
909 ide_handler_t *handler)
910{
911 ide_startstop_t startstop;
912 struct cdrom_info *info = drive->driver_data;
913 ide_hwif_t *hwif = drive->hwif;
914
915 /* Wait for the controller to be idle. */
916 if (ide_wait_stat(&startstop, drive, 0, BUSY_STAT, WAIT_READY))
917 return startstop;
918
Bartlomiej Zolnierkiewicz3a6a3542008-01-25 22:17:13 +0100919 /* FIXME: for Virtual DMA we must check harder */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700920 if (info->dma)
921 info->dma = !hwif->dma_setup(drive);
922
923 /* Set up the controller registers. */
Bartlomiej Zolnierkiewicz2fc57382008-01-25 22:17:13 +0100924 ide_pktcmd_tf_load(drive, IDE_TFLAG_OUT_NSECT | IDE_TFLAG_OUT_LBAL |
925 IDE_TFLAG_NO_SELECT_MASK, xferlen, info->dma);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700926
927 if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) {
Albert Leef0dd8712007-02-17 02:40:21 +0100928 /* waiting for CDB interrupt, not DMA yet. */
929 if (info->dma)
930 drive->waiting_for_dma = 0;
931
Linus Torvalds1da177e2005-04-16 15:20:36 -0700932 /* packet command */
933 ide_execute_command(drive, WIN_PACKETCMD, handler, ATAPI_WAIT_PC, cdrom_timer_expiry);
934 return ide_started;
935 } else {
936 unsigned long flags;
937
938 /* packet command */
939 spin_lock_irqsave(&ide_lock, flags);
940 hwif->OUTBSYNC(drive, WIN_PACKETCMD, IDE_COMMAND_REG);
941 ndelay(400);
942 spin_unlock_irqrestore(&ide_lock, flags);
943
944 return (*handler) (drive);
945 }
946}
947
948/* Send a packet command to DRIVE described by CMD_BUF and CMD_LEN.
949 The device registers must have already been prepared
950 by cdrom_start_packet_command.
951 HANDLER is the interrupt handler to call when the command completes
952 or there's data ready. */
953/*
954 * changed 5 parameters to 3 for dvd-ram
955 * struct packet_command *pc; now packet_command_t *pc;
956 */
957#define ATAPI_MIN_CDB_BYTES 12
958static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive,
959 struct request *rq,
960 ide_handler_t *handler)
961{
962 ide_hwif_t *hwif = drive->hwif;
963 int cmd_len;
964 struct cdrom_info *info = drive->driver_data;
965 ide_startstop_t startstop;
966
967 if (CDROM_CONFIG_FLAGS(drive)->drq_interrupt) {
968 /* Here we should have been called after receiving an interrupt
969 from the device. DRQ should how be set. */
970
971 /* Check for errors. */
972 if (cdrom_decode_status(drive, DRQ_STAT, NULL))
973 return ide_stopped;
Albert Leef0dd8712007-02-17 02:40:21 +0100974
975 /* Ok, next interrupt will be DMA interrupt. */
976 if (info->dma)
977 drive->waiting_for_dma = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700978 } else {
979 /* Otherwise, we must wait for DRQ to get set. */
980 if (ide_wait_stat(&startstop, drive, DRQ_STAT,
981 BUSY_STAT, WAIT_READY))
982 return startstop;
983 }
984
985 /* Arm the interrupt handler. */
986 ide_set_handler(drive, handler, rq->timeout, cdrom_timer_expiry);
987
988 /* ATAPI commands get padded out to 12 bytes minimum */
989 cmd_len = COMMAND_SIZE(rq->cmd[0]);
990 if (cmd_len < ATAPI_MIN_CDB_BYTES)
991 cmd_len = ATAPI_MIN_CDB_BYTES;
992
993 /* Send the command to the device. */
994 HWIF(drive)->atapi_output_bytes(drive, rq->cmd, cmd_len);
995
996 /* Start the DMA if need be */
997 if (info->dma)
998 hwif->dma_start(drive);
999
1000 return ide_started;
1001}
1002
1003/****************************************************************************
1004 * Block read functions.
1005 */
1006
Bartlomiej Zolnierkiewicz68661c52008-02-01 23:09:17 +01001007typedef void (xfer_func_t)(ide_drive_t *, void *, u32);
1008
Bartlomiej Zolnierkiewicz5a5222d2008-02-01 23:09:17 +01001009static void ide_cd_pad_transfer(ide_drive_t *drive, xfer_func_t *xf, int len)
1010{
1011 while (len > 0) {
1012 int dum = 0;
1013 xf(drive, &dum, sizeof(dum));
1014 len -= sizeof(dum);
1015 }
1016}
1017
Linus Torvalds1da177e2005-04-16 15:20:36 -07001018/*
1019 * Buffer up to SECTORS_TO_TRANSFER sectors from the drive in our sector
1020 * buffer. Once the first sector is added, any subsequent sectors are
1021 * assumed to be continuous (until the buffer is cleared). For the first
1022 * sector added, SECTOR is its sector number. (SECTOR is then ignored until
1023 * the buffer is cleared.)
1024 */
1025static void cdrom_buffer_sectors (ide_drive_t *drive, unsigned long sector,
1026 int sectors_to_transfer)
1027{
1028 struct cdrom_info *info = drive->driver_data;
1029
1030 /* Number of sectors to read into the buffer. */
1031 int sectors_to_buffer = min_t(int, sectors_to_transfer,
1032 (SECTOR_BUFFER_SIZE >> SECTOR_BITS) -
1033 info->nsectors_buffered);
1034
1035 char *dest;
1036
1037 /* If we couldn't get a buffer, don't try to buffer anything... */
1038 if (info->buffer == NULL)
1039 sectors_to_buffer = 0;
1040
1041 /* If this is the first sector in the buffer, remember its number. */
1042 if (info->nsectors_buffered == 0)
1043 info->sector_buffered = sector;
1044
1045 /* Read the data into the buffer. */
1046 dest = info->buffer + info->nsectors_buffered * SECTOR_SIZE;
1047 while (sectors_to_buffer > 0) {
1048 HWIF(drive)->atapi_input_bytes(drive, dest, SECTOR_SIZE);
1049 --sectors_to_buffer;
1050 --sectors_to_transfer;
1051 ++info->nsectors_buffered;
1052 dest += SECTOR_SIZE;
1053 }
1054
1055 /* Throw away any remaining data. */
1056 while (sectors_to_transfer > 0) {
1057 static char dum[SECTOR_SIZE];
1058 HWIF(drive)->atapi_input_bytes(drive, dum, sizeof (dum));
1059 --sectors_to_transfer;
1060 }
1061}
1062
1063/*
1064 * Check the contents of the interrupt reason register from the cdrom
1065 * and attempt to recover if there are problems. Returns 0 if everything's
1066 * ok; nonzero if the request has been terminated.
1067 */
Arjan van de Ven858119e2006-01-14 13:20:43 -08001068static
Linus Torvalds1da177e2005-04-16 15:20:36 -07001069int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason)
1070{
1071 if (ireason == 2)
1072 return 0;
1073 else if (ireason == 0) {
Bartlomiej Zolnierkiewicz5a5222d2008-02-01 23:09:17 +01001074 ide_hwif_t *hwif = drive->hwif;
1075
Linus Torvalds1da177e2005-04-16 15:20:36 -07001076 /* Whoops... The drive is expecting to receive data from us! */
Bartlomiej Zolnierkiewicz35379c02007-12-24 15:23:43 +01001077 printk(KERN_ERR "%s: %s: wrong transfer direction!\n",
1078 drive->name, __FUNCTION__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001079
1080 /* Throw some data at the drive so it doesn't hang
1081 and quit this request. */
Bartlomiej Zolnierkiewicz5a5222d2008-02-01 23:09:17 +01001082 ide_cd_pad_transfer(drive, hwif->atapi_output_bytes, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001083 } else if (ireason == 1) {
1084 /* Some drives (ASUS) seem to tell us that status
1085 * info is available. just get it and ignore.
1086 */
1087 (void) HWIF(drive)->INB(IDE_STATUS_REG);
1088 return 0;
1089 } else {
1090 /* Drive wants a command packet, or invalid ireason... */
Bartlomiej Zolnierkiewicz35379c02007-12-24 15:23:43 +01001091 printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n",
1092 drive->name, __FUNCTION__, ireason);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001093 }
1094
1095 cdrom_end_request(drive, 0);
1096 return -1;
1097}
1098
1099/*
1100 * Interrupt routine. Called when a read request has completed.
1101 */
1102static ide_startstop_t cdrom_read_intr (ide_drive_t *drive)
1103{
1104 int stat;
1105 int ireason, len, sectors_to_transfer, nskip;
1106 struct cdrom_info *info = drive->driver_data;
1107 u8 lowcyl = 0, highcyl = 0;
1108 int dma = info->dma, dma_error = 0;
1109
1110 struct request *rq = HWGROUP(drive)->rq;
1111
1112 /*
1113 * handle dma case
1114 */
1115 if (dma) {
1116 info->dma = 0;
Bartlomiej Zolnierkiewicz52ef2ed2007-12-24 15:23:43 +01001117 dma_error = HWIF(drive)->ide_dma_end(drive);
1118 if (dma_error) {
1119 printk(KERN_ERR "%s: DMA read error\n", drive->name);
Bartlomiej Zolnierkiewicz7469aaf2007-02-17 02:40:26 +01001120 ide_dma_off(drive);
Bartlomiej Zolnierkiewicz52ef2ed2007-12-24 15:23:43 +01001121 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001122 }
1123
1124 if (cdrom_decode_status(drive, 0, &stat))
1125 return ide_stopped;
1126
1127 if (dma) {
1128 if (!dma_error) {
1129 ide_end_request(drive, 1, rq->nr_sectors);
1130 return ide_stopped;
1131 } else
1132 return ide_error(drive, "dma error", stat);
1133 }
1134
1135 /* Read the interrupt reason and the transfer length. */
1136 ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3;
1137 lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1138 highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1139
1140 len = lowcyl + (256 * highcyl);
1141
1142 /* If DRQ is clear, the command has completed. */
1143 if ((stat & DRQ_STAT) == 0) {
1144 /* If we're not done filling the current buffer, complain.
1145 Otherwise, complete the command normally. */
1146 if (rq->current_nr_sectors > 0) {
1147 printk (KERN_ERR "%s: cdrom_read_intr: data underrun (%d blocks)\n",
1148 drive->name, rq->current_nr_sectors);
Jens Axboe4aff5e22006-08-10 08:44:47 +02001149 rq->cmd_flags |= REQ_FAILED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001150 cdrom_end_request(drive, 0);
1151 } else
1152 cdrom_end_request(drive, 1);
1153 return ide_stopped;
1154 }
1155
1156 /* Check that the drive is expecting to do the same thing we are. */
1157 if (cdrom_read_check_ireason (drive, len, ireason))
1158 return ide_stopped;
1159
1160 /* Assume that the drive will always provide data in multiples
1161 of at least SECTOR_SIZE, as it gets hairy to keep track
1162 of the transfers otherwise. */
1163 if ((len % SECTOR_SIZE) != 0) {
1164 printk (KERN_ERR "%s: cdrom_read_intr: Bad transfer size %d\n",
1165 drive->name, len);
1166 if (CDROM_CONFIG_FLAGS(drive)->limit_nframes)
1167 printk (KERN_ERR " This drive is not supported by this version of the driver\n");
1168 else {
1169 printk (KERN_ERR " Trying to limit transfer sizes\n");
1170 CDROM_CONFIG_FLAGS(drive)->limit_nframes = 1;
1171 }
1172 cdrom_end_request(drive, 0);
1173 return ide_stopped;
1174 }
1175
1176 /* The number of sectors we need to read from the drive. */
1177 sectors_to_transfer = len / SECTOR_SIZE;
1178
1179 /* First, figure out if we need to bit-bucket
1180 any of the leading sectors. */
1181 nskip = min_t(int, rq->current_nr_sectors - bio_cur_sectors(rq->bio), sectors_to_transfer);
1182
1183 while (nskip > 0) {
1184 /* We need to throw away a sector. */
1185 static char dum[SECTOR_SIZE];
1186 HWIF(drive)->atapi_input_bytes(drive, dum, sizeof (dum));
1187
1188 --rq->current_nr_sectors;
1189 --nskip;
1190 --sectors_to_transfer;
1191 }
1192
1193 /* Now loop while we still have data to read from the drive. */
1194 while (sectors_to_transfer > 0) {
1195 int this_transfer;
1196
1197 /* If we've filled the present buffer but there's another
1198 chained buffer after it, move on. */
1199 if (rq->current_nr_sectors == 0 && rq->nr_sectors)
1200 cdrom_end_request(drive, 1);
1201
1202 /* If the buffers are full, cache the rest of the data in our
1203 internal buffer. */
1204 if (rq->current_nr_sectors == 0) {
1205 cdrom_buffer_sectors(drive, rq->sector, sectors_to_transfer);
1206 sectors_to_transfer = 0;
1207 } else {
1208 /* Transfer data to the buffers.
1209 Figure out how many sectors we can transfer
1210 to the current buffer. */
1211 this_transfer = min_t(int, sectors_to_transfer,
1212 rq->current_nr_sectors);
1213
1214 /* Read this_transfer sectors
1215 into the current buffer. */
1216 while (this_transfer > 0) {
1217 HWIF(drive)->atapi_input_bytes(drive, rq->buffer, SECTOR_SIZE);
1218 rq->buffer += SECTOR_SIZE;
1219 --rq->nr_sectors;
1220 --rq->current_nr_sectors;
1221 ++rq->sector;
1222 --this_transfer;
1223 --sectors_to_transfer;
1224 }
1225 }
1226 }
1227
1228 /* Done moving data! Wait for another interrupt. */
1229 ide_set_handler(drive, &cdrom_read_intr, ATAPI_WAIT_PC, NULL);
1230 return ide_started;
1231}
1232
1233/*
1234 * Try to satisfy some of the current read request from our cached data.
1235 * Returns nonzero if the request has been completed, zero otherwise.
1236 */
1237static int cdrom_read_from_buffer (ide_drive_t *drive)
1238{
1239 struct cdrom_info *info = drive->driver_data;
1240 struct request *rq = HWGROUP(drive)->rq;
1241 unsigned short sectors_per_frame;
1242
1243 sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS;
1244
1245 /* Can't do anything if there's no buffer. */
1246 if (info->buffer == NULL) return 0;
1247
1248 /* Loop while this request needs data and the next block is present
1249 in our cache. */
1250 while (rq->nr_sectors > 0 &&
1251 rq->sector >= info->sector_buffered &&
1252 rq->sector < info->sector_buffered + info->nsectors_buffered) {
1253 if (rq->current_nr_sectors == 0)
1254 cdrom_end_request(drive, 1);
1255
1256 memcpy (rq->buffer,
1257 info->buffer +
1258 (rq->sector - info->sector_buffered) * SECTOR_SIZE,
1259 SECTOR_SIZE);
1260 rq->buffer += SECTOR_SIZE;
1261 --rq->current_nr_sectors;
1262 --rq->nr_sectors;
1263 ++rq->sector;
1264 }
1265
1266 /* If we've satisfied the current request,
1267 terminate it successfully. */
1268 if (rq->nr_sectors == 0) {
1269 cdrom_end_request(drive, 1);
1270 return -1;
1271 }
1272
1273 /* Move on to the next buffer if needed. */
1274 if (rq->current_nr_sectors == 0)
1275 cdrom_end_request(drive, 1);
1276
1277 /* If this condition does not hold, then the kluge i use to
1278 represent the number of sectors to skip at the start of a transfer
1279 will fail. I think that this will never happen, but let's be
1280 paranoid and check. */
1281 if (rq->current_nr_sectors < bio_cur_sectors(rq->bio) &&
1282 (rq->sector & (sectors_per_frame - 1))) {
1283 printk(KERN_ERR "%s: cdrom_read_from_buffer: buffer botch (%ld)\n",
1284 drive->name, (long)rq->sector);
1285 cdrom_end_request(drive, 0);
1286 return -1;
1287 }
1288
1289 return 0;
1290}
1291
1292/*
1293 * Routine to send a read packet command to the drive.
1294 * This is usually called directly from cdrom_start_read.
1295 * However, for drq_interrupt devices, it is called from an interrupt
1296 * when the drive is ready to accept the command.
1297 */
1298static ide_startstop_t cdrom_start_read_continuation (ide_drive_t *drive)
1299{
1300 struct request *rq = HWGROUP(drive)->rq;
1301 unsigned short sectors_per_frame;
1302 int nskip;
1303
1304 sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS;
1305
1306 /* If the requested sector doesn't start on a cdrom block boundary,
1307 we must adjust the start of the transfer so that it does,
1308 and remember to skip the first few sectors.
1309 If the CURRENT_NR_SECTORS field is larger than the size
1310 of the buffer, it will mean that we're to skip a number
1311 of sectors equal to the amount by which CURRENT_NR_SECTORS
1312 is larger than the buffer size. */
1313 nskip = rq->sector & (sectors_per_frame - 1);
1314 if (nskip > 0) {
1315 /* Sanity check... */
1316 if (rq->current_nr_sectors != bio_cur_sectors(rq->bio) &&
1317 (rq->sector & (sectors_per_frame - 1))) {
1318 printk(KERN_ERR "%s: cdrom_start_read_continuation: buffer botch (%u)\n",
1319 drive->name, rq->current_nr_sectors);
1320 cdrom_end_request(drive, 0);
1321 return ide_stopped;
1322 }
1323 rq->current_nr_sectors += nskip;
1324 }
1325
1326 /* Set up the command */
1327 rq->timeout = ATAPI_WAIT_PC;
1328
1329 /* Send the command to the drive and return. */
1330 return cdrom_transfer_packet_command(drive, rq, &cdrom_read_intr);
1331}
1332
1333
1334#define IDECD_SEEK_THRESHOLD (1000) /* 1000 blocks */
1335#define IDECD_SEEK_TIMER (5 * WAIT_MIN_SLEEP) /* 100 ms */
1336#define IDECD_SEEK_TIMEOUT (2 * WAIT_CMD) /* 20 sec */
1337
1338static ide_startstop_t cdrom_seek_intr (ide_drive_t *drive)
1339{
1340 struct cdrom_info *info = drive->driver_data;
1341 int stat;
1342 static int retry = 10;
1343
1344 if (cdrom_decode_status(drive, 0, &stat))
1345 return ide_stopped;
1346 CDROM_CONFIG_FLAGS(drive)->seeking = 1;
1347
1348 if (retry && time_after(jiffies, info->start_seek + IDECD_SEEK_TIMER)) {
1349 if (--retry == 0) {
1350 /*
1351 * this condition is far too common, to bother
1352 * users about it
1353 */
1354 /* printk("%s: disabled DSC seek overlap\n", drive->name);*/
1355 drive->dsc_overlap = 0;
1356 }
1357 }
1358 return ide_stopped;
1359}
1360
1361static ide_startstop_t cdrom_start_seek_continuation (ide_drive_t *drive)
1362{
1363 struct request *rq = HWGROUP(drive)->rq;
1364 sector_t frame = rq->sector;
1365
1366 sector_div(frame, queue_hardsect_size(drive->queue) >> SECTOR_BITS);
1367
1368 memset(rq->cmd, 0, sizeof(rq->cmd));
1369 rq->cmd[0] = GPCMD_SEEK;
1370 put_unaligned(cpu_to_be32(frame), (unsigned int *) &rq->cmd[2]);
1371
1372 rq->timeout = ATAPI_WAIT_PC;
1373 return cdrom_transfer_packet_command(drive, rq, &cdrom_seek_intr);
1374}
1375
1376static ide_startstop_t cdrom_start_seek (ide_drive_t *drive, unsigned int block)
1377{
1378 struct cdrom_info *info = drive->driver_data;
1379
1380 info->dma = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001381 info->start_seek = jiffies;
1382 return cdrom_start_packet_command(drive, 0, cdrom_start_seek_continuation);
1383}
1384
1385/* Fix up a possibly partially-processed request so that we can
1386 start it over entirely, or even put it back on the request queue. */
1387static void restore_request (struct request *rq)
1388{
1389 if (rq->buffer != bio_data(rq->bio)) {
1390 sector_t n = (rq->buffer - (char *) bio_data(rq->bio)) / SECTOR_SIZE;
1391
1392 rq->buffer = bio_data(rq->bio);
1393 rq->nr_sectors += n;
1394 rq->sector -= n;
1395 }
1396 rq->hard_cur_sectors = rq->current_nr_sectors = bio_cur_sectors(rq->bio);
1397 rq->hard_nr_sectors = rq->nr_sectors;
1398 rq->hard_sector = rq->sector;
1399 rq->q->prep_rq_fn(rq->q, rq);
1400}
1401
1402/*
1403 * Start a read request from the CD-ROM.
1404 */
1405static ide_startstop_t cdrom_start_read (ide_drive_t *drive, unsigned int block)
1406{
1407 struct cdrom_info *info = drive->driver_data;
1408 struct request *rq = HWGROUP(drive)->rq;
1409 unsigned short sectors_per_frame;
1410
1411 sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS;
1412
1413 /* We may be retrying this request after an error. Fix up
1414 any weirdness which might be present in the request packet. */
1415 restore_request(rq);
1416
1417 /* Satisfy whatever we can of this request from our cached sector. */
1418 if (cdrom_read_from_buffer(drive))
1419 return ide_stopped;
1420
Linus Torvalds1da177e2005-04-16 15:20:36 -07001421 /* Clear the local sector buffer. */
1422 info->nsectors_buffered = 0;
1423
1424 /* use dma, if possible. */
1425 info->dma = drive->using_dma;
1426 if ((rq->sector & (sectors_per_frame - 1)) ||
1427 (rq->nr_sectors & (sectors_per_frame - 1)))
1428 info->dma = 0;
1429
Linus Torvalds1da177e2005-04-16 15:20:36 -07001430 /* Start sending the read request to the drive. */
1431 return cdrom_start_packet_command(drive, 32768, cdrom_start_read_continuation);
1432}
1433
1434/****************************************************************************
1435 * Execute all other packet commands.
1436 */
1437
1438/* Interrupt routine for packet command completion. */
1439static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive)
1440{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001441 struct request *rq = HWGROUP(drive)->rq;
Bartlomiej Zolnierkiewicz68661c52008-02-01 23:09:17 +01001442 xfer_func_t *xferfunc = NULL;
1443 int stat, ireason, len, thislen, write;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001444 u8 lowcyl = 0, highcyl = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001445
1446 /* Check for errors. */
1447 if (cdrom_decode_status(drive, 0, &stat))
1448 return ide_stopped;
1449
1450 /* Read the interrupt reason and the transfer length. */
Bartlomiej Zolnierkiewicz8606ab02007-12-24 15:23:44 +01001451 ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001452 lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1453 highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1454
1455 len = lowcyl + (256 * highcyl);
1456
1457 /* If DRQ is clear, the command has completed.
1458 Complain if we still have data left to transfer. */
1459 if ((stat & DRQ_STAT) == 0) {
1460 /* Some of the trailing request sense fields are optional, and
1461 some drives don't send them. Sigh. */
1462 if (rq->cmd[0] == GPCMD_REQUEST_SENSE &&
1463 rq->data_len > 0 &&
1464 rq->data_len <= 5) {
1465 while (rq->data_len > 0) {
1466 *(unsigned char *)rq->data++ = 0;
1467 --rq->data_len;
1468 }
1469 }
1470
1471 if (rq->data_len == 0)
1472 cdrom_end_request(drive, 1);
1473 else {
1474 /* Comment this out, because this always happens
1475 right after a reset occurs, and it is annoying to
1476 always print expected stuff. */
1477 /*
1478 printk ("%s: cdrom_pc_intr: data underrun %d\n",
1479 drive->name, pc->buflen);
1480 */
Jens Axboe4aff5e22006-08-10 08:44:47 +02001481 rq->cmd_flags |= REQ_FAILED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001482 cdrom_end_request(drive, 0);
1483 }
1484 return ide_stopped;
1485 }
1486
1487 /* Figure out how much data to transfer. */
1488 thislen = rq->data_len;
Bartlomiej Zolnierkiewicz68661c52008-02-01 23:09:17 +01001489 if (thislen > len)
1490 thislen = len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001491
Bartlomiej Zolnierkiewicz8606ab02007-12-24 15:23:44 +01001492 if (ireason == 0) {
Bartlomiej Zolnierkiewicz68661c52008-02-01 23:09:17 +01001493 write = 1;
1494 xferfunc = HWIF(drive)->atapi_output_bytes;
1495 } else if (ireason == 2) {
1496 write = 0;
1497 xferfunc = HWIF(drive)->atapi_input_bytes;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001498 }
1499
Bartlomiej Zolnierkiewicz68661c52008-02-01 23:09:17 +01001500 if (xferfunc) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001501 if (!rq->data) {
Bartlomiej Zolnierkiewiczf1071e62008-02-01 23:09:17 +01001502 printk(KERN_ERR "%s: confused, missing data\n",
1503 drive->name);
Bartlomiej Zolnierkiewicz68661c52008-02-01 23:09:17 +01001504 blk_dump_rq_flags(rq, write ? "cdrom_pc_intr, write"
1505 : "cdrom_pc_intr, read");
Bartlomiej Zolnierkiewiczf1071e62008-02-01 23:09:17 +01001506 goto pad;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001507 }
1508 /* Transfer the data. */
Bartlomiej Zolnierkiewicz68661c52008-02-01 23:09:17 +01001509 xferfunc(drive, rq->data, thislen);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001510
Linus Torvalds1da177e2005-04-16 15:20:36 -07001511 /* Keep count of how much data we've moved. */
Bartlomiej Zolnierkiewicz5a5222d2008-02-01 23:09:17 +01001512 len -= thislen;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001513 rq->data += thislen;
1514 rq->data_len -= thislen;
1515
Bartlomiej Zolnierkiewicz68661c52008-02-01 23:09:17 +01001516 if (write && blk_sense_request(rq))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001517 rq->sense_len += thislen;
1518 } else {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001519 printk (KERN_ERR "%s: cdrom_pc_intr: The drive "
Rachita Kothiyal1ad55442006-06-23 02:02:56 -07001520 "appears confused (ireason = 0x%02x). "
1521 "Trying to recover by ending request.\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07001522 drive->name, ireason);
Jens Axboe4aff5e22006-08-10 08:44:47 +02001523 rq->cmd_flags |= REQ_FAILED;
Rachita Kothiyal1ad55442006-06-23 02:02:56 -07001524 cdrom_end_request(drive, 0);
1525 return ide_stopped;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001526 }
Bartlomiej Zolnierkiewiczf1071e62008-02-01 23:09:17 +01001527pad:
Bartlomiej Zolnierkiewicz5a5222d2008-02-01 23:09:17 +01001528 /*
1529 * If we haven't moved enough data to satisfy the drive,
1530 * add some padding.
1531 */
1532 if (len > 0)
1533 ide_cd_pad_transfer(drive, xferfunc, len);
1534
Linus Torvalds1da177e2005-04-16 15:20:36 -07001535 /* Now we wait for another interrupt. */
1536 ide_set_handler(drive, &cdrom_pc_intr, ATAPI_WAIT_PC, cdrom_timer_expiry);
1537 return ide_started;
1538}
1539
1540static ide_startstop_t cdrom_do_pc_continuation (ide_drive_t *drive)
1541{
1542 struct request *rq = HWGROUP(drive)->rq;
1543
1544 if (!rq->timeout)
1545 rq->timeout = ATAPI_WAIT_PC;
1546
1547 /* Send the command to the drive and return. */
1548 return cdrom_transfer_packet_command(drive, rq, &cdrom_pc_intr);
1549}
1550
1551
1552static ide_startstop_t cdrom_do_packet_command (ide_drive_t *drive)
1553{
1554 int len;
1555 struct request *rq = HWGROUP(drive)->rq;
1556 struct cdrom_info *info = drive->driver_data;
1557
1558 info->dma = 0;
Jens Axboe4aff5e22006-08-10 08:44:47 +02001559 rq->cmd_flags &= ~REQ_FAILED;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001560 len = rq->data_len;
1561
1562 /* Start sending the command to the drive. */
1563 return cdrom_start_packet_command(drive, len, cdrom_do_pc_continuation);
1564}
1565
1566
Alan Coxdbe217a2006-06-25 05:47:44 -07001567static int cdrom_queue_packet_command(ide_drive_t *drive, struct request *rq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001568{
1569 struct request_sense sense;
1570 int retries = 10;
Jens Axboe4aff5e22006-08-10 08:44:47 +02001571 unsigned int flags = rq->cmd_flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001572
1573 if (rq->sense == NULL)
1574 rq->sense = &sense;
1575
1576 /* Start of retry loop. */
1577 do {
1578 int error;
1579 unsigned long time = jiffies;
Jens Axboe4aff5e22006-08-10 08:44:47 +02001580 rq->cmd_flags = flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001581
1582 error = ide_do_drive_cmd(drive, rq, ide_wait);
1583 time = jiffies - time;
1584
1585 /* FIXME: we should probably abort/retry or something
1586 * in case of failure */
Jens Axboe4aff5e22006-08-10 08:44:47 +02001587 if (rq->cmd_flags & REQ_FAILED) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001588 /* The request failed. Retry if it was due to a unit
1589 attention status
1590 (usually means media was changed). */
1591 struct request_sense *reqbuf = rq->sense;
1592
1593 if (reqbuf->sense_key == UNIT_ATTENTION)
1594 cdrom_saw_media_change(drive);
1595 else if (reqbuf->sense_key == NOT_READY &&
1596 reqbuf->asc == 4 && reqbuf->ascq != 4) {
1597 /* The drive is in the process of loading
1598 a disk. Retry, but wait a little to give
1599 the drive time to complete the load. */
1600 ssleep(2);
1601 } else {
1602 /* Otherwise, don't retry. */
1603 retries = 0;
1604 }
1605 --retries;
1606 }
1607
1608 /* End of retry loop. */
Jens Axboe4aff5e22006-08-10 08:44:47 +02001609 } while ((rq->cmd_flags & REQ_FAILED) && retries >= 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001610
1611 /* Return an error if the command failed. */
Jens Axboe4aff5e22006-08-10 08:44:47 +02001612 return (rq->cmd_flags & REQ_FAILED) ? -EIO : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001613}
1614
1615/*
1616 * Write handling
1617 */
Arjan van de Ven858119e2006-01-14 13:20:43 -08001618static int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001619{
1620 /* Two notes about IDE interrupt reason here - 0 means that
1621 * the drive wants to receive data from us, 2 means that
1622 * the drive is expecting to transfer data to us.
1623 */
1624 if (ireason == 0)
1625 return 0;
1626 else if (ireason == 2) {
Bartlomiej Zolnierkiewicz5a5222d2008-02-01 23:09:17 +01001627 ide_hwif_t *hwif = drive->hwif;
1628
Linus Torvalds1da177e2005-04-16 15:20:36 -07001629 /* Whoops... The drive wants to send data. */
Bartlomiej Zolnierkiewicz35379c02007-12-24 15:23:43 +01001630 printk(KERN_ERR "%s: %s: wrong transfer direction!\n",
1631 drive->name, __FUNCTION__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001632
Bartlomiej Zolnierkiewicz5a5222d2008-02-01 23:09:17 +01001633 ide_cd_pad_transfer(drive, hwif->atapi_input_bytes, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001634 } else {
1635 /* Drive wants a command packet, or invalid ireason... */
Bartlomiej Zolnierkiewicz35379c02007-12-24 15:23:43 +01001636 printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n",
1637 drive->name, __FUNCTION__, ireason);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001638 }
1639
1640 cdrom_end_request(drive, 0);
1641 return 1;
1642}
1643
Kiyoshi Uedaaaa04c22007-12-11 17:51:23 -05001644/*
1645 * Called from blk_end_request_callback() after the data of the request
1646 * is completed and before the request is completed.
1647 * By returning value '1', blk_end_request_callback() returns immediately
1648 * without completing the request.
1649 */
1650static int cdrom_newpc_intr_dummy_cb(struct request *rq)
1651{
1652 return 1;
1653}
1654
Linus Torvalds1da177e2005-04-16 15:20:36 -07001655/*
1656 * best way to deal with dma that is not sector aligned right now... note
1657 * that in this path we are not using ->data or ->buffer at all. this irs
1658 * can replace cdrom_pc_intr, cdrom_read_intr, and cdrom_write_intr in the
1659 * future.
1660 */
1661static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
1662{
1663 struct cdrom_info *info = drive->driver_data;
1664 struct request *rq = HWGROUP(drive)->rq;
1665 int dma_error, dma, stat, ireason, len, thislen;
1666 u8 lowcyl, highcyl;
1667 xfer_func_t *xferfunc;
1668 unsigned long flags;
1669
1670 /* Check for errors. */
1671 dma_error = 0;
1672 dma = info->dma;
1673 if (dma) {
1674 info->dma = 0;
1675 dma_error = HWIF(drive)->ide_dma_end(drive);
Bartlomiej Zolnierkiewiczeba15fb2008-02-01 23:09:17 +01001676 if (dma_error) {
1677 printk(KERN_ERR "%s: DMA %s error\n", drive->name,
1678 rq_data_dir(rq) ? "write" : "read");
1679 ide_dma_off(drive);
1680 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001681 }
1682
1683 if (cdrom_decode_status(drive, 0, &stat))
1684 return ide_stopped;
1685
1686 /*
1687 * using dma, transfer is complete now
1688 */
1689 if (dma) {
Bartlomiej Zolnierkiewiczeba15fb2008-02-01 23:09:17 +01001690 if (dma_error)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001691 return ide_error(drive, "dma error", stat);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001692
Kiyoshi Uedaaaa04c22007-12-11 17:51:23 -05001693 spin_lock_irqsave(&ide_lock, flags);
1694 if (__blk_end_request(rq, 0, rq->data_len))
1695 BUG();
1696 HWGROUP(drive)->rq = NULL;
1697 spin_unlock_irqrestore(&ide_lock, flags);
1698
1699 return ide_stopped;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001700 }
1701
1702 /*
1703 * ok we fall to pio :/
1704 */
1705 ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3;
1706 lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1707 highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1708
1709 len = lowcyl + (256 * highcyl);
1710 thislen = rq->data_len;
1711 if (thislen > len)
1712 thislen = len;
1713
1714 /*
1715 * If DRQ is clear, the command has completed.
1716 */
Kiyoshi Uedaaaa04c22007-12-11 17:51:23 -05001717 if ((stat & DRQ_STAT) == 0) {
1718 spin_lock_irqsave(&ide_lock, flags);
Jens Axboe4f4f6c252008-01-31 13:57:51 +01001719 if (__blk_end_request(rq, 0, rq->data_len))
Kiyoshi Uedaaaa04c22007-12-11 17:51:23 -05001720 BUG();
1721 HWGROUP(drive)->rq = NULL;
1722 spin_unlock_irqrestore(&ide_lock, flags);
1723
1724 return ide_stopped;
1725 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001726
1727 /*
1728 * check which way to transfer data
1729 */
1730 if (rq_data_dir(rq) == WRITE) {
1731 /*
1732 * write to drive
1733 */
1734 if (cdrom_write_check_ireason(drive, len, ireason))
1735 return ide_stopped;
1736
1737 xferfunc = HWIF(drive)->atapi_output_bytes;
1738 } else {
1739 /*
1740 * read from drive
1741 */
1742 if (cdrom_read_check_ireason(drive, len, ireason))
1743 return ide_stopped;
1744
1745 xferfunc = HWIF(drive)->atapi_input_bytes;
1746 }
1747
1748 /*
1749 * transfer data
1750 */
1751 while (thislen > 0) {
1752 int blen = blen = rq->data_len;
1753 char *ptr = rq->data;
1754
1755 /*
1756 * bio backed?
1757 */
1758 if (rq->bio) {
1759 ptr = bio_data(rq->bio);
1760 blen = bio_iovec(rq->bio)->bv_len;
1761 }
1762
1763 if (!ptr) {
1764 printk(KERN_ERR "%s: confused, missing data\n", drive->name);
1765 break;
1766 }
1767
1768 if (blen > thislen)
1769 blen = thislen;
1770
1771 xferfunc(drive, ptr, blen);
1772
1773 thislen -= blen;
1774 len -= blen;
1775 rq->data_len -= blen;
1776
1777 if (rq->bio)
Kiyoshi Uedaaaa04c22007-12-11 17:51:23 -05001778 /*
1779 * The request can't be completed until DRQ is cleared.
1780 * So complete the data, but don't complete the request
1781 * using the dummy function for the callback feature
1782 * of blk_end_request_callback().
1783 */
1784 blk_end_request_callback(rq, 0, blen,
1785 cdrom_newpc_intr_dummy_cb);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001786 else
1787 rq->data += blen;
1788 }
1789
1790 /*
1791 * pad, if necessary
1792 */
Bartlomiej Zolnierkiewicz5a5222d2008-02-01 23:09:17 +01001793 if (len > 0)
1794 ide_cd_pad_transfer(drive, xferfunc, len);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001795
Eric Sesterhenn125e1872006-06-23 02:06:06 -07001796 BUG_ON(HWGROUP(drive)->handler != NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001797
1798 ide_set_handler(drive, cdrom_newpc_intr, rq->timeout, NULL);
1799 return ide_started;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001800}
1801
1802static ide_startstop_t cdrom_write_intr(ide_drive_t *drive)
1803{
1804 int stat, ireason, len, sectors_to_transfer, uptodate;
1805 struct cdrom_info *info = drive->driver_data;
1806 int dma_error = 0, dma = info->dma;
1807 u8 lowcyl = 0, highcyl = 0;
1808
1809 struct request *rq = HWGROUP(drive)->rq;
1810
1811 /* Check for errors. */
1812 if (dma) {
1813 info->dma = 0;
Bartlomiej Zolnierkiewiczb481b232007-12-24 15:23:43 +01001814 dma_error = HWIF(drive)->ide_dma_end(drive);
1815 if (dma_error) {
1816 printk(KERN_ERR "%s: DMA write error\n", drive->name);
Bartlomiej Zolnierkiewicz7469aaf2007-02-17 02:40:26 +01001817 ide_dma_off(drive);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001818 }
1819 }
1820
1821 if (cdrom_decode_status(drive, 0, &stat))
1822 return ide_stopped;
1823
1824 /*
1825 * using dma, transfer is complete now
1826 */
1827 if (dma) {
1828 if (dma_error)
1829 return ide_error(drive, "dma error", stat);
1830
1831 ide_end_request(drive, 1, rq->nr_sectors);
1832 return ide_stopped;
1833 }
1834
1835 /* Read the interrupt reason and the transfer length. */
Bartlomiej Zolnierkiewicz31a71192007-12-24 15:23:43 +01001836 ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001837 lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1838 highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1839
1840 len = lowcyl + (256 * highcyl);
1841
1842 /* If DRQ is clear, the command has completed. */
1843 if ((stat & DRQ_STAT) == 0) {
1844 /* If we're not done writing, complain.
1845 * Otherwise, complete the command normally.
1846 */
1847 uptodate = 1;
1848 if (rq->current_nr_sectors > 0) {
Bartlomiej Zolnierkiewiczb481b232007-12-24 15:23:43 +01001849 printk(KERN_ERR "%s: %s: data underrun (%d blocks)\n",
1850 drive->name, __FUNCTION__,
1851 rq->current_nr_sectors);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001852 uptodate = 0;
1853 }
1854 cdrom_end_request(drive, uptodate);
1855 return ide_stopped;
1856 }
1857
1858 /* Check that the drive is expecting to do the same thing we are. */
1859 if (cdrom_write_check_ireason(drive, len, ireason))
1860 return ide_stopped;
1861
1862 sectors_to_transfer = len / SECTOR_SIZE;
1863
1864 /*
1865 * now loop and write out the data
1866 */
1867 while (sectors_to_transfer > 0) {
1868 int this_transfer;
1869
1870 if (!rq->current_nr_sectors) {
Bartlomiej Zolnierkiewiczb481b232007-12-24 15:23:43 +01001871 printk(KERN_ERR "%s: %s: confused, missing data\n",
1872 drive->name, __FUNCTION__);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001873 break;
1874 }
1875
1876 /*
1877 * Figure out how many sectors we can transfer
1878 */
1879 this_transfer = min_t(int, sectors_to_transfer, rq->current_nr_sectors);
1880
1881 while (this_transfer > 0) {
1882 HWIF(drive)->atapi_output_bytes(drive, rq->buffer, SECTOR_SIZE);
1883 rq->buffer += SECTOR_SIZE;
1884 --rq->nr_sectors;
1885 --rq->current_nr_sectors;
1886 ++rq->sector;
1887 --this_transfer;
1888 --sectors_to_transfer;
1889 }
1890
1891 /*
1892 * current buffer complete, move on
1893 */
1894 if (rq->current_nr_sectors == 0 && rq->nr_sectors)
1895 cdrom_end_request(drive, 1);
1896 }
1897
1898 /* re-arm handler */
1899 ide_set_handler(drive, &cdrom_write_intr, ATAPI_WAIT_PC, NULL);
1900 return ide_started;
1901}
1902
1903static ide_startstop_t cdrom_start_write_cont(ide_drive_t *drive)
1904{
1905 struct request *rq = HWGROUP(drive)->rq;
1906
1907#if 0 /* the immediate bit */
1908 rq->cmd[1] = 1 << 3;
1909#endif
1910 rq->timeout = ATAPI_WAIT_PC;
1911
1912 return cdrom_transfer_packet_command(drive, rq, cdrom_write_intr);
1913}
1914
1915static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq)
1916{
1917 struct cdrom_info *info = drive->driver_data;
1918 struct gendisk *g = info->disk;
1919 unsigned short sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS;
1920
1921 /*
1922 * writes *must* be hardware frame aligned
1923 */
1924 if ((rq->nr_sectors & (sectors_per_frame - 1)) ||
1925 (rq->sector & (sectors_per_frame - 1))) {
1926 cdrom_end_request(drive, 0);
1927 return ide_stopped;
1928 }
1929
1930 /*
1931 * disk has become write protected
1932 */
1933 if (g->policy) {
1934 cdrom_end_request(drive, 0);
1935 return ide_stopped;
1936 }
1937
Linus Torvalds1da177e2005-04-16 15:20:36 -07001938 info->nsectors_buffered = 0;
1939
1940 /* use dma, if possible. we don't need to check more, since we
1941 * know that the transfer is always (at least!) frame aligned */
1942 info->dma = drive->using_dma ? 1 : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001943
1944 info->devinfo.media_written = 1;
1945
1946 /* Start sending the write request to the drive. */
1947 return cdrom_start_packet_command(drive, 32768, cdrom_start_write_cont);
1948}
1949
1950static ide_startstop_t cdrom_do_newpc_cont(ide_drive_t *drive)
1951{
1952 struct request *rq = HWGROUP(drive)->rq;
1953
1954 if (!rq->timeout)
1955 rq->timeout = ATAPI_WAIT_PC;
1956
1957 return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr);
1958}
1959
1960static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
1961{
1962 struct cdrom_info *info = drive->driver_data;
1963
Jens Axboe4aff5e22006-08-10 08:44:47 +02001964 rq->cmd_flags |= REQ_QUIET;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001965
1966 info->dma = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001967
1968 /*
1969 * sg request
1970 */
1971 if (rq->bio) {
1972 int mask = drive->queue->dma_alignment;
1973 unsigned long addr = (unsigned long) page_address(bio_page(rq->bio));
1974
Linus Torvalds1da177e2005-04-16 15:20:36 -07001975 info->dma = drive->using_dma;
1976
1977 /*
1978 * check if dma is safe
Linus Torvalds5d9e4ea2005-05-27 07:36:17 -07001979 *
1980 * NOTE! The "len" and "addr" checks should possibly have
1981 * separate masks.
Linus Torvalds1da177e2005-04-16 15:20:36 -07001982 */
Jens Axboe4e7c6812005-05-31 17:47:36 +02001983 if ((rq->data_len & 15) || (addr & mask))
Linus Torvalds1da177e2005-04-16 15:20:36 -07001984 info->dma = 0;
1985 }
1986
1987 /* Start sending the command to the drive. */
1988 return cdrom_start_packet_command(drive, rq->data_len, cdrom_do_newpc_cont);
1989}
1990
1991/****************************************************************************
1992 * cdrom driver request routine.
1993 */
1994static ide_startstop_t
1995ide_do_rw_cdrom (ide_drive_t *drive, struct request *rq, sector_t block)
1996{
1997 ide_startstop_t action;
1998 struct cdrom_info *info = drive->driver_data;
1999
2000 if (blk_fs_request(rq)) {
2001 if (CDROM_CONFIG_FLAGS(drive)->seeking) {
2002 unsigned long elapsed = jiffies - info->start_seek;
2003 int stat = HWIF(drive)->INB(IDE_STATUS_REG);
2004
2005 if ((stat & SEEK_STAT) != SEEK_STAT) {
2006 if (elapsed < IDECD_SEEK_TIMEOUT) {
2007 ide_stall_queue(drive, IDECD_SEEK_TIMER);
2008 return ide_stopped;
2009 }
2010 printk (KERN_ERR "%s: DSC timeout\n", drive->name);
2011 }
2012 CDROM_CONFIG_FLAGS(drive)->seeking = 0;
2013 }
2014 if ((rq_data_dir(rq) == READ) && IDE_LARGE_SEEK(info->last_block, block, IDECD_SEEK_THRESHOLD) && drive->dsc_overlap) {
2015 action = cdrom_start_seek(drive, block);
2016 } else {
2017 if (rq_data_dir(rq) == READ)
2018 action = cdrom_start_read(drive, block);
2019 else
2020 action = cdrom_start_write(drive, rq);
2021 }
2022 info->last_block = block;
2023 return action;
Jens Axboecea28852006-10-12 15:08:45 +02002024 } else if (rq->cmd_type == REQ_TYPE_SENSE ||
2025 rq->cmd_type == REQ_TYPE_ATA_PC) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002026 return cdrom_do_packet_command(drive);
Jens Axboe4aff5e22006-08-10 08:44:47 +02002027 } else if (blk_pc_request(rq)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002028 return cdrom_do_block_pc(drive, rq);
Jens Axboe4aff5e22006-08-10 08:44:47 +02002029 } else if (blk_special_request(rq)) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002030 /*
2031 * right now this can only be a reset...
2032 */
2033 cdrom_end_request(drive, 1);
2034 return ide_stopped;
2035 }
2036
2037 blk_dump_rq_flags(rq, "ide-cd bad flags");
2038 cdrom_end_request(drive, 0);
2039 return ide_stopped;
2040}
2041
2042
2043
2044/****************************************************************************
2045 * Ioctl handling.
2046 *
2047 * Routines which queue packet commands take as a final argument a pointer
2048 * to a request_sense struct. If execution of the command results
2049 * in an error with a CHECK CONDITION status, this structure will be filled
2050 * with the results of the subsequent request sense command. The pointer
2051 * can also be NULL, in which case no sense information is returned.
2052 */
2053
2054#if ! STANDARD_ATAPI
2055static inline
2056int bin2bcd (int x)
2057{
2058 return (x%10) | ((x/10) << 4);
2059}
2060
2061
2062static inline
2063int bcd2bin (int x)
2064{
2065 return (x >> 4) * 10 + (x & 0x0f);
2066}
2067
2068static
2069void msf_from_bcd (struct atapi_msf *msf)
2070{
2071 msf->minute = bcd2bin (msf->minute);
2072 msf->second = bcd2bin (msf->second);
2073 msf->frame = bcd2bin (msf->frame);
2074}
2075
2076#endif /* not STANDARD_ATAPI */
2077
2078
2079static inline
2080void lba_to_msf (int lba, byte *m, byte *s, byte *f)
2081{
2082 lba += CD_MSF_OFFSET;
2083 lba &= 0xffffff; /* negative lbas use only 24 bits */
2084 *m = lba / (CD_SECS * CD_FRAMES);
2085 lba %= (CD_SECS * CD_FRAMES);
2086 *s = lba / CD_FRAMES;
2087 *f = lba % CD_FRAMES;
2088}
2089
2090
2091static inline
2092int msf_to_lba (byte m, byte s, byte f)
2093{
2094 return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
2095}
2096
2097static int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense)
2098{
2099 struct request req;
2100 struct cdrom_info *info = drive->driver_data;
2101 struct cdrom_device_info *cdi = &info->devinfo;
2102
2103 cdrom_prepare_request(drive, &req);
2104
2105 req.sense = sense;
2106 req.cmd[0] = GPCMD_TEST_UNIT_READY;
Jens Axboe4aff5e22006-08-10 08:44:47 +02002107 req.cmd_flags |= REQ_QUIET;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002108
2109#if ! STANDARD_ATAPI
2110 /* the Sanyo 3 CD changer uses byte 7 of TEST_UNIT_READY to
2111 switch CDs instead of supporting the LOAD_UNLOAD opcode */
2112
2113 req.cmd[7] = cdi->sanyo_slot % 3;
2114#endif /* not STANDARD_ATAPI */
2115
2116 return cdrom_queue_packet_command(drive, &req);
2117}
2118
2119
2120/* Lock the door if LOCKFLAG is nonzero; unlock it otherwise. */
2121static int
2122cdrom_lockdoor(ide_drive_t *drive, int lockflag, struct request_sense *sense)
2123{
2124 struct request_sense my_sense;
2125 struct request req;
2126 int stat;
2127
2128 if (sense == NULL)
2129 sense = &my_sense;
2130
2131 /* If the drive cannot lock the door, just pretend. */
2132 if (CDROM_CONFIG_FLAGS(drive)->no_doorlock) {
2133 stat = 0;
2134 } else {
2135 cdrom_prepare_request(drive, &req);
2136 req.sense = sense;
2137 req.cmd[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
2138 req.cmd[4] = lockflag ? 1 : 0;
2139 stat = cdrom_queue_packet_command(drive, &req);
2140 }
2141
2142 /* If we got an illegal field error, the drive
2143 probably cannot lock the door. */
2144 if (stat != 0 &&
2145 sense->sense_key == ILLEGAL_REQUEST &&
2146 (sense->asc == 0x24 || sense->asc == 0x20)) {
2147 printk (KERN_ERR "%s: door locking not supported\n",
2148 drive->name);
2149 CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
2150 stat = 0;
2151 }
2152
2153 /* no medium, that's alright. */
2154 if (stat != 0 && sense->sense_key == NOT_READY && sense->asc == 0x3a)
2155 stat = 0;
2156
2157 if (stat == 0)
2158 CDROM_STATE_FLAGS(drive)->door_locked = lockflag;
2159
2160 return stat;
2161}
2162
2163
2164/* Eject the disk if EJECTFLAG is 0.
2165 If EJECTFLAG is 1, try to reload the disk. */
2166static int cdrom_eject(ide_drive_t *drive, int ejectflag,
2167 struct request_sense *sense)
2168{
2169 struct request req;
2170 char loej = 0x02;
2171
2172 if (CDROM_CONFIG_FLAGS(drive)->no_eject && !ejectflag)
2173 return -EDRIVE_CANT_DO_THIS;
2174
2175 /* reload fails on some drives, if the tray is locked */
2176 if (CDROM_STATE_FLAGS(drive)->door_locked && ejectflag)
2177 return 0;
2178
2179 cdrom_prepare_request(drive, &req);
2180
2181 /* only tell drive to close tray if open, if it can do that */
2182 if (ejectflag && !CDROM_CONFIG_FLAGS(drive)->close_tray)
2183 loej = 0;
2184
2185 req.sense = sense;
2186 req.cmd[0] = GPCMD_START_STOP_UNIT;
2187 req.cmd[4] = loej | (ejectflag != 0);
2188 return cdrom_queue_packet_command(drive, &req);
2189}
2190
2191static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity,
2192 unsigned long *sectors_per_frame,
2193 struct request_sense *sense)
2194{
2195 struct {
2196 __u32 lba;
2197 __u32 blocklen;
2198 } capbuf;
2199
2200 int stat;
2201 struct request req;
2202
2203 cdrom_prepare_request(drive, &req);
2204
2205 req.sense = sense;
2206 req.cmd[0] = GPCMD_READ_CDVD_CAPACITY;
2207 req.data = (char *)&capbuf;
2208 req.data_len = sizeof(capbuf);
Jens Axboe4aff5e22006-08-10 08:44:47 +02002209 req.cmd_flags |= REQ_QUIET;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002210
2211 stat = cdrom_queue_packet_command(drive, &req);
2212 if (stat == 0) {
2213 *capacity = 1 + be32_to_cpu(capbuf.lba);
2214 *sectors_per_frame =
2215 be32_to_cpu(capbuf.blocklen) >> SECTOR_BITS;
2216 }
2217
2218 return stat;
2219}
2220
2221static int cdrom_read_tocentry(ide_drive_t *drive, int trackno, int msf_flag,
2222 int format, char *buf, int buflen,
2223 struct request_sense *sense)
2224{
2225 struct request req;
2226
2227 cdrom_prepare_request(drive, &req);
2228
2229 req.sense = sense;
2230 req.data = buf;
2231 req.data_len = buflen;
Jens Axboe4aff5e22006-08-10 08:44:47 +02002232 req.cmd_flags |= REQ_QUIET;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002233 req.cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
2234 req.cmd[6] = trackno;
2235 req.cmd[7] = (buflen >> 8);
2236 req.cmd[8] = (buflen & 0xff);
2237 req.cmd[9] = (format << 6);
2238
2239 if (msf_flag)
2240 req.cmd[1] = 2;
2241
2242 return cdrom_queue_packet_command(drive, &req);
2243}
2244
2245
2246/* Try to read the entire TOC for the disk into our internal buffer. */
2247static int cdrom_read_toc(ide_drive_t *drive, struct request_sense *sense)
2248{
2249 int stat, ntracks, i;
2250 struct cdrom_info *info = drive->driver_data;
2251 struct cdrom_device_info *cdi = &info->devinfo;
2252 struct atapi_toc *toc = info->toc;
2253 struct {
2254 struct atapi_toc_header hdr;
2255 struct atapi_toc_entry ent;
2256 } ms_tmp;
2257 long last_written;
2258 unsigned long sectors_per_frame = SECTORS_PER_FRAME;
2259
2260 if (toc == NULL) {
2261 /* Try to allocate space. */
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002262 toc = kmalloc(sizeof(struct atapi_toc), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002263 if (toc == NULL) {
2264 printk (KERN_ERR "%s: No cdrom TOC buffer!\n", drive->name);
2265 return -ENOMEM;
2266 }
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002267 info->toc = toc;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002268 }
2269
2270 /* Check to see if the existing data is still valid.
2271 If it is, just return. */
2272 (void) cdrom_check_status(drive, sense);
2273
2274 if (CDROM_STATE_FLAGS(drive)->toc_valid)
2275 return 0;
2276
2277 /* Try to get the total cdrom capacity and sector size. */
2278 stat = cdrom_read_capacity(drive, &toc->capacity, &sectors_per_frame,
2279 sense);
2280 if (stat)
2281 toc->capacity = 0x1fffff;
2282
2283 set_capacity(info->disk, toc->capacity * sectors_per_frame);
Alan Coxdbe217a2006-06-25 05:47:44 -07002284 /* Save a private copy of te TOC capacity for error handling */
2285 drive->probed_capacity = toc->capacity * sectors_per_frame;
2286
Linus Torvalds1da177e2005-04-16 15:20:36 -07002287 blk_queue_hardsect_size(drive->queue,
2288 sectors_per_frame << SECTOR_BITS);
2289
2290 /* First read just the header, so we know how long the TOC is. */
2291 stat = cdrom_read_tocentry(drive, 0, 1, 0, (char *) &toc->hdr,
2292 sizeof(struct atapi_toc_header), sense);
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002293 if (stat)
2294 return stat;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002295
2296#if ! STANDARD_ATAPI
2297 if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd) {
2298 toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
2299 toc->hdr.last_track = bcd2bin(toc->hdr.last_track);
2300 }
2301#endif /* not STANDARD_ATAPI */
2302
2303 ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
2304 if (ntracks <= 0)
2305 return -EIO;
2306 if (ntracks > MAX_TRACKS)
2307 ntracks = MAX_TRACKS;
2308
2309 /* Now read the whole schmeer. */
2310 stat = cdrom_read_tocentry(drive, toc->hdr.first_track, 1, 0,
2311 (char *)&toc->hdr,
2312 sizeof(struct atapi_toc_header) +
2313 (ntracks + 1) *
2314 sizeof(struct atapi_toc_entry), sense);
2315
2316 if (stat && toc->hdr.first_track > 1) {
2317 /* Cds with CDI tracks only don't have any TOC entries,
2318 despite of this the returned values are
2319 first_track == last_track = number of CDI tracks + 1,
2320 so that this case is indistinguishable from the same
2321 layout plus an additional audio track.
2322 If we get an error for the regular case, we assume
2323 a CDI without additional audio tracks. In this case
2324 the readable TOC is empty (CDI tracks are not included)
Jan Engelhardt96de0e22007-10-19 23:21:04 +02002325 and only holds the Leadout entry. Heiko Eißfeldt */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002326 ntracks = 0;
2327 stat = cdrom_read_tocentry(drive, CDROM_LEADOUT, 1, 0,
2328 (char *)&toc->hdr,
2329 sizeof(struct atapi_toc_header) +
2330 (ntracks + 1) *
2331 sizeof(struct atapi_toc_entry),
2332 sense);
2333 if (stat) {
2334 return stat;
2335 }
2336#if ! STANDARD_ATAPI
2337 if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd) {
2338 toc->hdr.first_track = bin2bcd(CDROM_LEADOUT);
2339 toc->hdr.last_track = bin2bcd(CDROM_LEADOUT);
2340 } else
2341#endif /* not STANDARD_ATAPI */
2342 {
2343 toc->hdr.first_track = CDROM_LEADOUT;
2344 toc->hdr.last_track = CDROM_LEADOUT;
2345 }
2346 }
2347
2348 if (stat)
2349 return stat;
2350
2351 toc->hdr.toc_length = ntohs (toc->hdr.toc_length);
2352
2353#if ! STANDARD_ATAPI
2354 if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd) {
2355 toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
2356 toc->hdr.last_track = bcd2bin(toc->hdr.last_track);
2357 }
2358#endif /* not STANDARD_ATAPI */
2359
2360 for (i=0; i<=ntracks; i++) {
2361#if ! STANDARD_ATAPI
2362 if (CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd) {
2363 if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd)
2364 toc->ent[i].track = bcd2bin(toc->ent[i].track);
2365 msf_from_bcd(&toc->ent[i].addr.msf);
2366 }
2367#endif /* not STANDARD_ATAPI */
2368 toc->ent[i].addr.lba = msf_to_lba (toc->ent[i].addr.msf.minute,
2369 toc->ent[i].addr.msf.second,
2370 toc->ent[i].addr.msf.frame);
2371 }
2372
2373 /* Read the multisession information. */
2374 if (toc->hdr.first_track != CDROM_LEADOUT) {
2375 /* Read the multisession information. */
2376 stat = cdrom_read_tocentry(drive, 0, 0, 1, (char *)&ms_tmp,
2377 sizeof(ms_tmp), sense);
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002378 if (stat)
2379 return stat;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002380
2381 toc->last_session_lba = be32_to_cpu(ms_tmp.ent.addr.lba);
2382 } else {
2383 ms_tmp.hdr.first_track = ms_tmp.hdr.last_track = CDROM_LEADOUT;
2384 toc->last_session_lba = msf_to_lba(0, 2, 0); /* 0m 2s 0f */
2385 }
2386
2387#if ! STANDARD_ATAPI
2388 if (CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd) {
2389 /* Re-read multisession information using MSF format */
2390 stat = cdrom_read_tocentry(drive, 0, 1, 1, (char *)&ms_tmp,
2391 sizeof(ms_tmp), sense);
2392 if (stat)
2393 return stat;
2394
2395 msf_from_bcd (&ms_tmp.ent.addr.msf);
2396 toc->last_session_lba = msf_to_lba(ms_tmp.ent.addr.msf.minute,
2397 ms_tmp.ent.addr.msf.second,
2398 ms_tmp.ent.addr.msf.frame);
2399 }
2400#endif /* not STANDARD_ATAPI */
2401
2402 toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track);
2403
2404 /* Now try to get the total cdrom capacity. */
2405 stat = cdrom_get_last_written(cdi, &last_written);
2406 if (!stat && (last_written > toc->capacity)) {
2407 toc->capacity = last_written;
2408 set_capacity(info->disk, toc->capacity * sectors_per_frame);
Alan Coxdbe217a2006-06-25 05:47:44 -07002409 drive->probed_capacity = toc->capacity * sectors_per_frame;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002410 }
2411
2412 /* Remember that we've read this stuff. */
2413 CDROM_STATE_FLAGS(drive)->toc_valid = 1;
2414
2415 return 0;
2416}
2417
2418
2419static int cdrom_read_subchannel(ide_drive_t *drive, int format, char *buf,
2420 int buflen, struct request_sense *sense)
2421{
2422 struct request req;
2423
2424 cdrom_prepare_request(drive, &req);
2425
2426 req.sense = sense;
2427 req.data = buf;
2428 req.data_len = buflen;
2429 req.cmd[0] = GPCMD_READ_SUBCHANNEL;
2430 req.cmd[1] = 2; /* MSF addressing */
2431 req.cmd[2] = 0x40; /* request subQ data */
2432 req.cmd[3] = format;
2433 req.cmd[7] = (buflen >> 8);
2434 req.cmd[8] = (buflen & 0xff);
2435 return cdrom_queue_packet_command(drive, &req);
2436}
2437
2438/* ATAPI cdrom drives are free to select the speed you request or any slower
2439 rate :-( Requesting too fast a speed will _not_ produce an error. */
2440static int cdrom_select_speed(ide_drive_t *drive, int speed,
2441 struct request_sense *sense)
2442{
2443 struct request req;
2444 cdrom_prepare_request(drive, &req);
2445
2446 req.sense = sense;
2447 if (speed == 0)
2448 speed = 0xffff; /* set to max */
2449 else
2450 speed *= 177; /* Nx to kbytes/s */
2451
2452 req.cmd[0] = GPCMD_SET_SPEED;
2453 /* Read Drive speed in kbytes/second MSB */
2454 req.cmd[2] = (speed >> 8) & 0xff;
2455 /* Read Drive speed in kbytes/second LSB */
2456 req.cmd[3] = speed & 0xff;
2457 if (CDROM_CONFIG_FLAGS(drive)->cd_r ||
2458 CDROM_CONFIG_FLAGS(drive)->cd_rw ||
2459 CDROM_CONFIG_FLAGS(drive)->dvd_r) {
2460 /* Write Drive speed in kbytes/second MSB */
2461 req.cmd[4] = (speed >> 8) & 0xff;
2462 /* Write Drive speed in kbytes/second LSB */
2463 req.cmd[5] = speed & 0xff;
2464 }
2465
2466 return cdrom_queue_packet_command(drive, &req);
2467}
2468
2469static int cdrom_play_audio(ide_drive_t *drive, int lba_start, int lba_end)
2470{
2471 struct request_sense sense;
2472 struct request req;
2473
2474 cdrom_prepare_request(drive, &req);
2475
2476 req.sense = &sense;
2477 req.cmd[0] = GPCMD_PLAY_AUDIO_MSF;
2478 lba_to_msf(lba_start, &req.cmd[3], &req.cmd[4], &req.cmd[5]);
2479 lba_to_msf(lba_end-1, &req.cmd[6], &req.cmd[7], &req.cmd[8]);
2480
2481 return cdrom_queue_packet_command(drive, &req);
2482}
2483
2484static int cdrom_get_toc_entry(ide_drive_t *drive, int track,
2485 struct atapi_toc_entry **ent)
2486{
2487 struct cdrom_info *info = drive->driver_data;
2488 struct atapi_toc *toc = info->toc;
2489 int ntracks;
2490
2491 /*
2492 * don't serve cached data, if the toc isn't valid
2493 */
2494 if (!CDROM_STATE_FLAGS(drive)->toc_valid)
2495 return -EINVAL;
2496
2497 /* Check validity of requested track number. */
2498 ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
2499 if (toc->hdr.first_track == CDROM_LEADOUT) ntracks = 0;
2500 if (track == CDROM_LEADOUT)
2501 *ent = &toc->ent[ntracks];
2502 else if (track < toc->hdr.first_track ||
2503 track > toc->hdr.last_track)
2504 return -EINVAL;
2505 else
2506 *ent = &toc->ent[track - toc->hdr.first_track];
2507
2508 return 0;
2509}
2510
2511/* the generic packet interface to cdrom.c */
2512static int ide_cdrom_packet(struct cdrom_device_info *cdi,
2513 struct packet_command *cgc)
2514{
2515 struct request req;
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002516 ide_drive_t *drive = cdi->handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002517
2518 if (cgc->timeout <= 0)
2519 cgc->timeout = ATAPI_WAIT_PC;
2520
2521 /* here we queue the commands from the uniform CD-ROM
2522 layer. the packet must be complete, as we do not
2523 touch it at all. */
2524 cdrom_prepare_request(drive, &req);
2525 memcpy(req.cmd, cgc->cmd, CDROM_PACKET_SIZE);
2526 if (cgc->sense)
2527 memset(cgc->sense, 0, sizeof(struct request_sense));
2528 req.data = cgc->buffer;
2529 req.data_len = cgc->buflen;
2530 req.timeout = cgc->timeout;
2531
2532 if (cgc->quiet)
Jens Axboe4aff5e22006-08-10 08:44:47 +02002533 req.cmd_flags |= REQ_QUIET;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002534
2535 req.sense = cgc->sense;
2536 cgc->stat = cdrom_queue_packet_command(drive, &req);
2537 if (!cgc->stat)
2538 cgc->buflen -= req.data_len;
2539 return cgc->stat;
2540}
2541
2542static
Linus Torvalds1da177e2005-04-16 15:20:36 -07002543int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi,
2544 unsigned int cmd, void *arg)
2545
2546{
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002547 ide_drive_t *drive = cdi->handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002548 struct cdrom_info *info = drive->driver_data;
2549 int stat;
2550
2551 switch (cmd) {
2552 /*
2553 * emulate PLAY_AUDIO_TI command with PLAY_AUDIO_10, since
2554 * atapi doesn't support it
2555 */
2556 case CDROMPLAYTRKIND: {
2557 unsigned long lba_start, lba_end;
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002558 struct cdrom_ti *ti = arg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002559 struct atapi_toc_entry *first_toc, *last_toc;
2560
2561 stat = cdrom_get_toc_entry(drive, ti->cdti_trk0, &first_toc);
2562 if (stat)
2563 return stat;
2564
2565 stat = cdrom_get_toc_entry(drive, ti->cdti_trk1, &last_toc);
2566 if (stat)
2567 return stat;
2568
2569 if (ti->cdti_trk1 != CDROM_LEADOUT)
2570 ++last_toc;
2571 lba_start = first_toc->addr.lba;
2572 lba_end = last_toc->addr.lba;
2573
2574 if (lba_end <= lba_start)
2575 return -EINVAL;
2576
2577 return cdrom_play_audio(drive, lba_start, lba_end);
2578 }
2579
2580 case CDROMREADTOCHDR: {
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002581 struct cdrom_tochdr *tochdr = arg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002582 struct atapi_toc *toc;
2583
2584 /* Make sure our saved TOC is valid. */
2585 stat = cdrom_read_toc(drive, NULL);
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002586 if (stat)
2587 return stat;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002588
2589 toc = info->toc;
2590 tochdr->cdth_trk0 = toc->hdr.first_track;
2591 tochdr->cdth_trk1 = toc->hdr.last_track;
2592
2593 return 0;
2594 }
2595
2596 case CDROMREADTOCENTRY: {
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002597 struct cdrom_tocentry *tocentry = arg;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002598 struct atapi_toc_entry *toce;
2599
2600 stat = cdrom_get_toc_entry(drive, tocentry->cdte_track, &toce);
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002601 if (stat)
2602 return stat;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002603
2604 tocentry->cdte_ctrl = toce->control;
2605 tocentry->cdte_adr = toce->adr;
2606 if (tocentry->cdte_format == CDROM_MSF) {
2607 lba_to_msf (toce->addr.lba,
2608 &tocentry->cdte_addr.msf.minute,
2609 &tocentry->cdte_addr.msf.second,
2610 &tocentry->cdte_addr.msf.frame);
2611 } else
2612 tocentry->cdte_addr.lba = toce->addr.lba;
2613
2614 return 0;
2615 }
2616
2617 default:
2618 return -EINVAL;
2619 }
2620}
2621
2622static
2623int ide_cdrom_reset (struct cdrom_device_info *cdi)
2624{
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002625 ide_drive_t *drive = cdi->handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002626 struct request_sense sense;
2627 struct request req;
2628 int ret;
2629
2630 cdrom_prepare_request(drive, &req);
Jens Axboe4aff5e22006-08-10 08:44:47 +02002631 req.cmd_type = REQ_TYPE_SPECIAL;
2632 req.cmd_flags = REQ_QUIET;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002633 ret = ide_do_drive_cmd(drive, &req, ide_wait);
2634
2635 /*
2636 * A reset will unlock the door. If it was previously locked,
2637 * lock it again.
2638 */
2639 if (CDROM_STATE_FLAGS(drive)->door_locked)
2640 (void) cdrom_lockdoor(drive, 1, &sense);
2641
2642 return ret;
2643}
2644
2645
2646static
2647int ide_cdrom_tray_move (struct cdrom_device_info *cdi, int position)
2648{
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002649 ide_drive_t *drive = cdi->handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002650 struct request_sense sense;
2651
2652 if (position) {
2653 int stat = cdrom_lockdoor(drive, 0, &sense);
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002654 if (stat)
2655 return stat;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002656 }
2657
2658 return cdrom_eject(drive, !position, &sense);
2659}
2660
2661static
2662int ide_cdrom_lock_door (struct cdrom_device_info *cdi, int lock)
2663{
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002664 ide_drive_t *drive = cdi->handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002665 return cdrom_lockdoor(drive, lock, NULL);
2666}
2667
2668static
Eric Piel9235e682005-06-23 00:10:29 -07002669int ide_cdrom_get_capabilities(ide_drive_t *drive, struct atapi_capabilities_page *cap)
2670{
2671 struct cdrom_info *info = drive->driver_data;
2672 struct cdrom_device_info *cdi = &info->devinfo;
2673 struct packet_command cgc;
2674 int stat, attempts = 3, size = sizeof(*cap);
2675
2676 /*
2677 * ACER50 (and others?) require the full spec length mode sense
2678 * page capabilities size, but older drives break.
2679 */
2680 if (!(!strcmp(drive->id->model, "ATAPI CD ROM DRIVE 50X MAX") ||
2681 !strcmp(drive->id->model, "WPI CDS-32X")))
2682 size -= sizeof(cap->pad);
2683
2684 init_cdrom_command(&cgc, cap, size, CGC_DATA_UNKNOWN);
2685 do { /* we seem to get stat=0x01,err=0x00 the first time (??) */
2686 stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
2687 if (!stat)
2688 break;
2689 } while (--attempts);
2690 return stat;
2691}
2692
2693static
2694void ide_cdrom_update_speed (ide_drive_t *drive, struct atapi_capabilities_page *cap)
2695{
2696 /* The ACER/AOpen 24X cdrom has the speed fields byte-swapped */
2697 if (!drive->id->model[0] &&
2698 !strncmp(drive->id->fw_rev, "241N", 4)) {
2699 CDROM_STATE_FLAGS(drive)->current_speed =
Bartlomiej Zolnierkiewiczaa5dc8e2007-12-24 15:23:43 +01002700 (le16_to_cpu(cap->curspeed) + (176/2)) / 176;
Eric Piel9235e682005-06-23 00:10:29 -07002701 CDROM_CONFIG_FLAGS(drive)->max_speed =
Bartlomiej Zolnierkiewiczaa5dc8e2007-12-24 15:23:43 +01002702 (le16_to_cpu(cap->maxspeed) + (176/2)) / 176;
Eric Piel9235e682005-06-23 00:10:29 -07002703 } else {
2704 CDROM_STATE_FLAGS(drive)->current_speed =
Bartlomiej Zolnierkiewiczaa5dc8e2007-12-24 15:23:43 +01002705 (be16_to_cpu(cap->curspeed) + (176/2)) / 176;
Eric Piel9235e682005-06-23 00:10:29 -07002706 CDROM_CONFIG_FLAGS(drive)->max_speed =
Bartlomiej Zolnierkiewiczaa5dc8e2007-12-24 15:23:43 +01002707 (be16_to_cpu(cap->maxspeed) + (176/2)) / 176;
Eric Piel9235e682005-06-23 00:10:29 -07002708 }
2709}
2710
2711static
Linus Torvalds1da177e2005-04-16 15:20:36 -07002712int ide_cdrom_select_speed (struct cdrom_device_info *cdi, int speed)
2713{
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002714 ide_drive_t *drive = cdi->handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002715 struct request_sense sense;
Eric Piel9235e682005-06-23 00:10:29 -07002716 struct atapi_capabilities_page cap;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002717 int stat;
2718
2719 if ((stat = cdrom_select_speed(drive, speed, &sense)) < 0)
2720 return stat;
2721
Eric Piel9235e682005-06-23 00:10:29 -07002722 if (!ide_cdrom_get_capabilities(drive, &cap)) {
2723 ide_cdrom_update_speed(drive, &cap);
2724 cdi->speed = CDROM_STATE_FLAGS(drive)->current_speed;
2725 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002726 return 0;
2727}
2728
2729/*
2730 * add logic to try GET_EVENT command first to check for media and tray
2731 * status. this should be supported by newer cd-r/w and all DVD etc
2732 * drives
2733 */
2734static
2735int ide_cdrom_drive_status (struct cdrom_device_info *cdi, int slot_nr)
2736{
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002737 ide_drive_t *drive = cdi->handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002738 struct media_event_desc med;
2739 struct request_sense sense;
2740 int stat;
2741
2742 if (slot_nr != CDSL_CURRENT)
2743 return -EINVAL;
2744
2745 stat = cdrom_check_status(drive, &sense);
2746 if (!stat || sense.sense_key == UNIT_ATTENTION)
2747 return CDS_DISC_OK;
2748
2749 if (!cdrom_get_media_event(cdi, &med)) {
2750 if (med.media_present)
2751 return CDS_DISC_OK;
2752 else if (med.door_open)
2753 return CDS_TRAY_OPEN;
2754 else
2755 return CDS_NO_DISC;
2756 }
2757
2758 if (sense.sense_key == NOT_READY && sense.asc == 0x04 && sense.ascq == 0x04)
2759 return CDS_DISC_OK;
2760
2761 /*
2762 * If not using Mt Fuji extended media tray reports,
2763 * just return TRAY_OPEN since ATAPI doesn't provide
2764 * any other way to detect this...
2765 */
2766 if (sense.sense_key == NOT_READY) {
Alan Coxdbe217a2006-06-25 05:47:44 -07002767 if (sense.asc == 0x3a && sense.ascq == 1)
2768 return CDS_NO_DISC;
2769 else
2770 return CDS_TRAY_OPEN;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002771 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002772 return CDS_DRIVE_NOT_READY;
2773}
2774
2775static
2776int ide_cdrom_get_last_session (struct cdrom_device_info *cdi,
2777 struct cdrom_multisession *ms_info)
2778{
2779 struct atapi_toc *toc;
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002780 ide_drive_t *drive = cdi->handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002781 struct cdrom_info *info = drive->driver_data;
2782 struct request_sense sense;
2783 int ret;
2784
2785 if (!CDROM_STATE_FLAGS(drive)->toc_valid || info->toc == NULL)
2786 if ((ret = cdrom_read_toc(drive, &sense)))
2787 return ret;
2788
2789 toc = info->toc;
2790 ms_info->addr.lba = toc->last_session_lba;
2791 ms_info->xa_flag = toc->xa_flag;
2792
2793 return 0;
2794}
2795
2796static
2797int ide_cdrom_get_mcn (struct cdrom_device_info *cdi,
2798 struct cdrom_mcn *mcn_info)
2799{
2800 int stat;
2801 char mcnbuf[24];
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002802 ide_drive_t *drive = cdi->handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002803
2804/* get MCN */
2805 if ((stat = cdrom_read_subchannel(drive, 2, mcnbuf, sizeof (mcnbuf), NULL)))
2806 return stat;
2807
2808 memcpy (mcn_info->medium_catalog_number, mcnbuf+9,
2809 sizeof (mcn_info->medium_catalog_number)-1);
2810 mcn_info->medium_catalog_number[sizeof (mcn_info->medium_catalog_number)-1]
2811 = '\0';
2812
2813 return 0;
2814}
2815
2816
2817
2818/****************************************************************************
2819 * Other driver requests (open, close, check media change).
2820 */
2821
2822static
2823int ide_cdrom_check_media_change_real (struct cdrom_device_info *cdi,
2824 int slot_nr)
2825{
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002826 ide_drive_t *drive = cdi->handle;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002827 int retval;
2828
2829 if (slot_nr == CDSL_CURRENT) {
2830 (void) cdrom_check_status(drive, NULL);
2831 retval = CDROM_STATE_FLAGS(drive)->media_changed;
2832 CDROM_STATE_FLAGS(drive)->media_changed = 0;
2833 return retval;
2834 } else {
2835 return -EINVAL;
2836 }
2837}
2838
2839
2840static
2841int ide_cdrom_open_real (struct cdrom_device_info *cdi, int purpose)
2842{
2843 return 0;
2844}
2845
2846/*
2847 * Close down the device. Invalidate all cached blocks.
2848 */
2849
2850static
2851void ide_cdrom_release_real (struct cdrom_device_info *cdi)
2852{
2853 ide_drive_t *drive = cdi->handle;
2854
2855 if (!cdi->use_count)
2856 CDROM_STATE_FLAGS(drive)->toc_valid = 0;
2857}
2858
2859
2860
2861/****************************************************************************
2862 * Device initialization.
2863 */
2864static struct cdrom_device_ops ide_cdrom_dops = {
2865 .open = ide_cdrom_open_real,
2866 .release = ide_cdrom_release_real,
2867 .drive_status = ide_cdrom_drive_status,
2868 .media_changed = ide_cdrom_check_media_change_real,
2869 .tray_move = ide_cdrom_tray_move,
2870 .lock_door = ide_cdrom_lock_door,
2871 .select_speed = ide_cdrom_select_speed,
2872 .get_last_session = ide_cdrom_get_last_session,
2873 .get_mcn = ide_cdrom_get_mcn,
2874 .reset = ide_cdrom_reset,
2875 .audio_ioctl = ide_cdrom_audio_ioctl,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002876 .capability = CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK |
2877 CDC_SELECT_SPEED | CDC_SELECT_DISC |
2878 CDC_MULTI_SESSION | CDC_MCN |
2879 CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET |
Christoph Hellwig6a2900b2006-03-23 03:00:15 -08002880 CDC_DRIVE_STATUS | CDC_CD_R |
Linus Torvalds1da177e2005-04-16 15:20:36 -07002881 CDC_CD_RW | CDC_DVD | CDC_DVD_R| CDC_DVD_RAM |
2882 CDC_GENERIC_PACKET | CDC_MO_DRIVE | CDC_MRW |
2883 CDC_MRW_W | CDC_RAM,
2884 .generic_packet = ide_cdrom_packet,
2885};
2886
2887static int ide_cdrom_register (ide_drive_t *drive, int nslots)
2888{
2889 struct cdrom_info *info = drive->driver_data;
2890 struct cdrom_device_info *devinfo = &info->devinfo;
2891
2892 devinfo->ops = &ide_cdrom_dops;
2893 devinfo->mask = 0;
2894 devinfo->speed = CDROM_STATE_FLAGS(drive)->current_speed;
2895 devinfo->capacity = nslots;
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002896 devinfo->handle = drive;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002897 strcpy(devinfo->name, drive->name);
2898
2899 /* set capability mask to match the probe. */
2900 if (!CDROM_CONFIG_FLAGS(drive)->cd_r)
2901 devinfo->mask |= CDC_CD_R;
2902 if (!CDROM_CONFIG_FLAGS(drive)->cd_rw)
2903 devinfo->mask |= CDC_CD_RW;
2904 if (!CDROM_CONFIG_FLAGS(drive)->dvd)
2905 devinfo->mask |= CDC_DVD;
2906 if (!CDROM_CONFIG_FLAGS(drive)->dvd_r)
2907 devinfo->mask |= CDC_DVD_R;
2908 if (!CDROM_CONFIG_FLAGS(drive)->dvd_ram)
2909 devinfo->mask |= CDC_DVD_RAM;
2910 if (!CDROM_CONFIG_FLAGS(drive)->is_changer)
2911 devinfo->mask |= CDC_SELECT_DISC;
2912 if (!CDROM_CONFIG_FLAGS(drive)->audio_play)
2913 devinfo->mask |= CDC_PLAY_AUDIO;
2914 if (!CDROM_CONFIG_FLAGS(drive)->close_tray)
2915 devinfo->mask |= CDC_CLOSE_TRAY;
2916 if (!CDROM_CONFIG_FLAGS(drive)->mo_drive)
2917 devinfo->mask |= CDC_MO_DRIVE;
Andrey Borzenkovc0400dc2006-01-10 11:27:00 +01002918 if (!CDROM_CONFIG_FLAGS(drive)->ram)
2919 devinfo->mask |= CDC_RAM;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002920
Bartlomiej Zolnierkiewicz3cbd8142007-12-24 15:23:43 +01002921 if (CDROM_CONFIG_FLAGS(drive)->no_speed_select)
2922 devinfo->mask |= CDC_SELECT_SPEED;
2923
Linus Torvalds1da177e2005-04-16 15:20:36 -07002924 devinfo->disk = info->disk;
2925 return register_cdrom(devinfo);
2926}
2927
2928static
Linus Torvalds1da177e2005-04-16 15:20:36 -07002929int ide_cdrom_probe_capabilities (ide_drive_t *drive)
2930{
2931 struct cdrom_info *info = drive->driver_data;
2932 struct cdrom_device_info *cdi = &info->devinfo;
2933 struct atapi_capabilities_page cap;
2934 int nslots = 1;
2935
2936 if (drive->media == ide_optical) {
2937 CDROM_CONFIG_FLAGS(drive)->mo_drive = 1;
2938 CDROM_CONFIG_FLAGS(drive)->ram = 1;
2939 printk(KERN_ERR "%s: ATAPI magneto-optical drive\n", drive->name);
2940 return nslots;
2941 }
2942
2943 if (CDROM_CONFIG_FLAGS(drive)->nec260 ||
2944 !strcmp(drive->id->model,"STINGRAY 8422 IDE 8X CD-ROM 7-27-95")) {
2945 CDROM_CONFIG_FLAGS(drive)->no_eject = 0;
2946 CDROM_CONFIG_FLAGS(drive)->audio_play = 1;
2947 return nslots;
2948 }
2949
2950 /*
2951 * we have to cheat a little here. the packet will eventually
2952 * be queued with ide_cdrom_packet(), which extracts the
2953 * drive from cdi->handle. Since this device hasn't been
2954 * registered with the Uniform layer yet, it can't do this.
2955 * Same goes for cdi->ops.
2956 */
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08002957 cdi->handle = drive;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002958 cdi->ops = &ide_cdrom_dops;
2959
2960 if (ide_cdrom_get_capabilities(drive, &cap))
2961 return 0;
2962
2963 if (cap.lock == 0)
2964 CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
2965 if (cap.eject)
2966 CDROM_CONFIG_FLAGS(drive)->no_eject = 0;
2967 if (cap.cd_r_write)
2968 CDROM_CONFIG_FLAGS(drive)->cd_r = 1;
2969 if (cap.cd_rw_write) {
2970 CDROM_CONFIG_FLAGS(drive)->cd_rw = 1;
2971 CDROM_CONFIG_FLAGS(drive)->ram = 1;
2972 }
2973 if (cap.test_write)
2974 CDROM_CONFIG_FLAGS(drive)->test_write = 1;
2975 if (cap.dvd_ram_read || cap.dvd_r_read || cap.dvd_rom)
2976 CDROM_CONFIG_FLAGS(drive)->dvd = 1;
2977 if (cap.dvd_ram_write) {
2978 CDROM_CONFIG_FLAGS(drive)->dvd_ram = 1;
2979 CDROM_CONFIG_FLAGS(drive)->ram = 1;
2980 }
2981 if (cap.dvd_r_write)
2982 CDROM_CONFIG_FLAGS(drive)->dvd_r = 1;
2983 if (cap.audio_play)
2984 CDROM_CONFIG_FLAGS(drive)->audio_play = 1;
2985 if (cap.mechtype == mechtype_caddy || cap.mechtype == mechtype_popup)
2986 CDROM_CONFIG_FLAGS(drive)->close_tray = 0;
2987
2988 /* Some drives used by Apple don't advertise audio play
2989 * but they do support reading TOC & audio datas
2990 */
2991 if (strcmp(drive->id->model, "MATSHITADVD-ROM SR-8187") == 0 ||
2992 strcmp(drive->id->model, "MATSHITADVD-ROM SR-8186") == 0 ||
2993 strcmp(drive->id->model, "MATSHITADVD-ROM SR-8176") == 0 ||
2994 strcmp(drive->id->model, "MATSHITADVD-ROM SR-8174") == 0)
2995 CDROM_CONFIG_FLAGS(drive)->audio_play = 1;
2996
2997#if ! STANDARD_ATAPI
2998 if (cdi->sanyo_slot > 0) {
2999 CDROM_CONFIG_FLAGS(drive)->is_changer = 1;
3000 nslots = 3;
3001 }
3002
3003 else
3004#endif /* not STANDARD_ATAPI */
3005 if (cap.mechtype == mechtype_individual_changer ||
3006 cap.mechtype == mechtype_cartridge_changer) {
3007 if ((nslots = cdrom_number_of_slots(cdi)) > 1) {
3008 CDROM_CONFIG_FLAGS(drive)->is_changer = 1;
3009 CDROM_CONFIG_FLAGS(drive)->supp_disc_present = 1;
3010 }
3011 }
3012
Eric Piel9235e682005-06-23 00:10:29 -07003013 ide_cdrom_update_speed(drive, &cap);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003014 /* don't print speed if the drive reported 0.
3015 */
3016 printk(KERN_INFO "%s: ATAPI", drive->name);
3017 if (CDROM_CONFIG_FLAGS(drive)->max_speed)
3018 printk(" %dX", CDROM_CONFIG_FLAGS(drive)->max_speed);
3019 printk(" %s", CDROM_CONFIG_FLAGS(drive)->dvd ? "DVD-ROM" : "CD-ROM");
3020
3021 if (CDROM_CONFIG_FLAGS(drive)->dvd_r|CDROM_CONFIG_FLAGS(drive)->dvd_ram)
3022 printk(" DVD%s%s",
3023 (CDROM_CONFIG_FLAGS(drive)->dvd_r)? "-R" : "",
3024 (CDROM_CONFIG_FLAGS(drive)->dvd_ram)? "-RAM" : "");
3025
3026 if (CDROM_CONFIG_FLAGS(drive)->cd_r|CDROM_CONFIG_FLAGS(drive)->cd_rw)
3027 printk(" CD%s%s",
3028 (CDROM_CONFIG_FLAGS(drive)->cd_r)? "-R" : "",
3029 (CDROM_CONFIG_FLAGS(drive)->cd_rw)? "/RW" : "");
3030
3031 if (CDROM_CONFIG_FLAGS(drive)->is_changer)
3032 printk(" changer w/%d slots", nslots);
3033 else
3034 printk(" drive");
3035
Bartlomiej Zolnierkiewicz3ab7efe2007-12-12 23:31:58 +01003036 printk(KERN_CONT ", %dkB Cache\n", be16_to_cpu(cap.buffer_size));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003037
3038 return nslots;
3039}
3040
Bartlomiej Zolnierkiewicz7662d042007-05-10 00:01:10 +02003041#ifdef CONFIG_IDE_PROC_FS
Linus Torvalds1da177e2005-04-16 15:20:36 -07003042static void ide_cdrom_add_settings(ide_drive_t *drive)
3043{
Bartlomiej Zolnierkiewicz14979432007-05-10 00:01:10 +02003044 ide_add_setting(drive, "dsc_overlap", SETTING_RW, TYPE_BYTE, 0, 1, 1, 1, &drive->dsc_overlap, NULL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003045}
Bartlomiej Zolnierkiewicz7662d042007-05-10 00:01:10 +02003046#else
3047static inline void ide_cdrom_add_settings(ide_drive_t *drive) { ; }
3048#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003049
3050/*
3051 * standard prep_rq_fn that builds 10 byte cmds
3052 */
Jens Axboe165125e2007-07-24 09:28:11 +02003053static int ide_cdrom_prep_fs(struct request_queue *q, struct request *rq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003054{
3055 int hard_sect = queue_hardsect_size(q);
3056 long block = (long)rq->hard_sector / (hard_sect >> 9);
3057 unsigned long blocks = rq->hard_nr_sectors / (hard_sect >> 9);
3058
3059 memset(rq->cmd, 0, sizeof(rq->cmd));
3060
3061 if (rq_data_dir(rq) == READ)
3062 rq->cmd[0] = GPCMD_READ_10;
3063 else
3064 rq->cmd[0] = GPCMD_WRITE_10;
3065
3066 /*
3067 * fill in lba
3068 */
3069 rq->cmd[2] = (block >> 24) & 0xff;
3070 rq->cmd[3] = (block >> 16) & 0xff;
3071 rq->cmd[4] = (block >> 8) & 0xff;
3072 rq->cmd[5] = block & 0xff;
3073
3074 /*
3075 * and transfer length
3076 */
3077 rq->cmd[7] = (blocks >> 8) & 0xff;
3078 rq->cmd[8] = blocks & 0xff;
3079 rq->cmd_len = 10;
3080 return BLKPREP_OK;
3081}
3082
3083/*
3084 * Most of the SCSI commands are supported directly by ATAPI devices.
3085 * This transform handles the few exceptions.
3086 */
3087static int ide_cdrom_prep_pc(struct request *rq)
3088{
3089 u8 *c = rq->cmd;
3090
3091 /*
3092 * Transform 6-byte read/write commands to the 10-byte version
3093 */
3094 if (c[0] == READ_6 || c[0] == WRITE_6) {
3095 c[8] = c[4];
3096 c[5] = c[3];
3097 c[4] = c[2];
3098 c[3] = c[1] & 0x1f;
3099 c[2] = 0;
3100 c[1] &= 0xe0;
3101 c[0] += (READ_10 - READ_6);
3102 rq->cmd_len = 10;
3103 return BLKPREP_OK;
3104 }
3105
3106 /*
3107 * it's silly to pretend we understand 6-byte sense commands, just
3108 * reject with ILLEGAL_REQUEST and the caller should take the
3109 * appropriate action
3110 */
3111 if (c[0] == MODE_SENSE || c[0] == MODE_SELECT) {
3112 rq->errors = ILLEGAL_REQUEST;
3113 return BLKPREP_KILL;
3114 }
3115
3116 return BLKPREP_OK;
3117}
3118
Jens Axboe165125e2007-07-24 09:28:11 +02003119static int ide_cdrom_prep_fn(struct request_queue *q, struct request *rq)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003120{
Jens Axboe4aff5e22006-08-10 08:44:47 +02003121 if (blk_fs_request(rq))
Linus Torvalds1da177e2005-04-16 15:20:36 -07003122 return ide_cdrom_prep_fs(q, rq);
Jens Axboe4aff5e22006-08-10 08:44:47 +02003123 else if (blk_pc_request(rq))
Linus Torvalds1da177e2005-04-16 15:20:36 -07003124 return ide_cdrom_prep_pc(rq);
3125
3126 return 0;
3127}
3128
3129static
3130int ide_cdrom_setup (ide_drive_t *drive)
3131{
3132 struct cdrom_info *info = drive->driver_data;
3133 struct cdrom_device_info *cdi = &info->devinfo;
3134 int nslots;
3135
3136 blk_queue_prep_rq(drive->queue, ide_cdrom_prep_fn);
3137 blk_queue_dma_alignment(drive->queue, 31);
3138 drive->queue->unplug_delay = (1 * HZ) / 1000;
3139 if (!drive->queue->unplug_delay)
3140 drive->queue->unplug_delay = 1;
3141
3142 drive->special.all = 0;
3143
3144 CDROM_STATE_FLAGS(drive)->media_changed = 1;
3145 CDROM_STATE_FLAGS(drive)->toc_valid = 0;
3146 CDROM_STATE_FLAGS(drive)->door_locked = 0;
3147
3148#if NO_DOOR_LOCKING
3149 CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
3150#else
3151 CDROM_CONFIG_FLAGS(drive)->no_doorlock = 0;
3152#endif
3153
3154 CDROM_CONFIG_FLAGS(drive)->drq_interrupt = ((drive->id->config & 0x0060) == 0x20);
3155 CDROM_CONFIG_FLAGS(drive)->is_changer = 0;
3156 CDROM_CONFIG_FLAGS(drive)->cd_r = 0;
3157 CDROM_CONFIG_FLAGS(drive)->cd_rw = 0;
3158 CDROM_CONFIG_FLAGS(drive)->test_write = 0;
3159 CDROM_CONFIG_FLAGS(drive)->dvd = 0;
3160 CDROM_CONFIG_FLAGS(drive)->dvd_r = 0;
3161 CDROM_CONFIG_FLAGS(drive)->dvd_ram = 0;
3162 CDROM_CONFIG_FLAGS(drive)->no_eject = 1;
3163 CDROM_CONFIG_FLAGS(drive)->supp_disc_present = 0;
3164 CDROM_CONFIG_FLAGS(drive)->audio_play = 0;
3165 CDROM_CONFIG_FLAGS(drive)->close_tray = 1;
3166
3167 /* limit transfer size per interrupt. */
3168 CDROM_CONFIG_FLAGS(drive)->limit_nframes = 0;
3169 /* a testament to the nice quality of Samsung drives... */
3170 if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2430"))
3171 CDROM_CONFIG_FLAGS(drive)->limit_nframes = 1;
3172 else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2432"))
3173 CDROM_CONFIG_FLAGS(drive)->limit_nframes = 1;
3174 /* the 3231 model does not support the SET_CD_SPEED command */
3175 else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-3231"))
Bartlomiej Zolnierkiewicz3cbd8142007-12-24 15:23:43 +01003176 CDROM_CONFIG_FLAGS(drive)->no_speed_select = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003177
3178#if ! STANDARD_ATAPI
3179 /* by default Sanyo 3 CD changer support is turned off and
3180 ATAPI Rev 2.2+ standard support for CD changers is used */
3181 cdi->sanyo_slot = 0;
3182
3183 CDROM_CONFIG_FLAGS(drive)->nec260 = 0;
3184 CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd = 0;
3185 CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd = 0;
3186 CDROM_CONFIG_FLAGS(drive)->playmsf_as_bcd = 0;
3187 CDROM_CONFIG_FLAGS(drive)->subchan_as_bcd = 0;
3188
3189 if (strcmp (drive->id->model, "V003S0DS") == 0 &&
3190 drive->id->fw_rev[4] == '1' &&
3191 drive->id->fw_rev[6] <= '2') {
3192 /* Vertos 300.
3193 Some versions of this drive like to talk BCD. */
3194 CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd = 1;
3195 CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd = 1;
3196 CDROM_CONFIG_FLAGS(drive)->playmsf_as_bcd = 1;
3197 CDROM_CONFIG_FLAGS(drive)->subchan_as_bcd = 1;
3198 }
3199
3200 else if (strcmp (drive->id->model, "V006E0DS") == 0 &&
3201 drive->id->fw_rev[4] == '1' &&
3202 drive->id->fw_rev[6] <= '2') {
3203 /* Vertos 600 ESD. */
3204 CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd = 1;
3205 }
3206 else if (strcmp(drive->id->model, "NEC CD-ROM DRIVE:260") == 0 &&
3207 strncmp(drive->id->fw_rev, "1.01", 4) == 0) { /* FIXME */
3208 /* Old NEC260 (not R).
3209 This drive was released before the 1.2 version
3210 of the spec. */
3211 CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd = 1;
3212 CDROM_CONFIG_FLAGS(drive)->playmsf_as_bcd = 1;
3213 CDROM_CONFIG_FLAGS(drive)->subchan_as_bcd = 1;
3214 CDROM_CONFIG_FLAGS(drive)->nec260 = 1;
3215 }
3216 else if (strcmp(drive->id->model, "WEARNES CDD-120") == 0 &&
3217 strncmp(drive->id->fw_rev, "A1.1", 4) == 0) { /* FIXME */
3218 /* Wearnes */
3219 CDROM_CONFIG_FLAGS(drive)->playmsf_as_bcd = 1;
3220 CDROM_CONFIG_FLAGS(drive)->subchan_as_bcd = 1;
3221 }
3222 /* Sanyo 3 CD changer uses a non-standard command
3223 for CD changing */
3224 else if ((strcmp(drive->id->model, "CD-ROM CDR-C3 G") == 0) ||
3225 (strcmp(drive->id->model, "CD-ROM CDR-C3G") == 0) ||
3226 (strcmp(drive->id->model, "CD-ROM CDR_C36") == 0)) {
3227 /* uses CD in slot 0 when value is set to 3 */
3228 cdi->sanyo_slot = 3;
3229 }
3230#endif /* not STANDARD_ATAPI */
3231
3232 info->toc = NULL;
3233 info->buffer = NULL;
3234 info->sector_buffered = 0;
3235 info->nsectors_buffered = 0;
3236 info->changer_info = NULL;
3237 info->last_block = 0;
3238 info->start_seek = 0;
3239
3240 nslots = ide_cdrom_probe_capabilities (drive);
3241
3242 /*
3243 * set correct block size
3244 */
3245 blk_queue_hardsect_size(drive->queue, CD_FRAMESIZE);
3246
3247 if (drive->autotune == IDE_TUNE_DEFAULT ||
3248 drive->autotune == IDE_TUNE_AUTO)
3249 drive->dsc_overlap = (drive->next != drive);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003250
3251 if (ide_cdrom_register(drive, nslots)) {
3252 printk (KERN_ERR "%s: ide_cdrom_setup failed to register device with the cdrom driver.\n", drive->name);
3253 info->devinfo.handle = NULL;
3254 return 1;
3255 }
3256 ide_cdrom_add_settings(drive);
3257 return 0;
3258}
3259
Bartlomiej Zolnierkiewiczecfd80e2007-05-10 00:01:09 +02003260#ifdef CONFIG_IDE_PROC_FS
Linus Torvalds1da177e2005-04-16 15:20:36 -07003261static
3262sector_t ide_cdrom_capacity (ide_drive_t *drive)
3263{
3264 unsigned long capacity, sectors_per_frame;
3265
3266 if (cdrom_read_capacity(drive, &capacity, &sectors_per_frame, NULL))
3267 return 0;
3268
3269 return capacity * sectors_per_frame;
3270}
Amos Waterlandd97b32142005-10-30 15:02:10 -08003271#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003272
Russell King4031bbe2006-01-06 11:41:00 +00003273static void ide_cd_remove(ide_drive_t *drive)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003274{
3275 struct cdrom_info *info = drive->driver_data;
3276
Bartlomiej Zolnierkiewicz7662d042007-05-10 00:01:10 +02003277 ide_proc_unregister_driver(drive, info->driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003278
3279 del_gendisk(info->disk);
3280
3281 ide_cd_put(info);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003282}
3283
3284static void ide_cd_release(struct kref *kref)
3285{
3286 struct cdrom_info *info = to_ide_cd(kref);
3287 struct cdrom_device_info *devinfo = &info->devinfo;
3288 ide_drive_t *drive = info->drive;
3289 struct gendisk *g = info->disk;
3290
Jesper Juhl6044ec82005-11-07 01:01:32 -08003291 kfree(info->buffer);
3292 kfree(info->toc);
3293 kfree(info->changer_info);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003294 if (devinfo->handle == drive && unregister_cdrom(devinfo))
3295 printk(KERN_ERR "%s: %s failed to unregister device from the cdrom "
3296 "driver.\n", __FUNCTION__, drive->name);
3297 drive->dsc_overlap = 0;
3298 drive->driver_data = NULL;
3299 blk_queue_prep_rq(drive->queue, NULL);
3300 g->private_data = NULL;
3301 put_disk(g);
3302 kfree(info);
3303}
3304
Russell King4031bbe2006-01-06 11:41:00 +00003305static int ide_cd_probe(ide_drive_t *);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003306
Bartlomiej Zolnierkiewiczecfd80e2007-05-10 00:01:09 +02003307#ifdef CONFIG_IDE_PROC_FS
Linus Torvalds1da177e2005-04-16 15:20:36 -07003308static int proc_idecd_read_capacity
3309 (char *page, char **start, off_t off, int count, int *eof, void *data)
3310{
Jesper Juhl2a91f3e2005-10-30 15:02:45 -08003311 ide_drive_t *drive = data;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003312 int len;
3313
3314 len = sprintf(page,"%llu\n", (long long)ide_cdrom_capacity(drive));
3315 PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
3316}
3317
3318static ide_proc_entry_t idecd_proc[] = {
3319 { "capacity", S_IFREG|S_IRUGO, proc_idecd_read_capacity, NULL },
3320 { NULL, 0, NULL, NULL }
3321};
Linus Torvalds1da177e2005-04-16 15:20:36 -07003322#endif
3323
3324static ide_driver_t ide_cdrom_driver = {
Bartlomiej Zolnierkiewicz8604aff2005-05-26 14:55:34 +02003325 .gen_driver = {
Laurent Riffard4ef3b8f2005-11-18 22:15:40 +01003326 .owner = THIS_MODULE,
Bartlomiej Zolnierkiewicz8604aff2005-05-26 14:55:34 +02003327 .name = "ide-cdrom",
3328 .bus = &ide_bus_type,
Bartlomiej Zolnierkiewicz8604aff2005-05-26 14:55:34 +02003329 },
Russell King4031bbe2006-01-06 11:41:00 +00003330 .probe = ide_cd_probe,
3331 .remove = ide_cd_remove,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003332 .version = IDECD_VERSION,
3333 .media = ide_cdrom,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003334 .supports_dsc_overlap = 1,
Linus Torvalds1da177e2005-04-16 15:20:36 -07003335 .do_request = ide_do_rw_cdrom,
3336 .end_request = ide_end_request,
3337 .error = __ide_error,
3338 .abort = __ide_abort,
Bartlomiej Zolnierkiewicz7662d042007-05-10 00:01:10 +02003339#ifdef CONFIG_IDE_PROC_FS
Linus Torvalds1da177e2005-04-16 15:20:36 -07003340 .proc = idecd_proc,
Bartlomiej Zolnierkiewicz7662d042007-05-10 00:01:10 +02003341#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -07003342};
3343
3344static int idecd_open(struct inode * inode, struct file * file)
3345{
3346 struct gendisk *disk = inode->i_bdev->bd_disk;
3347 struct cdrom_info *info;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003348 int rc = -ENOMEM;
3349
3350 if (!(info = ide_cd_get(disk)))
3351 return -ENXIO;
3352
Linus Torvalds1da177e2005-04-16 15:20:36 -07003353 if (!info->buffer)
Bartlomiej Zolnierkiewiczc94964a2007-02-17 02:40:24 +01003354 info->buffer = kmalloc(SECTOR_BUFFER_SIZE, GFP_KERNEL|__GFP_REPEAT);
3355
3356 if (info->buffer)
3357 rc = cdrom_open(&info->devinfo, inode, file);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003358
3359 if (rc < 0)
3360 ide_cd_put(info);
3361
3362 return rc;
3363}
3364
3365static int idecd_release(struct inode * inode, struct file * file)
3366{
3367 struct gendisk *disk = inode->i_bdev->bd_disk;
3368 struct cdrom_info *info = ide_cd_g(disk);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003369
3370 cdrom_release (&info->devinfo, file);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003371
3372 ide_cd_put(info);
3373
3374 return 0;
3375}
3376
Christoph Hellwig6a2900b2006-03-23 03:00:15 -08003377static int idecd_set_spindown(struct cdrom_device_info *cdi, unsigned long arg)
3378{
3379 struct packet_command cgc;
3380 char buffer[16];
3381 int stat;
3382 char spindown;
3383
3384 if (copy_from_user(&spindown, (void __user *)arg, sizeof(char)))
3385 return -EFAULT;
3386
3387 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
3388
3389 stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0);
3390 if (stat)
3391 return stat;
3392
3393 buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f);
3394 return cdrom_mode_select(cdi, &cgc);
3395}
3396
3397static int idecd_get_spindown(struct cdrom_device_info *cdi, unsigned long arg)
3398{
3399 struct packet_command cgc;
3400 char buffer[16];
3401 int stat;
3402 char spindown;
3403
3404 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
3405
3406 stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0);
3407 if (stat)
3408 return stat;
3409
3410 spindown = buffer[11] & 0x0f;
3411 if (copy_to_user((void __user *)arg, &spindown, sizeof (char)))
3412 return -EFAULT;
3413 return 0;
3414}
3415
Linus Torvalds1da177e2005-04-16 15:20:36 -07003416static int idecd_ioctl (struct inode *inode, struct file *file,
3417 unsigned int cmd, unsigned long arg)
3418{
3419 struct block_device *bdev = inode->i_bdev;
3420 struct cdrom_info *info = ide_cd_g(bdev->bd_disk);
3421 int err;
3422
Christoph Hellwig6a2900b2006-03-23 03:00:15 -08003423 switch (cmd) {
3424 case CDROMSETSPINDOWN:
3425 return idecd_set_spindown(&info->devinfo, arg);
3426 case CDROMGETSPINDOWN:
3427 return idecd_get_spindown(&info->devinfo, arg);
3428 default:
3429 break;
3430 }
3431
3432 err = generic_ide_ioctl(info->drive, file, bdev, cmd, arg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003433 if (err == -EINVAL)
3434 err = cdrom_ioctl(file, &info->devinfo, inode, cmd, arg);
3435
3436 return err;
3437}
3438
3439static int idecd_media_changed(struct gendisk *disk)
3440{
3441 struct cdrom_info *info = ide_cd_g(disk);
3442 return cdrom_media_changed(&info->devinfo);
3443}
3444
3445static int idecd_revalidate_disk(struct gendisk *disk)
3446{
3447 struct cdrom_info *info = ide_cd_g(disk);
3448 struct request_sense sense;
3449 cdrom_read_toc(info->drive, &sense);
3450 return 0;
3451}
3452
3453static struct block_device_operations idecd_ops = {
3454 .owner = THIS_MODULE,
3455 .open = idecd_open,
3456 .release = idecd_release,
3457 .ioctl = idecd_ioctl,
3458 .media_changed = idecd_media_changed,
3459 .revalidate_disk= idecd_revalidate_disk
3460};
3461
3462/* options */
3463static char *ignore = NULL;
3464
3465module_param(ignore, charp, 0400);
3466MODULE_DESCRIPTION("ATAPI CD-ROM Driver");
3467
Russell King4031bbe2006-01-06 11:41:00 +00003468static int ide_cd_probe(ide_drive_t *drive)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003469{
3470 struct cdrom_info *info;
3471 struct gendisk *g;
3472 struct request_sense sense;
3473
3474 if (!strstr("ide-cdrom", drive->driver_req))
3475 goto failed;
3476 if (!drive->present)
3477 goto failed;
3478 if (drive->media != ide_cdrom && drive->media != ide_optical)
3479 goto failed;
3480 /* skip drives that we were told to ignore */
3481 if (ignore != NULL) {
3482 if (strstr(ignore, drive->name)) {
3483 printk(KERN_INFO "ide-cd: ignoring drive %s\n", drive->name);
3484 goto failed;
3485 }
3486 }
3487 if (drive->scsi) {
3488 printk(KERN_INFO "ide-cd: passing drive %s to ide-scsi emulation.\n", drive->name);
3489 goto failed;
3490 }
Deepak Saxenaf5e3c2f2005-11-07 01:01:25 -08003491 info = kzalloc(sizeof(struct cdrom_info), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003492 if (info == NULL) {
3493 printk(KERN_ERR "%s: Can't allocate a cdrom structure\n", drive->name);
3494 goto failed;
3495 }
3496
3497 g = alloc_disk(1 << PARTN_BITS);
3498 if (!g)
3499 goto out_free_cd;
3500
3501 ide_init_disk(g, drive);
3502
Bartlomiej Zolnierkiewicz7662d042007-05-10 00:01:10 +02003503 ide_proc_register_driver(drive, &ide_cdrom_driver);
Bartlomiej Zolnierkiewicz8604aff2005-05-26 14:55:34 +02003504
Linus Torvalds1da177e2005-04-16 15:20:36 -07003505 kref_init(&info->kref);
3506
3507 info->drive = drive;
3508 info->driver = &ide_cdrom_driver;
3509 info->disk = g;
3510
3511 g->private_data = &info->driver;
3512
3513 drive->driver_data = info;
3514
Linus Torvalds1da177e2005-04-16 15:20:36 -07003515 g->minors = 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003516 g->driverfs_dev = &drive->gendev;
3517 g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE;
3518 if (ide_cdrom_setup(drive)) {
Bartlomiej Zolnierkiewicz7662d042007-05-10 00:01:10 +02003519 ide_proc_unregister_driver(drive, &ide_cdrom_driver);
Bartlomiej Zolnierkiewicz05017db2007-12-24 15:23:43 +01003520 ide_cd_release(&info->kref);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003521 goto failed;
3522 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07003523
3524 cdrom_read_toc(drive, &sense);
3525 g->fops = &idecd_ops;
3526 g->flags |= GENHD_FL_REMOVABLE;
3527 add_disk(g);
3528 return 0;
3529
Linus Torvalds1da177e2005-04-16 15:20:36 -07003530out_free_cd:
3531 kfree(info);
3532failed:
Bartlomiej Zolnierkiewicz8604aff2005-05-26 14:55:34 +02003533 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003534}
3535
3536static void __exit ide_cdrom_exit(void)
3537{
Bartlomiej Zolnierkiewicz8604aff2005-05-26 14:55:34 +02003538 driver_unregister(&ide_cdrom_driver.gen_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003539}
Bartlomiej Zolnierkiewicz17514e82005-11-19 22:24:35 +01003540
3541static int __init ide_cdrom_init(void)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003542{
Bartlomiej Zolnierkiewicz8604aff2005-05-26 14:55:34 +02003543 return driver_register(&ide_cdrom_driver.gen_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003544}
3545
Kay Sievers263756e2005-12-12 18:03:44 +01003546MODULE_ALIAS("ide:*m-cdrom*");
Linus Torvalds1da177e2005-04-16 15:20:36 -07003547module_init(ide_cdrom_init);
3548module_exit(ide_cdrom_exit);
3549MODULE_LICENSE("GPL");