1 /*
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 accomodated 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.
123 * 3.11 Apr 29, 1996 -- Patch from Heiko Eissfeldt <heiko@colossus.escape.de>
124 * 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
132 * from Ben Galliart <bgallia@luc.edu> with
133 * special help from Jeff Lightfoot
134 * <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.
140 *
141 *
142 * 4.00 Nov 5, 1996 -- New ide-cd maintainer,
143 * Erik B. Andersen <andersee@debian.org>
144 * -- Newer Creative drives don't always set the error
145 * register correctly. Make sure we see media changes
146 * regardless.
147 * -- Integrate with generic cdrom driver.
148 * -- CDROMGETSPINDOWN and CDROMSETSPINDOWN ioctls, based on
149 * a patch from Ciro Cattuto <>.
150 * -- Call set_device_ro.
151 * -- Implement CDROMMECHANISMSTATUS and CDROMSLOTTABLE
152 * ioctls, based on patch by Erik Andersen
153 * -- Add some probes of drive capability during setup.
154 *
155 * 4.01 Nov 11, 1996 -- Split into ide-cd.c and ide-cd.h
156 * -- Removed CDROMMECHANISMSTATUS and CDROMSLOTTABLE
157 * ioctls in favor of a generalized approach
158 * using the generic cdrom driver.
159 * -- Fully integrated with the 2.1.X kernel.
160 * -- Other stuff that I forgot (lots of changes)
161 *
162 * 4.02 Dec 01, 1996 -- Applied patch from Gadi Oxman <gadio@netvision.net.il>
163 * to fix the drive door locking problems.
164 *
165 * 4.03 Dec 04, 1996 -- Added DSC overlap support.
166 * 4.04 Dec 29, 1996 -- Added CDROMREADRAW ioclt based on patch
167 * by Ales Makarov (xmakarov@sun.felk.cvut.cz)
168 *
169 * 4.05 Nov 20, 1997 -- Modified to print more drive info on init
170 * Minor other changes
171 * Fix errors on CDROMSTOP (If you have a "Dolphin",
172 * you must define IHAVEADOLPHIN)
173 * Added identifier so new Sanyo CD-changer works
174 * Better detection if door locking isn't supported
175 *
176 * 4.06 Dec 17, 1997 -- fixed endless "tray open" messages -ml
177 * 4.07 Dec 17, 1997 -- fallback to set pc->stat on "tray open"
178 * 4.08 Dec 18, 1997 -- spew less noise when tray is empty
179 * -- fix speed display for ACER 24X, 18X
180 * 4.09 Jan 04, 1998 -- fix handling of the last block so we return
181 * an end of file instead of an I/O error (Gadi)
182 * 4.10 Jan 24, 1998 -- fixed a bug so now changers can change to a new
183 * slot when there is no disc in the current slot.
184 * -- Fixed a memory leak where info->changer_info was
185 * malloc'ed but never free'd when closing the device.
186 * -- Cleaned up the global namespace a bit by making more
187 * functions static that should already have been.
188 * 4.11 Mar 12, 1998 -- Added support for the CDROM_SELECT_SPEED ioctl
189 * based on a patch for 2.0.33 by Jelle Foks
190 * <jelle@scintilla.utwente.nl>, a patch for 2.0.33
191 * by Toni Giorgino <toni@pcape2.pi.infn.it>, the SCSI
192 * version, and my own efforts. -erik
193 * -- Fixed a stupid bug which egcs was kind enough to
194 * inform me of where "Illegal mode for this track"
195 * was never returned due to a comparison on data
196 * types of limited range.
197 * 4.12 Mar 29, 1998 -- Fixed bug in CDROM_SELECT_SPEED so write speed is
198 * now set ionly for CD-R and CD-RW drives. I had
199 * removed this support because it produced errors.
200 * It produced errors _only_ for non-writers. duh.
201 * 4.13 May 05, 1998 -- Suppress useless "in progress of becoming ready"
202 * messages, since this is not an error.
203 * -- Change error messages to be const
204 * -- Remove a "\t" which looks ugly in the syslogs
205 * 4.14 July 17, 1998 -- Change to pointing to .ps version of ATAPI spec
206 * since the .pdf version doesn't seem to work...
207 * -- Updated the TODO list to something more current.
208 *
209 * 4.15 Aug 25, 1998 -- Updated ide-cd.h to respect mechine endianess,
210 * patch thanks to "Eddie C. Dost" <ecd@skynet.be>
211 *
212 * 4.50 Oct 19, 1998 -- New maintainers!
213 * Jens Axboe <axboe@image.dk>
214 * Chris Zwilling <chris@cloudnet.com>
215 *
216 * 4.51 Dec 23, 1998 -- Jens Axboe <axboe@image.dk>
217 * - ide_cdrom_reset enabled since the ide subsystem
218 * handles resets fine now. <axboe@image.dk>
219 * - Transfer size fix for Samsung CD-ROMs, thanks to
220 * "Ville Hallik" <ville.hallik@mail.ee>.
221 * - other minor stuff.
222 *
223 * 4.52 Jan 19, 1999 -- Jens Axboe <axboe@image.dk>
224 * - Detect DVD-ROM/RAM drives
225 *
226 * 4.53 Feb 22, 1999 - Include other model Samsung and one Goldstar
227 * drive in transfer size limit.
228 * - Fix the I/O error when doing eject without a medium
229 * loaded on some drives.
230 * - CDROMREADMODE2 is now implemented through
231 * CDROMREADRAW, since many drives don't support
232 * MODE2 (even though ATAPI 2.6 says they must).
233 * - Added ignore parameter to ide-cd (as a module), eg
234 * insmod ide-cd ignore='hda hdb'
235 * Useful when using ide-cd in conjunction with
236 * ide-scsi. TODO: non-modular way of doing the
237 * same.
238 *
239 * 4.54 Aug 5, 1999 - Support for MMC2 class commands through the generic
240 * packet interface to cdrom.c.
241 * - Unified audio ioctl support, most of it.
242 * - cleaned up various deprecated verify_area().
243 * - Added ide_cdrom_packet() as the interface for
244 * the Uniform generic_packet().
245 * - bunch of other stuff, will fill in logs later.
246 * - report 1 slot for non-changers, like the other
247 * cd-rom drivers. don't report select disc for
248 * non-changers as well.
249 * - mask out audio playing, if the device can't do it.
250 *
251 * 4.55 Sep 1, 1999 - Eliminated the rest of the audio ioctls, except
252 * for CDROMREADTOC[ENTRY|HEADER]. Some of the drivers
253 * use this independently of the actual audio handling.
254 * They will disappear later when I get the time to
255 * do it cleanly.
256 * - Minimize the TOC reading - only do it when we
257 * know a media change has occurred.
258 * - Moved all the CDROMREADx ioctls to the Uniform layer.
259 * - Heiko Eissfeldt <heiko@colossus.escape.de> supplied
260 * some fixes for CDI.
261 * - CD-ROM leaving door locked fix from Andries
262 * Brouwer <Andries.Brouwer@cwi.nl>
263 * - Erik Andersen <andersen@xmission.com> unified
264 * commands across the various drivers and how
265 * sense errors are handled.
266 *
267 * 4.56 Sep 12, 1999 - Removed changer support - it is now in the
268 * Uniform layer.
269 * - Added partition based multisession handling.
270 * - Mode sense and mode select moved to the
271 * Uniform layer.
272 * - Fixed a problem with WPI CDS-32X drive - it
273 * failed the capabilities
274 *
275 * 4.57 Apr 7, 2000 - Fixed sense reporting.
276 * - Fixed possible oops in ide_cdrom_get_last_session()
277 * - Fix locking mania and make ide_cdrom_reset relock
278 * - Stop spewing errors to log when magicdev polls with
279 * TEST_UNIT_READY on some drives.
280 * - Various fixes from Tobias Ringstrom:
281 * tray if it was locked prior to the reset.
282 * - cdrom_read_capacity returns one frame too little.
283 * - Fix real capacity reporting.
284 *
285 * 4.58 May 1, 2000 - Clean up ACER50 stuff.
286 * - Fix small problem with ide_cdrom_capacity
287 *
288 * 4.59 Aug 11, 2000 - Fix changer problem in cdrom_read_toc, we weren't
289 * correctly sensing a disc change.
290 * - Rearranged some code
291 * - Use extended sense on drives that support it for
292 * correctly reporting tray status -- from
293 * Michael D Johnson <johnsom@orst.edu>
294 *
295 *************************************************************************/
296
297 #define IDECD_VERSION "4.59-ac1"
298
299 #include <linux/config.h>
300 #include <linux/module.h>
301 #include <linux/types.h>
302 #include <linux/kernel.h>
303 #include <linux/delay.h>
304 #include <linux/timer.h>
305 #include <linux/slab.h>
306 #include <linux/interrupt.h>
307 #include <linux/errno.h>
308 #include <linux/cdrom.h>
309 #include <linux/ide.h>
310 #include <linux/completion.h>
311
312 #include <asm/irq.h>
313 #include <asm/io.h>
314 #include <asm/byteorder.h>
315 #include <asm/uaccess.h>
316 #include <asm/unaligned.h>
317
318 #include "ide-cd.h"
319
320 /****************************************************************************
321 * Generic packet command support and error handling routines.
322 */
323
324 /* Mark that we've seen a media change, and invalidate our internal
325 buffers. */
cdrom_saw_media_change(ide_drive_t * drive)326 static void cdrom_saw_media_change (ide_drive_t *drive)
327 {
328 struct cdrom_info *info = drive->driver_data;
329
330 CDROM_STATE_FLAGS (drive)->media_changed = 1;
331 CDROM_STATE_FLAGS (drive)->toc_valid = 0;
332 info->nsectors_buffered = 0;
333 }
334
cdrom_log_sense(ide_drive_t * drive,struct packet_command * pc,struct request_sense * sense)335 static int cdrom_log_sense(ide_drive_t *drive, struct packet_command *pc,
336 struct request_sense *sense)
337 {
338 int log = 0;
339
340 if (sense == NULL || pc == NULL || pc->quiet)
341 return 0;
342
343 switch (sense->sense_key) {
344 case NO_SENSE: case RECOVERED_ERROR:
345 break;
346 case NOT_READY:
347 /*
348 * don't care about tray state messages for
349 * e.g. capacity commands or in-progress or
350 * becoming ready
351 */
352 if (sense->asc == 0x3a || sense->asc == 0x04)
353 break;
354 log = 1;
355 break;
356 case UNIT_ATTENTION:
357 /*
358 * Make good and sure we've seen this potential media
359 * change. Some drives (i.e. Creative) fail to present
360 * the correct sense key in the error register.
361 */
362 cdrom_saw_media_change(drive);
363 break;
364 default:
365 log = 1;
366 break;
367 }
368 return log;
369 }
370
371 static
cdrom_analyze_sense_data(ide_drive_t * drive,struct packet_command * failed_command,struct request_sense * sense)372 void cdrom_analyze_sense_data(ide_drive_t *drive,
373 struct packet_command *failed_command,
374 struct request_sense *sense)
375 {
376
377 if (!cdrom_log_sense(drive, failed_command, sense))
378 return;
379
380 /*
381 * If a read toc is executed for a CD-R or CD-RW medium where
382 * the first toc has not been recorded yet, it will fail with
383 * 05/24/00 (which is a confusing error)
384 */
385 if (failed_command && failed_command->c[0] == GPCMD_READ_TOC_PMA_ATIP)
386 if (sense->sense_key == 0x05 && sense->asc == 0x24)
387 return;
388
389 #if VERBOSE_IDE_CD_ERRORS
390 {
391 int i;
392 const char *s;
393 char buf[80];
394
395 printk ("ATAPI device %s:\n", drive->name);
396 if (sense->error_code==0x70)
397 printk(" Error: ");
398 else if (sense->error_code==0x71)
399 printk(" Deferred Error: ");
400 else if (sense->error_code == 0x7f)
401 printk(" Vendor-specific Error: ");
402 else
403 printk(" Unknown Error Type: ");
404
405 if (sense->sense_key < ARY_LEN(sense_key_texts))
406 s = sense_key_texts[sense->sense_key];
407 else
408 s = "bad sense key!";
409
410 printk("%s -- (Sense key=0x%02x)\n", s, sense->sense_key);
411
412 if (sense->asc == 0x40) {
413 sprintf(buf, "Diagnostic failure on component 0x%02x",
414 sense->ascq);
415 s = buf;
416 } else {
417 int lo = 0, mid, hi = ARY_LEN(sense_data_texts);
418 unsigned long key = (sense->sense_key << 16);
419 key |= (sense->asc << 8);
420 if (!(sense->ascq >= 0x80 && sense->ascq <= 0xdd))
421 key |= sense->ascq;
422 s = NULL;
423
424 while (hi > lo) {
425 mid = (lo + hi) / 2;
426 if (sense_data_texts[mid].asc_ascq == key ||
427 sense_data_texts[mid].asc_ascq == (0xff0000|key)) {
428 s = sense_data_texts[mid].text;
429 break;
430 }
431 else if (sense_data_texts[mid].asc_ascq > key)
432 hi = mid;
433 else
434 lo = mid+1;
435 }
436 }
437
438 if (s == NULL) {
439 if (sense->asc > 0x80)
440 s = "(vendor-specific error)";
441 else
442 s = "(reserved error code)";
443 }
444
445 printk(" %s -- (asc=0x%02x, ascq=0x%02x)\n",
446 s, sense->asc, sense->ascq);
447
448 if (failed_command != NULL) {
449
450 int lo=0, mid, hi= ARY_LEN (packet_command_texts);
451 s = NULL;
452
453 while (hi > lo) {
454 mid = (lo + hi) / 2;
455 if (packet_command_texts[mid].packet_command ==
456 failed_command->c[0]) {
457 s = packet_command_texts[mid].text;
458 break;
459 }
460 if (packet_command_texts[mid].packet_command >
461 failed_command->c[0])
462 hi = mid;
463 else
464 lo = mid+1;
465 }
466
467 printk (" The failed \"%s\" packet command was: \n \"", s);
468 for (i=0; i<sizeof (failed_command->c); i++)
469 printk ("%02x ", failed_command->c[i]);
470 printk ("\"\n");
471 }
472
473 /* The SKSV bit specifies validity of the sense_key_specific
474 * in the next two commands. It is bit 7 of the first byte.
475 * In the case of NOT_READY, if SKSV is set the drive can
476 * give us nice ETA readings.
477 */
478 if (sense->sense_key == NOT_READY && (sense->sks[0] & 0x80)) {
479 int progress = (sense->sks[1] << 8 | sense->sks[2]) * 100;
480 printk(" Command is %02d%% complete\n", progress / 0xffff);
481
482 }
483
484 if (sense->sense_key == ILLEGAL_REQUEST &&
485 (sense->sks[0] & 0x80) != 0) {
486 printk(" Error in %s byte %d",
487 (sense->sks[0] & 0x40) != 0 ?
488 "command packet" : "command data",
489 (sense->sks[1] << 8) + sense->sks[2]);
490
491 if ((sense->sks[0] & 0x40) != 0)
492 printk (" bit %d", sense->sks[0] & 0x07);
493
494 printk ("\n");
495 }
496 }
497
498 #else /* not VERBOSE_IDE_CD_ERRORS */
499
500 /* Suppress printing unit attention and `in progress of becoming ready'
501 errors when we're not being verbose. */
502
503 if (sense->sense_key == UNIT_ATTENTION ||
504 (sense->sense_key == NOT_READY && (sense->asc == 4 ||
505 sense->asc == 0x3a)))
506 return;
507
508 printk("%s: error code: 0x%02x sense_key: 0x%02x asc: 0x%02x ascq: 0x%02x\n",
509 drive->name,
510 sense->error_code, sense->sense_key,
511 sense->asc, sense->ascq);
512 #endif /* not VERBOSE_IDE_CD_ERRORS */
513 }
514
cdrom_queue_request_sense(ide_drive_t * drive,struct completion * wait,struct request_sense * sense,struct packet_command * failed_command)515 static void cdrom_queue_request_sense(ide_drive_t *drive,
516 struct completion *wait,
517 struct request_sense *sense,
518 struct packet_command *failed_command)
519 {
520 struct cdrom_info *info = drive->driver_data;
521 struct packet_command *pc = &info->request_sense_pc;
522 struct request *rq;
523
524 if (sense == NULL)
525 sense = &info->sense_data;
526
527 memset(pc, 0, sizeof(struct packet_command));
528 pc->c[0] = GPCMD_REQUEST_SENSE;
529 pc->c[4] = pc->buflen = 18;
530 pc->buffer = (char *) sense;
531 pc->sense = (struct request_sense *) failed_command;
532
533 /* stuff the sense request in front of our current request */
534 rq = &info->request_sense_request;
535 ide_init_drive_cmd(rq);
536 rq->cmd = REQUEST_SENSE_COMMAND;
537 rq->buffer = (char *) pc;
538 rq->waiting = wait;
539 (void) ide_do_drive_cmd(drive, rq, ide_preempt);
540 }
541
542
543 /*
544 * This is our end_request replacement function.
545 */
ide_cdrom_end_request(ide_drive_t * drive,int uptodate)546 static int ide_cdrom_end_request (ide_drive_t *drive, int uptodate)
547 {
548 struct request *rq;
549 unsigned long flags;
550 int ret = 1;
551
552 spin_lock_irqsave(&io_request_lock, flags);
553 rq = HWGROUP(drive)->rq;
554
555 /*
556 * decide whether to reenable DMA -- 3 is a random magic for now,
557 * if we DMA timeout more than 3 times, just stay in PIO
558 */
559 if (drive->state == DMA_PIO_RETRY && drive->retry_pio <= 3) {
560 drive->state = 0;
561 HWGROUP(drive)->hwif->ide_dma_on(drive);
562 }
563
564 if (!end_that_request_first(rq, uptodate, drive->name)) {
565 add_blkdev_randomness(MAJOR(rq->rq_dev));
566 blkdev_dequeue_request(rq);
567 HWGROUP(drive)->rq = NULL;
568 end_that_request_last(rq);
569 ret = 0;
570 }
571 spin_unlock_irqrestore(&io_request_lock, flags);
572 return ret;
573 }
574
575 /*
576 * Error reporting, in human readable form (luxurious, but a memory hog).
577 */
ide_cdrom_dump_status(ide_drive_t * drive,const char * msg,byte stat)578 byte ide_cdrom_dump_status (ide_drive_t *drive, const char *msg, byte stat)
579 {
580 unsigned long flags;
581
582 atapi_status_t status;
583 atapi_error_t error;
584
585 status.all = stat;
586 local_irq_set(flags);
587 printk("%s: %s: status=0x%02x", drive->name, msg, stat);
588 #if FANCY_STATUS_DUMPS
589 printk(" { ");
590 if (status.b.bsy)
591 printk("Busy ");
592 else {
593 if (status.b.drdy) printk("DriveReady ");
594 if (status.b.df) printk("DeviceFault ");
595 if (status.b.dsc) printk("SeekComplete ");
596 if (status.b.drq) printk("DataRequest ");
597 if (status.b.corr) printk("CorrectedError ");
598 if (status.b.idx) printk("Index ");
599 if (status.b.check) printk("Error ");
600 }
601 printk("}");
602 #endif /* FANCY_STATUS_DUMPS */
603 printk("\n");
604 if ((status.all & (status.b.bsy|status.b.check)) == status.b.check) {
605 error.all = HWIF(drive)->INB(IDE_ERROR_REG);
606 printk("%s: %s: error=0x%02x", drive->name, msg, error.all);
607 #if FANCY_STATUS_DUMPS
608 if (error.b.ili) printk("IllegalLengthIndication ");
609 if (error.b.eom) printk("EndOfMedia ");
610 if (error.b.abrt) printk("Aborted Command ");
611 if (error.b.mcr) printk("MediaChangeRequested ");
612 if (error.b.sense_key) printk("LastFailedSense 0x%02x ",
613 error.b.sense_key);
614 #endif /* FANCY_STATUS_DUMPS */
615 printk("\n");
616 }
617 local_irq_restore(flags);
618 return error.all;
619 }
620
621 /*
622 * ide_error() takes action based on the error returned by the drive.
623 */
ide_cdrom_error(ide_drive_t * drive,const char * msg,byte stat)624 ide_startstop_t ide_cdrom_error (ide_drive_t *drive, const char *msg, byte stat)
625 {
626 struct request *rq;
627 byte err;
628
629 err = ide_cdrom_dump_status(drive, msg, stat);
630 if (drive == NULL || (rq = HWGROUP(drive)->rq) == NULL)
631 return ide_stopped;
632 /* retry only "normal" I/O: */
633 if (rq->cmd == IDE_DRIVE_CMD || rq->cmd == IDE_DRIVE_TASK) {
634 rq->errors = 1;
635 ide_end_drive_cmd(drive, stat, err);
636 return ide_stopped;
637 }
638
639 if (stat & BUSY_STAT || ((stat & WRERR_STAT) && !drive->nowerr)) {
640 /* other bits are useless when BUSY */
641 rq->errors |= ERROR_RESET;
642 } else {
643 /* add decoding error stuff */
644 }
645 if (HWIF(drive)->INB(IDE_STATUS_REG) & (BUSY_STAT|DRQ_STAT))
646 /* force an abort */
647 HWIF(drive)->OUTB(WIN_IDLEIMMEDIATE,IDE_COMMAND_REG);
648 if (rq->errors >= ERROR_MAX) {
649 DRIVER(drive)->end_request(drive, 0);
650 } else {
651 if ((rq->errors & ERROR_RESET) == ERROR_RESET) {
652 ++rq->errors;
653 return ide_do_reset(drive);
654 }
655 ++rq->errors;
656 }
657 return ide_stopped;
658 }
659
ide_cdrom_abort(ide_drive_t * drive,const char * msg)660 ide_startstop_t ide_cdrom_abort (ide_drive_t *drive, const char *msg)
661 {
662 struct request *rq;
663
664 if (drive == NULL || (rq = HWGROUP(drive)->rq) == NULL)
665 return ide_stopped;
666 /* retry only "normal" I/O: */
667 if (rq->cmd == IDE_DRIVE_CMD || rq->cmd == IDE_DRIVE_TASK) {
668 rq->errors = 1;
669 ide_end_drive_cmd(drive, BUSY_STAT, 0);
670 return ide_stopped;
671 }
672 rq->errors |= ERROR_RESET;
673 DRIVER(drive)->end_request(drive, 0);
674 return ide_stopped;
675 }
676
cdrom_end_request(ide_drive_t * drive,int uptodate)677 static void cdrom_end_request (ide_drive_t *drive, int uptodate)
678 {
679 struct request *rq = HWGROUP(drive)->rq;
680
681 if (rq->cmd == REQUEST_SENSE_COMMAND && uptodate) {
682 struct packet_command *pc = (struct packet_command *) rq->buffer;
683 cdrom_analyze_sense_data(drive,
684 (struct packet_command *) pc->sense,
685 (struct request_sense *) (pc->buffer - pc->c[4]));
686 }
687 if (blk_fs_request(rq) && !rq->current_nr_sectors)
688 uptodate = 1;
689
690 ide_cdrom_end_request(drive, uptodate);
691 }
692
693
694 /* Returns 0 if the request should be continued.
695 Returns 1 if the request was ended. */
cdrom_decode_status(ide_startstop_t * startstop,ide_drive_t * drive,int good_stat,int * stat_ret)696 static int cdrom_decode_status (ide_startstop_t *startstop, ide_drive_t *drive,
697 int good_stat, int *stat_ret)
698 {
699 struct request *rq = HWGROUP(drive)->rq;
700 int stat, err, sense_key;
701 struct packet_command *pc;
702
703 /* Check for errors. */
704 *stat_ret = stat = HWIF(drive)->INB(IDE_STATUS_REG);
705
706 if (OK_STAT (stat, good_stat, BAD_R_STAT))
707 return 0;
708
709 /* Get the IDE error register. */
710 err = HWIF(drive)->INB(IDE_ERROR_REG);
711 sense_key = err >> 4;
712
713 if (rq == NULL) {
714 printk("%s: missing rq in cdrom_decode_status\n", drive->name);
715 *startstop = ide_stopped;
716 return 1;
717 }
718
719 if (rq->cmd == REQUEST_SENSE_COMMAND) {
720 /* We got an error trying to get sense info
721 from the drive (probably while trying
722 to recover from a former error). Just give up. */
723
724 pc = (struct packet_command *) rq->buffer;
725 pc->stat = 1;
726 cdrom_end_request(drive, 1);
727 *startstop = DRIVER(drive)->error(drive, "request sense failure", stat);
728 return 1;
729
730 } else if (rq->cmd == PACKET_COMMAND) {
731 /* All other functions, except for READ. */
732 struct completion *wait = NULL;
733 pc = (struct packet_command *) rq->buffer;
734
735 /* Check for tray open. */
736 if (sense_key == NOT_READY) {
737 cdrom_saw_media_change (drive);
738 } else if (sense_key == UNIT_ATTENTION) {
739 /* Check for media change. */
740 cdrom_saw_media_change (drive);
741 /*printk("%s: media changed\n",drive->name);*/
742 return 0;
743 } else if (!pc->quiet) {
744 /* Otherwise, print an error. */
745 ide_dump_status(drive, "packet command error", stat);
746 }
747
748 /* Set the error flag and complete the request.
749 Then, if we have a CHECK CONDITION status,
750 queue a request sense command. We must be careful,
751 though: we don't want the thread in
752 cdrom_queue_packet_command to wake up until
753 the request sense has completed. We do this
754 by transferring the semaphore from the packet
755 command request to the request sense request. */
756
757 if ((stat & ERR_STAT) != 0) {
758 wait = rq->waiting;
759 rq->waiting = NULL;
760 }
761
762 pc->stat = 1;
763 cdrom_end_request(drive, 1);
764
765 if ((stat & ERR_STAT) != 0)
766 cdrom_queue_request_sense(drive, wait, pc->sense, pc);
767 } else if (blk_fs_request(rq)) {
768 int do_end_request = 0;
769
770 /* Handle errors from READ and WRITE requests. */
771
772 if (sense_key == NOT_READY) {
773 /* Tray open. */
774 cdrom_saw_media_change (drive);
775
776 /* Fail the request. */
777 printk ("%s: tray open\n", drive->name);
778 do_end_request = 1;
779 } else if (sense_key == UNIT_ATTENTION) {
780 /* Media change. */
781 cdrom_saw_media_change (drive);
782
783 /* Arrange to retry the request.
784 But be sure to give up if we've retried
785 too many times. */
786 if (++rq->errors > ERROR_MAX)
787 do_end_request = 1;
788 } else if (sense_key == ILLEGAL_REQUEST ||
789 sense_key == DATA_PROTECT) {
790 /* No point in retrying after an illegal
791 request or data protect error.*/
792 ide_dump_status (drive, "command error", stat);
793 do_end_request = 1;
794 } else if (sense_key == MEDIUM_ERROR) {
795 /* No point in re-trying a zillion times on a bad
796 * sector... If we got here the error is not correctable */
797 ide_dump_status (drive, "media error (bad sector)", stat);
798 do_end_request = 1;
799 } else if ((err & ~ABRT_ERR) != 0) {
800 /* Go to the default handler
801 for other errors. */
802 *startstop = DRIVER(drive)->error(drive, "cdrom_decode_status", stat);
803 return 1;
804 } else if ((++rq->errors > ERROR_MAX)) {
805 /* We've racked up too many retries. Abort. */
806 do_end_request = 1;
807 }
808
809 if (do_end_request)
810 cdrom_end_request(drive, 0);
811
812 /* If we got a CHECK_CONDITION status,
813 queue a request sense command. */
814 if ((stat & ERR_STAT) != 0)
815 cdrom_queue_request_sense(drive, NULL, NULL, NULL);
816 }
817
818 /* Retry, or handle the next request. */
819 *startstop = ide_stopped;
820 return 1;
821 }
822
cdrom_timer_expiry(ide_drive_t * drive)823 static int cdrom_timer_expiry(ide_drive_t *drive)
824 {
825 struct request *rq = HWGROUP(drive)->rq;
826 struct packet_command *pc = (struct packet_command *) rq->buffer;
827 unsigned long wait = 0;
828
829 /*
830 * Some commands are *slow* and normally take a long time to
831 * complete. Usually we can use the ATAPI "disconnect" to bypass
832 * this, but not all commands/drives support that. Let
833 * ide_timer_expiry keep polling us for these.
834 */
835 switch (pc->c[0]) {
836 case GPCMD_BLANK:
837 case GPCMD_FORMAT_UNIT:
838 case GPCMD_RESERVE_RZONE_TRACK:
839 wait = WAIT_CMD;
840 break;
841 default:
842 wait = 0;
843 break;
844 }
845 return wait;
846 }
847
848 /* Set up the device registers for transferring a packet command on DEV,
849 expecting to later transfer XFERLEN bytes. HANDLER is the routine
850 which actually transfers the command to the drive. If this is a
851 drq_interrupt device, this routine will arrange for HANDLER to be
852 called when the interrupt from the drive arrives. Otherwise, HANDLER
853 will be called immediately after the drive is prepared for the transfer. */
854
cdrom_start_packet_command(ide_drive_t * drive,int xferlen,ide_handler_t * handler)855 static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive,
856 int xferlen,
857 ide_handler_t *handler)
858 {
859 ide_startstop_t startstop;
860 struct cdrom_info *info = drive->driver_data;
861
862 /* Wait for the controller to be idle. */
863 if (ide_wait_stat(&startstop, drive, 0, BUSY_STAT, WAIT_READY))
864 return startstop;
865
866 if (info->dma) {
867 if (info->cmd == READ) {
868 info->dma = !HWIF(drive)->ide_dma_read(drive);
869 } else if (info->cmd == WRITE) {
870 info->dma = !HWIF(drive)->ide_dma_write(drive);
871 } else {
872 printk("ide-cd: DMA set, but not allowed\n");
873 }
874 }
875
876 /* Set up the controller registers. */
877 /* FIXME: for Virtual DMA we must check harder */
878 HWIF(drive)->OUTB(info->dma, IDE_FEATURE_REG);
879 HWIF(drive)->OUTB(0, IDE_IREASON_REG);
880 HWIF(drive)->OUTB(0, IDE_SECTOR_REG);
881
882 HWIF(drive)->OUTB(xferlen & 0xff, IDE_BCOUNTL_REG);
883 HWIF(drive)->OUTB(xferlen >> 8 , IDE_BCOUNTH_REG);
884 if (IDE_CONTROL_REG)
885 HWIF(drive)->OUTB(drive->ctl, IDE_CONTROL_REG);
886
887 if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) {
888 /* packet command */
889 ide_execute_command(drive, WIN_PACKETCMD, handler, WAIT_CMD, cdrom_timer_expiry);
890 return ide_started;
891 } else {
892 /* packet command */
893 HWIF(drive)->OUTB(WIN_PACKETCMD, IDE_COMMAND_REG);
894 return (*handler) (drive);
895 }
896 }
897
898 /* Send a packet command to DRIVE described by CMD_BUF and CMD_LEN.
899 The device registers must have already been prepared
900 by cdrom_start_packet_command.
901 HANDLER is the interrupt handler to call when the command completes
902 or there's data ready. */
903 /*
904 * changed 5 parameters to 3 for dvd-ram
905 * struct packet_command *pc; now packet_command_t *pc;
906 */
cdrom_transfer_packet_command(ide_drive_t * drive,struct packet_command * pc,ide_handler_t * handler)907 static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive,
908 struct packet_command *pc,
909 ide_handler_t *handler)
910 {
911 unsigned char *cmd_buf = pc->c;
912 int cmd_len = sizeof(pc->c);
913 unsigned int timeout = pc->timeout;
914 struct cdrom_info *info = drive->driver_data;
915 ide_startstop_t startstop;
916
917 if (CDROM_CONFIG_FLAGS(drive)->drq_interrupt) {
918 /* Here we should have been called after receiving an interrupt
919 from the device. DRQ should how be set. */
920 int stat_dum;
921
922 /* Check for errors. */
923 if (cdrom_decode_status(&startstop, drive, DRQ_STAT, &stat_dum))
924 return startstop;
925 } else {
926 /* Otherwise, we must wait for DRQ to get set. */
927 if (ide_wait_stat(&startstop, drive, DRQ_STAT,
928 BUSY_STAT, WAIT_READY))
929 return startstop;
930 }
931
932 /* Arm the interrupt handler. */
933 ide_set_handler(drive, handler, timeout, cdrom_timer_expiry);
934
935 /* Send the command to the device. */
936 HWIF(drive)->atapi_output_bytes(drive, cmd_buf, cmd_len);
937
938 /* Start the DMA if need be */
939 if (info->dma)
940 (void) HWIF(drive)->ide_dma_begin(drive);
941
942 return ide_started;
943 }
944
945 /****************************************************************************
946 * Block read functions.
947 */
948
949 /*
950 * Buffer up to SECTORS_TO_TRANSFER sectors from the drive in our sector
951 * buffer. Once the first sector is added, any subsequent sectors are
952 * assumed to be continuous (until the buffer is cleared). For the first
953 * sector added, SECTOR is its sector number. (SECTOR is then ignored until
954 * the buffer is cleared.)
955 */
cdrom_buffer_sectors(ide_drive_t * drive,unsigned long sector,int sectors_to_transfer)956 static void cdrom_buffer_sectors (ide_drive_t *drive, unsigned long sector,
957 int sectors_to_transfer)
958 {
959 struct cdrom_info *info = drive->driver_data;
960
961 /* Number of sectors to read into the buffer. */
962 int sectors_to_buffer = MIN (sectors_to_transfer,
963 (SECTOR_BUFFER_SIZE >> SECTOR_BITS) -
964 info->nsectors_buffered);
965
966 char *dest;
967
968 /* If we couldn't get a buffer, don't try to buffer anything... */
969 if (info->buffer == NULL)
970 sectors_to_buffer = 0;
971
972 /* If this is the first sector in the buffer, remember its number. */
973 if (info->nsectors_buffered == 0)
974 info->sector_buffered = sector;
975
976 /* Read the data into the buffer. */
977 dest = info->buffer + info->nsectors_buffered * SECTOR_SIZE;
978 while (sectors_to_buffer > 0) {
979 HWIF(drive)->atapi_input_bytes(drive, dest, SECTOR_SIZE);
980 --sectors_to_buffer;
981 --sectors_to_transfer;
982 ++info->nsectors_buffered;
983 dest += SECTOR_SIZE;
984 }
985
986 /* Throw away any remaining data. */
987 while (sectors_to_transfer > 0) {
988 char dum[SECTOR_SIZE];
989 HWIF(drive)->atapi_input_bytes(drive, dum, sizeof (dum));
990 --sectors_to_transfer;
991 }
992 }
993
994 /*
995 * Check the contents of the interrupt reason register from the cdrom
996 * and attempt to recover if there are problems. Returns 0 if everything's
997 * ok; nonzero if the request has been terminated.
998 */
999 static inline
cdrom_read_check_ireason(ide_drive_t * drive,int len,int ireason)1000 int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason)
1001 {
1002 ireason &= 3;
1003 if (ireason == 2) return 0;
1004
1005 if (ireason == 0) {
1006 /* Whoops... The drive is expecting to receive data from us! */
1007 printk ("%s: cdrom_read_intr: "
1008 "Drive wants to transfer data the wrong way!\n",
1009 drive->name);
1010
1011 /* Throw some data at the drive so it doesn't hang
1012 and quit this request. */
1013 while (len > 0) {
1014 int dum = 0;
1015 HWIF(drive)->atapi_output_bytes(drive, &dum, sizeof (dum));
1016 len -= sizeof (dum);
1017 }
1018 } else if (ireason == 1) {
1019 /* Some drives (ASUS) seem to tell us that status
1020 * info is available. just get it and ignore.
1021 */
1022 (void) HWIF(drive)->INB(IDE_STATUS_REG);
1023 return 0;
1024 } else {
1025 /* Drive wants a command packet, or invalid ireason... */
1026 printk ("%s: cdrom_read_intr: bad interrupt reason %d\n",
1027 drive->name, ireason);
1028 }
1029
1030 cdrom_end_request(drive, 0);
1031 return -1;
1032 }
1033
1034 /*
1035 * Interrupt routine. Called when a read request has completed.
1036 */
cdrom_read_intr(ide_drive_t * drive)1037 static ide_startstop_t cdrom_read_intr (ide_drive_t *drive)
1038 {
1039 int stat;
1040 int ireason, len, sectors_to_transfer, nskip;
1041 struct cdrom_info *info = drive->driver_data;
1042 u8 lowcyl = 0, highcyl = 0;
1043 int i, dma = info->dma, dma_error = 0;
1044 ide_startstop_t startstop;
1045
1046 struct request *rq = HWGROUP(drive)->rq;
1047
1048 /* Check for errors. */
1049 if (dma) {
1050 info->dma = 0;
1051 if ((dma_error = HWIF(drive)->ide_dma_end(drive)))
1052 HWIF(drive)->ide_dma_off(drive);
1053 }
1054
1055 if (cdrom_decode_status (&startstop, drive, 0, &stat))
1056 return startstop;
1057
1058 if (dma) {
1059 if (!dma_error) {
1060 for (i = rq->nr_sectors; i > 0;) {
1061 i -= rq->current_nr_sectors;
1062 ide_cdrom_end_request(drive, 1);
1063 }
1064 return ide_stopped;
1065 } else
1066 return DRIVER(drive)->error(drive, "dma error", stat);
1067 }
1068
1069 /* Read the interrupt reason and the transfer length. */
1070 ireason = HWIF(drive)->INB(IDE_IREASON_REG);
1071 lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1072 highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1073
1074 len = lowcyl + (256 * highcyl);
1075
1076 /* If DRQ is clear, the command has completed. */
1077 if ((stat & DRQ_STAT) == 0) {
1078 /* If we're not done filling the current buffer, complain.
1079 Otherwise, complete the command normally. */
1080 if (rq->current_nr_sectors > 0) {
1081 printk ("%s: cdrom_read_intr: data underrun (%ld blocks)\n",
1082 drive->name, rq->current_nr_sectors);
1083 cdrom_end_request(drive, 0);
1084 } else
1085 cdrom_end_request(drive, 1);
1086 return ide_stopped;
1087 }
1088
1089 /* Check that the drive is expecting to do the same thing we are. */
1090 if (cdrom_read_check_ireason (drive, len, ireason))
1091 return ide_stopped;
1092
1093 /* Assume that the drive will always provide data in multiples
1094 of at least SECTOR_SIZE, as it gets hairy to keep track
1095 of the transfers otherwise. */
1096 if ((len % SECTOR_SIZE) != 0) {
1097 printk ("%s: cdrom_read_intr: Bad transfer size %d\n",
1098 drive->name, len);
1099 if (CDROM_CONFIG_FLAGS(drive)->limit_nframes)
1100 printk (" This drive is not supported by this version of the driver\n");
1101 else {
1102 printk (" Trying to limit transfer sizes\n");
1103 CDROM_CONFIG_FLAGS(drive)->limit_nframes = 1;
1104 }
1105 cdrom_end_request(drive, 0);
1106 return ide_stopped;
1107 }
1108
1109 /* The number of sectors we need to read from the drive. */
1110 sectors_to_transfer = len / SECTOR_SIZE;
1111
1112 /* First, figure out if we need to bit-bucket
1113 any of the leading sectors. */
1114 nskip = MIN ((int)(rq->current_nr_sectors - (rq->bh->b_size >> SECTOR_BITS)),
1115 sectors_to_transfer);
1116
1117 while (nskip > 0) {
1118 /* We need to throw away a sector. */
1119 char dum[SECTOR_SIZE];
1120 HWIF(drive)->atapi_input_bytes(drive, dum, sizeof (dum));
1121
1122 --rq->current_nr_sectors;
1123 --nskip;
1124 --sectors_to_transfer;
1125 }
1126
1127 /* Now loop while we still have data to read from the drive. */
1128 while (sectors_to_transfer > 0) {
1129 int this_transfer;
1130
1131 /* If we've filled the present buffer but there's another
1132 chained buffer after it, move on. */
1133 if (rq->current_nr_sectors == 0 && rq->nr_sectors)
1134 cdrom_end_request(drive, 1);
1135
1136 /* If the buffers are full, cache the rest of the data in our
1137 internal buffer. */
1138 if (rq->current_nr_sectors == 0) {
1139 cdrom_buffer_sectors(drive, rq->sector, sectors_to_transfer);
1140 sectors_to_transfer = 0;
1141 } else {
1142 /* Transfer data to the buffers.
1143 Figure out how many sectors we can transfer
1144 to the current buffer. */
1145 this_transfer = MIN (sectors_to_transfer,
1146 rq->current_nr_sectors);
1147
1148 /* Read this_transfer sectors
1149 into the current buffer. */
1150 while (this_transfer > 0) {
1151 HWIF(drive)->atapi_input_bytes(drive, rq->buffer, SECTOR_SIZE);
1152 rq->buffer += SECTOR_SIZE;
1153 --rq->nr_sectors;
1154 --rq->current_nr_sectors;
1155 ++rq->sector;
1156 --this_transfer;
1157 --sectors_to_transfer;
1158 }
1159 }
1160 }
1161
1162 /* Done moving data! Wait for another interrupt. */
1163 ide_set_handler(drive, &cdrom_read_intr, WAIT_CMD, NULL);
1164 return ide_started;
1165 }
1166
1167 /*
1168 * Try to satisfy some of the current read request from our cached data.
1169 * Returns nonzero if the request has been completed, zero otherwise.
1170 */
cdrom_read_from_buffer(ide_drive_t * drive)1171 static int cdrom_read_from_buffer (ide_drive_t *drive)
1172 {
1173 struct cdrom_info *info = drive->driver_data;
1174 struct request *rq = HWGROUP(drive)->rq;
1175
1176 /* Can't do anything if there's no buffer. */
1177 if (info->buffer == NULL) return 0;
1178
1179 /* Loop while this request needs data and the next block is present
1180 in our cache. */
1181 while (rq->nr_sectors > 0 &&
1182 rq->sector >= info->sector_buffered &&
1183 rq->sector < info->sector_buffered + info->nsectors_buffered) {
1184 if (rq->current_nr_sectors == 0)
1185 cdrom_end_request(drive, 1);
1186
1187 memcpy (rq->buffer,
1188 info->buffer +
1189 (rq->sector - info->sector_buffered) * SECTOR_SIZE,
1190 SECTOR_SIZE);
1191 rq->buffer += SECTOR_SIZE;
1192 --rq->current_nr_sectors;
1193 --rq->nr_sectors;
1194 ++rq->sector;
1195 }
1196
1197 /* If we've satisfied the current request,
1198 terminate it successfully. */
1199 if (rq->nr_sectors == 0) {
1200 cdrom_end_request(drive, 1);
1201 return -1;
1202 }
1203
1204 /* Move on to the next buffer if needed. */
1205 if (rq->current_nr_sectors == 0)
1206 cdrom_end_request(drive, 1);
1207
1208 /* If this condition does not hold, then the kluge i use to
1209 represent the number of sectors to skip at the start of a transfer
1210 will fail. I think that this will never happen, but let's be
1211 paranoid and check. */
1212 if (rq->current_nr_sectors < (rq->bh->b_size >> SECTOR_BITS) &&
1213 (rq->sector % SECTORS_PER_FRAME) != 0) {
1214 printk("%s: cdrom_read_from_buffer: buffer botch (%ld)\n",
1215 drive->name, rq->sector);
1216 cdrom_end_request(drive, 0);
1217 return -1;
1218 }
1219
1220 return 0;
1221 }
1222
1223 /*
1224 * Routine to send a read packet command to the drive.
1225 * This is usually called directly from cdrom_start_read.
1226 * However, for drq_interrupt devices, it is called from an interrupt
1227 * when the drive is ready to accept the command.
1228 */
cdrom_start_read_continuation(ide_drive_t * drive)1229 static ide_startstop_t cdrom_start_read_continuation (ide_drive_t *drive)
1230 {
1231 struct packet_command pc;
1232 struct request *rq = HWGROUP(drive)->rq;
1233 int nsect, sector, nframes, frame, nskip;
1234
1235 /* Number of sectors to transfer. */
1236 nsect = rq->nr_sectors;
1237
1238 /* Starting sector. */
1239 sector = rq->sector;
1240
1241 /* If the requested sector doesn't start on a cdrom block boundary,
1242 we must adjust the start of the transfer so that it does,
1243 and remember to skip the first few sectors.
1244 If the CURRENT_NR_SECTORS field is larger than the size
1245 of the buffer, it will mean that we're to skip a number
1246 of sectors equal to the amount by which CURRENT_NR_SECTORS
1247 is larger than the buffer size. */
1248 nskip = (sector % SECTORS_PER_FRAME);
1249 if (nskip > 0) {
1250 /* Sanity check... */
1251 if (rq->current_nr_sectors != (rq->bh->b_size >> SECTOR_BITS) &&
1252 (rq->sector % CD_FRAMESIZE != 0)) {
1253 printk ("%s: cdrom_start_read_continuation: buffer botch (%lu)\n",
1254 drive->name, rq->current_nr_sectors);
1255 cdrom_end_request(drive, 0);
1256 return ide_stopped;
1257 }
1258 sector -= nskip;
1259 nsect += nskip;
1260 rq->current_nr_sectors += nskip;
1261 }
1262
1263 /* Convert from sectors to cdrom blocks, rounding up the transfer
1264 length if needed. */
1265 nframes = (nsect + SECTORS_PER_FRAME-1) / SECTORS_PER_FRAME;
1266 frame = sector / SECTORS_PER_FRAME;
1267
1268 /* Largest number of frames was can transfer at once is 64k-1. For
1269 some drives we need to limit this even more. */
1270 nframes = MIN (nframes, (CDROM_CONFIG_FLAGS (drive)->limit_nframes) ?
1271 (65534 / CD_FRAMESIZE) : 65535);
1272
1273 /* Set up the command */
1274 memset (&pc.c, 0, sizeof (pc.c));
1275 pc.c[0] = GPCMD_READ_10;
1276 pc.c[7] = (nframes >> 8);
1277 pc.c[8] = (nframes & 0xff);
1278 put_unaligned(cpu_to_be32(frame), (unsigned int *) &pc.c[2]);
1279 pc.timeout = WAIT_CMD;
1280
1281 /* Send the command to the drive and return. */
1282 return cdrom_transfer_packet_command(drive, &pc, &cdrom_read_intr);
1283 }
1284
1285
1286 #define IDECD_SEEK_THRESHOLD (1000) /* 1000 blocks */
1287 #define IDECD_SEEK_TIMER (5 * WAIT_MIN_SLEEP) /* 100 ms */
1288 #define IDECD_SEEK_TIMEOUT WAIT_CMD /* 10 sec */
1289
cdrom_seek_intr(ide_drive_t * drive)1290 static ide_startstop_t cdrom_seek_intr (ide_drive_t *drive)
1291 {
1292 struct cdrom_info *info = drive->driver_data;
1293 int stat;
1294 static int retry = 10;
1295 ide_startstop_t startstop;
1296
1297 if (cdrom_decode_status (&startstop, drive, 0, &stat))
1298 return startstop;
1299 CDROM_CONFIG_FLAGS(drive)->seeking = 1;
1300
1301 if (retry && time_after(jiffies, info->start_seek + IDECD_SEEK_TIMER)) {
1302 if (--retry == 0) {
1303 /*
1304 * this condition is far too common, to bother
1305 * users about it
1306 */
1307 #if 0
1308 printk("%s: disabled DSC seek overlap\n", drive->name);
1309 #endif
1310 drive->dsc_overlap = 0;
1311 }
1312 }
1313 return ide_stopped;
1314 }
1315
cdrom_start_seek_continuation(ide_drive_t * drive)1316 static ide_startstop_t cdrom_start_seek_continuation (ide_drive_t *drive)
1317 {
1318 struct packet_command pc;
1319 struct request *rq = HWGROUP(drive)->rq;
1320 int sector, frame, nskip;
1321
1322 sector = rq->sector;
1323 nskip = (sector % SECTORS_PER_FRAME);
1324 if (nskip > 0)
1325 sector -= nskip;
1326 frame = sector / SECTORS_PER_FRAME;
1327
1328 memset (&pc.c, 0, sizeof (pc.c));
1329 pc.c[0] = GPCMD_SEEK;
1330 put_unaligned(cpu_to_be32(frame), (unsigned int *) &pc.c[2]);
1331
1332 pc.timeout = WAIT_CMD;
1333 return cdrom_transfer_packet_command(drive, &pc, &cdrom_seek_intr);
1334 }
1335
cdrom_start_seek(ide_drive_t * drive,unsigned int block)1336 static ide_startstop_t cdrom_start_seek (ide_drive_t *drive, unsigned int block)
1337 {
1338 struct cdrom_info *info = drive->driver_data;
1339
1340 info->dma = 0;
1341 info->cmd = 0;
1342 info->start_seek = jiffies;
1343 return cdrom_start_packet_command(drive, 0, cdrom_start_seek_continuation);
1344 }
1345
cdrom_merge_requests(struct request * rq,struct request * nxt)1346 static inline int cdrom_merge_requests(struct request *rq, struct request *nxt)
1347 {
1348 int ret = 1;
1349
1350 /*
1351 * partitions not really working, but better check anyway...
1352 */
1353 if (rq->cmd == nxt->cmd && rq->rq_dev == nxt->rq_dev) {
1354 rq->nr_sectors += nxt->nr_sectors;
1355 rq->hard_nr_sectors += nxt->nr_sectors;
1356 rq->bhtail->b_reqnext = nxt->bh;
1357 rq->bhtail = nxt->bhtail;
1358 list_del(&nxt->queue);
1359 blkdev_release_request(nxt);
1360 ret = 0;
1361 }
1362
1363 return ret;
1364 }
1365
1366 /*
1367 * the current request will always be the first one on the list
1368 */
cdrom_attempt_remerge(ide_drive_t * drive,struct request * rq)1369 static void cdrom_attempt_remerge(ide_drive_t *drive, struct request *rq)
1370 {
1371 struct list_head *entry;
1372 struct request *nxt;
1373 unsigned long flags;
1374
1375 spin_lock_irqsave(&io_request_lock, flags);
1376
1377 while (1) {
1378 entry = rq->queue.next;
1379 if (entry == &drive->queue.queue_head)
1380 break;
1381
1382 nxt = blkdev_entry_to_request(entry);
1383 if (rq->sector + rq->nr_sectors != nxt->sector)
1384 break;
1385 else if (rq->nr_sectors + nxt->nr_sectors > SECTORS_MAX)
1386 break;
1387
1388 if (cdrom_merge_requests(rq, nxt))
1389 break;
1390 }
1391
1392 spin_unlock_irqrestore(&io_request_lock, flags);
1393 }
1394
1395 /* Fix up a possibly partially-processed request so that we can
1396 start it over entirely, or even put it back on the request queue. */
restore_request(struct request * rq)1397 static void restore_request (struct request *rq)
1398 {
1399 if (rq->buffer != rq->bh->b_data) {
1400 int n = (rq->buffer - rq->bh->b_data) / SECTOR_SIZE;
1401 rq->buffer = rq->bh->b_data;
1402 rq->nr_sectors += n;
1403 rq->sector -= n;
1404 }
1405 rq->current_nr_sectors = rq->bh->b_size >> SECTOR_BITS;
1406 rq->hard_nr_sectors = rq->nr_sectors;
1407 rq->hard_sector = rq->sector;
1408 }
1409
1410 /*
1411 * Start a read request from the CD-ROM.
1412 */
cdrom_start_read(ide_drive_t * drive,unsigned int block)1413 static ide_startstop_t cdrom_start_read (ide_drive_t *drive, unsigned int block)
1414 {
1415 struct cdrom_info *info = drive->driver_data;
1416 struct request *rq = HWGROUP(drive)->rq;
1417 int minor = MINOR(rq->rq_dev);
1418
1419 /* If the request is relative to a partition, fix it up to refer to the
1420 absolute address. */
1421 if (minor & PARTN_MASK) {
1422 rq->sector = block;
1423 minor &= ~PARTN_MASK;
1424 rq->rq_dev = MKDEV(MAJOR(rq->rq_dev), minor);
1425 }
1426
1427 /* We may be retrying this request after an error. Fix up
1428 any weirdness which might be present in the request packet. */
1429 restore_request(rq);
1430
1431 /* Satisfy whatever we can of this request from our cached sector. */
1432 if (cdrom_read_from_buffer(drive))
1433 return ide_stopped;
1434
1435 cdrom_attempt_remerge(drive, rq);
1436
1437 /* Clear the local sector buffer. */
1438 info->nsectors_buffered = 0;
1439
1440 /* use dma, if possible. */
1441 if (drive->using_dma && (rq->sector % SECTORS_PER_FRAME == 0) &&
1442 (rq->nr_sectors % SECTORS_PER_FRAME == 0))
1443 info->dma = 1;
1444 else
1445 info->dma = 0;
1446
1447 info->cmd = READ;
1448 /* Start sending the read request to the drive. */
1449 return cdrom_start_packet_command(drive, 32768, cdrom_start_read_continuation);
1450 }
1451
1452 /****************************************************************************
1453 * Execute all other packet commands.
1454 */
1455
1456 /* Forward declarations. */
1457 static int cdrom_lockdoor(ide_drive_t *drive, int lockflag,
1458 struct request_sense *sense);
1459
1460 /* Interrupt routine for packet command completion. */
cdrom_pc_intr(ide_drive_t * drive)1461 static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive)
1462 {
1463 int ireason, len, stat, thislen;
1464 struct request *rq = HWGROUP(drive)->rq;
1465 struct packet_command *pc = (struct packet_command *)rq->buffer;
1466 ide_startstop_t startstop;
1467 u8 lowcyl = 0, highcyl = 0;
1468
1469 /* Check for errors. */
1470 if (cdrom_decode_status(&startstop, drive, 0, &stat))
1471 return startstop;
1472
1473 /* Read the interrupt reason and the transfer length. */
1474 ireason = HWIF(drive)->INB(IDE_IREASON_REG);
1475 lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1476 highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1477
1478 len = lowcyl + (256 * highcyl);
1479
1480 /* If DRQ is clear, the command has completed.
1481 Complain if we still have data left to transfer. */
1482 if ((stat & DRQ_STAT) == 0) {
1483 /* Some of the trailing request sense fields are optional, and
1484 some drives don't send them. Sigh. */
1485 if (pc->c[0] == GPCMD_REQUEST_SENSE &&
1486 pc->buflen > 0 &&
1487 pc->buflen <= 5) {
1488 while (pc->buflen > 0) {
1489 *pc->buffer++ = 0;
1490 --pc->buflen;
1491 }
1492 }
1493
1494 if (pc->buflen == 0)
1495 cdrom_end_request(drive, 1);
1496 else {
1497 /* Comment this out, because this always happens
1498 right after a reset occurs, and it is annoying to
1499 always print expected stuff. */
1500 /*
1501 printk ("%s: cdrom_pc_intr: data underrun %d\n",
1502 drive->name, pc->buflen);
1503 */
1504 pc->stat = 1;
1505 cdrom_end_request(drive, 1);
1506 }
1507 return ide_stopped;
1508 }
1509
1510 /* Figure out how much data to transfer. */
1511 thislen = pc->buflen;
1512 if (thislen > len) thislen = len;
1513
1514 /* The drive wants to be written to. */
1515 if ((ireason & 3) == 0) {
1516 /* Transfer the data. */
1517 HWIF(drive)->atapi_output_bytes(drive, pc->buffer, thislen);
1518
1519 /* If we haven't moved enough data to satisfy the drive,
1520 add some padding. */
1521 while (len > thislen) {
1522 int dum = 0;
1523 HWIF(drive)->atapi_output_bytes(drive, &dum, sizeof(dum));
1524 len -= sizeof(dum);
1525 }
1526
1527 /* Keep count of how much data we've moved. */
1528 pc->buffer += thislen;
1529 pc->buflen -= thislen;
1530 }
1531
1532 /* Same drill for reading. */
1533 else if ((ireason & 3) == 2) {
1534
1535 /* Transfer the data. */
1536 HWIF(drive)->atapi_input_bytes(drive, pc->buffer, thislen);
1537
1538 /* If we haven't moved enough data to satisfy the drive,
1539 add some padding. */
1540 while (len > thislen) {
1541 int dum = 0;
1542 HWIF(drive)->atapi_input_bytes(drive, &dum, sizeof(dum));
1543 len -= sizeof(dum);
1544 }
1545
1546 /* Keep count of how much data we've moved. */
1547 pc->buffer += thislen;
1548 pc->buflen -= thislen;
1549 } else {
1550 printk ("%s: cdrom_pc_intr: The drive "
1551 "appears confused (ireason = 0x%2x)\n",
1552 drive->name, ireason);
1553 pc->stat = 1;
1554 }
1555
1556 /* Now we wait for another interrupt. */
1557 ide_set_handler(drive, &cdrom_pc_intr, WAIT_CMD, cdrom_timer_expiry);
1558 return ide_started;
1559 }
1560
1561
cdrom_do_pc_continuation(ide_drive_t * drive)1562 static ide_startstop_t cdrom_do_pc_continuation (ide_drive_t *drive)
1563 {
1564 struct request *rq = HWGROUP(drive)->rq;
1565 struct packet_command *pc = (struct packet_command *)rq->buffer;
1566
1567 if (!pc->timeout)
1568 pc->timeout = WAIT_CMD;
1569
1570 /* Send the command to the drive and return. */
1571 return cdrom_transfer_packet_command(drive, pc, &cdrom_pc_intr);
1572 }
1573
1574
cdrom_do_packet_command(ide_drive_t * drive)1575 static ide_startstop_t cdrom_do_packet_command (ide_drive_t *drive)
1576 {
1577 int len;
1578 struct request *rq = HWGROUP(drive)->rq;
1579 struct packet_command *pc = (struct packet_command *)rq->buffer;
1580 struct cdrom_info *info = drive->driver_data;
1581
1582 info->dma = 0;
1583 info->cmd = 0;
1584 pc->stat = 0;
1585 len = pc->buflen;
1586
1587 /* Start sending the command to the drive. */
1588 return cdrom_start_packet_command(drive, len, cdrom_do_pc_continuation);
1589 }
1590
1591
1592 /* Sleep for TIME jiffies.
1593 Not to be called from an interrupt handler. */
1594 static
cdrom_sleep(int time)1595 void cdrom_sleep (int time)
1596 {
1597 int sleep = time;
1598
1599 do {
1600 set_current_state(TASK_INTERRUPTIBLE);
1601 sleep = schedule_timeout(sleep);
1602 } while (sleep);
1603 }
1604
1605 static
cdrom_queue_packet_command(ide_drive_t * drive,struct packet_command * pc)1606 int cdrom_queue_packet_command(ide_drive_t *drive, struct packet_command *pc)
1607 {
1608 struct request_sense sense;
1609 struct request req;
1610 int retries = 10;
1611
1612 if (pc->sense == NULL)
1613 pc->sense = &sense;
1614
1615 /* Start of retry loop. */
1616 do {
1617 ide_init_drive_cmd (&req);
1618 req.cmd = PACKET_COMMAND;
1619 req.buffer = (char *)pc;
1620 ide_do_drive_cmd(drive, &req, ide_wait);
1621 /* FIXME: we should probably abort/retry or something
1622 * in case of failure */
1623 if (pc->stat != 0) {
1624 /* The request failed. Retry if it was due to a unit
1625 attention status
1626 (usually means media was changed). */
1627 struct request_sense *reqbuf = pc->sense;
1628
1629 if (reqbuf->sense_key == UNIT_ATTENTION)
1630 cdrom_saw_media_change(drive);
1631 else if (reqbuf->sense_key == NOT_READY &&
1632 reqbuf->asc == 4 && reqbuf->ascq != 4) {
1633 /* The drive is in the process of loading
1634 a disk. Retry, but wait a little to give
1635 the drive time to complete the load. */
1636 cdrom_sleep(2 * HZ);
1637 } else {
1638 /* Otherwise, don't retry. */
1639 retries = 0;
1640 }
1641 --retries;
1642 }
1643
1644 /* End of retry loop. */
1645 } while (pc->stat != 0 && retries >= 0);
1646
1647 /* Return an error if the command failed. */
1648 return pc->stat ? -EIO : 0;
1649 }
1650
1651 /*
1652 * Write handling
1653 */
cdrom_write_check_ireason(ide_drive_t * drive,int len,int ireason)1654 static inline int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason)
1655 {
1656 /* Two notes about IDE interrupt reason here - 0 means that
1657 * the drive wants to receive data from us, 2 means that
1658 * the drive is expecting data from us.
1659 */
1660 ireason &= 3;
1661
1662 if (ireason == 2) {
1663 /* Whoops... The drive wants to send data. */
1664 printk("%s: cdrom_write_intr: wrong transfer direction!\n",
1665 drive->name);
1666
1667 /* Throw some data at the drive so it doesn't hang
1668 and quit this request. */
1669 while (len > 0) {
1670 int dum = 0;
1671 HWIF(drive)->atapi_output_bytes(drive, &dum, sizeof(dum));
1672 len -= sizeof(dum);
1673 }
1674 } else {
1675 /* Drive wants a command packet, or invalid ireason... */
1676 printk("%s: cdrom_write_intr: bad interrupt reason %d\n",
1677 drive->name, ireason);
1678 }
1679
1680 cdrom_end_request(drive, 0);
1681 return 1;
1682 }
1683
cdrom_write_intr(ide_drive_t * drive)1684 static ide_startstop_t cdrom_write_intr(ide_drive_t *drive)
1685 {
1686 int stat, ireason, len, sectors_to_transfer, uptodate;
1687 struct cdrom_info *info = drive->driver_data;
1688 int i, dma_error = 0, dma = info->dma;
1689 u8 lowcyl = 0, highcyl = 0;
1690 ide_startstop_t startstop;
1691
1692 struct request *rq = HWGROUP(drive)->rq;
1693
1694 /* Check for errors. */
1695 if (dma) {
1696 info->dma = 0;
1697 if ((dma_error = HWIF(drive)->ide_dma_end(drive))) {
1698 printk("ide-cd: write dma error\n");
1699 HWIF(drive)->ide_dma_off(drive);
1700 }
1701 }
1702
1703 if (cdrom_decode_status(&startstop, drive, 0, &stat)) {
1704 printk("ide-cd: write_intr decode_status bad\n");
1705 return startstop;
1706 }
1707
1708 /*
1709 * using dma, transfer is complete now
1710 */
1711 if (dma) {
1712 if (dma_error)
1713 return DRIVER(drive)->error(drive, "dma error", stat);
1714
1715 rq = HWGROUP(drive)->rq;
1716 for (i = rq->nr_sectors; i > 0;) {
1717 i -= rq->current_nr_sectors;
1718 ide_cdrom_end_request(drive, 1);
1719 }
1720 return ide_stopped;
1721 }
1722
1723 /* Read the interrupt reason and the transfer length. */
1724 ireason = HWIF(drive)->INB(IDE_IREASON_REG);
1725 lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1726 highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1727
1728 len = lowcyl + (256 * highcyl);
1729
1730 /* If DRQ is clear, the command has completed. */
1731 if ((stat & DRQ_STAT) == 0) {
1732 /* If we're not done writing, complain.
1733 * Otherwise, complete the command normally.
1734 */
1735 uptodate = 1;
1736 if (rq->current_nr_sectors > 0) {
1737 printk("%s: write_intr: data underrun (%ld blocks)\n",
1738 drive->name, rq->current_nr_sectors);
1739 uptodate = 0;
1740 }
1741 cdrom_end_request(drive, uptodate);
1742 return ide_stopped;
1743 }
1744
1745 /* Check that the drive is expecting to do the same thing we are. */
1746 if (ireason & 3)
1747 if (cdrom_write_check_ireason(drive, len, ireason))
1748 return ide_stopped;
1749
1750 sectors_to_transfer = len / SECTOR_SIZE;
1751
1752 /*
1753 * now loop and write out the data
1754 */
1755 while (sectors_to_transfer > 0) {
1756 int this_transfer;
1757
1758 if (!rq->current_nr_sectors) {
1759 printk("ide-cd: write_intr: oops\n");
1760 break;
1761 }
1762
1763 /*
1764 * Figure out how many sectors we can transfer
1765 */
1766 this_transfer = MIN(sectors_to_transfer,rq->current_nr_sectors);
1767
1768 while (this_transfer > 0) {
1769 HWIF(drive)->atapi_output_bytes(drive, rq->buffer, SECTOR_SIZE);
1770 rq->buffer += SECTOR_SIZE;
1771 --rq->nr_sectors;
1772 --rq->current_nr_sectors;
1773 ++rq->sector;
1774 --this_transfer;
1775 --sectors_to_transfer;
1776 }
1777
1778 /*
1779 * current buffer complete, move on
1780 */
1781 if (rq->current_nr_sectors == 0 && rq->nr_sectors)
1782 cdrom_end_request(drive, 1);
1783 }
1784
1785 /* re-arm handler */
1786 ide_set_handler(drive, &cdrom_write_intr, 5 * WAIT_CMD, NULL);
1787 return ide_started;
1788 }
1789
cdrom_start_write_cont(ide_drive_t * drive)1790 static ide_startstop_t cdrom_start_write_cont(ide_drive_t *drive)
1791 {
1792 struct packet_command pc; /* packet_command_t pc; */
1793 struct request *rq = HWGROUP(drive)->rq;
1794 unsigned nframes, frame;
1795
1796 nframes = rq->nr_sectors >> 2;
1797 frame = rq->sector >> 2;
1798
1799 memset(&pc.c, 0, sizeof(pc.c));
1800 /*
1801 * we might as well use WRITE_12, but none of the device I have
1802 * support the streaming feature anyway, so who cares.
1803 */
1804 pc.c[0] = GPCMD_WRITE_10;
1805 #if 0 /* the immediate bit */
1806 pc.c[1] = 1 << 3;
1807 #endif
1808 pc.c[7] = (nframes >> 8) & 0xff;
1809 pc.c[8] = nframes & 0xff;
1810 put_unaligned(cpu_to_be32(frame), (unsigned int *)&pc.c[2]);
1811 pc.timeout = 2 * WAIT_CMD;
1812
1813 return cdrom_transfer_packet_command(drive, &pc, cdrom_write_intr);
1814 }
1815
cdrom_start_write(ide_drive_t * drive,struct request * rq)1816 static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq)
1817 {
1818 struct cdrom_info *info = drive->driver_data;
1819
1820 /*
1821 * writes *must* be 2kB frame aligned
1822 */
1823 if ((rq->nr_sectors & 3) || (rq->sector & 3)) {
1824 cdrom_end_request(drive, 0);
1825 return ide_stopped;
1826 }
1827
1828 /*
1829 * for dvd-ram and such media, it's a really big deal to get
1830 * big writes all the time. so scour the queue and attempt to
1831 * remerge requests, often the plugging will not have had time
1832 * to do this properly
1833 */
1834 cdrom_attempt_remerge(drive, rq);
1835
1836 info->nsectors_buffered = 0;
1837
1838 /* use dma, if possible. we don't need to check more, since we
1839 * know that the transfer is always (at least!) 2KB aligned */
1840 info->dma = drive->using_dma ? 1 : 0;
1841 info->cmd = WRITE;
1842
1843 /* Start sending the read request to the drive. */
1844 return cdrom_start_packet_command(drive, 32768, cdrom_start_write_cont);
1845 }
1846
1847 /****************************************************************************
1848 * cdrom driver request routine.
1849 */
1850 static ide_startstop_t
ide_do_rw_cdrom(ide_drive_t * drive,struct request * rq,unsigned long block)1851 ide_do_rw_cdrom (ide_drive_t *drive, struct request *rq, unsigned long block)
1852 {
1853 ide_startstop_t action;
1854 struct cdrom_info *info = drive->driver_data;
1855
1856 switch (rq->cmd) {
1857 case WRITE:
1858 case READ: {
1859 if (CDROM_CONFIG_FLAGS(drive)->seeking) {
1860 int stat = HWIF(drive)->INB(IDE_STATUS_REG);
1861
1862 if ((stat & SEEK_STAT) != SEEK_STAT) {
1863 if (time_before(jiffies, info->start_seek + IDECD_SEEK_TIMEOUT)) {
1864 ide_stall_queue(drive, IDECD_SEEK_TIMER);
1865 return ide_stopped;
1866 }
1867 printk ("%s: DSC timeout\n", drive->name);
1868 }
1869 CDROM_CONFIG_FLAGS(drive)->seeking = 0;
1870 }
1871 if (IDE_LARGE_SEEK(info->last_block, block, IDECD_SEEK_THRESHOLD) && drive->dsc_overlap)
1872 action = cdrom_start_seek(drive, block);
1873 else {
1874 if (rq_data_dir(rq) == READ)
1875 action = cdrom_start_read(drive, block);
1876 else
1877 action = cdrom_start_write(drive, rq);
1878 }
1879 info->last_block = block;
1880 return action;
1881 }
1882
1883 case PACKET_COMMAND:
1884 case REQUEST_SENSE_COMMAND: {
1885 return cdrom_do_packet_command(drive);
1886 }
1887
1888 case RESET_DRIVE_COMMAND: {
1889 cdrom_end_request(drive, 1);
1890 return ide_do_reset(drive);
1891 }
1892
1893 default: {
1894 printk("ide-cd: bad cmd %d\n", rq->cmd);
1895 cdrom_end_request(drive, 0);
1896 return ide_stopped;
1897 }
1898 }
1899 }
1900
1901
1902
1903 /****************************************************************************
1904 * Ioctl handling.
1905 *
1906 * Routines which queue packet commands take as a final argument a pointer
1907 * to a request_sense struct. If execution of the command results
1908 * in an error with a CHECK CONDITION status, this structure will be filled
1909 * with the results of the subsequent request sense command. The pointer
1910 * can also be NULL, in which case no sense information is returned.
1911 */
1912
1913 #if ! STANDARD_ATAPI
1914 static inline
bin2bcd(int x)1915 int bin2bcd (int x)
1916 {
1917 return (x%10) | ((x/10) << 4);
1918 }
1919
1920
1921 static inline
bcd2bin(int x)1922 int bcd2bin (int x)
1923 {
1924 return (x >> 4) * 10 + (x & 0x0f);
1925 }
1926
1927 static
msf_from_bcd(struct atapi_msf * msf)1928 void msf_from_bcd (struct atapi_msf *msf)
1929 {
1930 msf->minute = bcd2bin (msf->minute);
1931 msf->second = bcd2bin (msf->second);
1932 msf->frame = bcd2bin (msf->frame);
1933 }
1934
1935 #endif /* not STANDARD_ATAPI */
1936
1937
1938 static inline
lba_to_msf(int lba,byte * m,byte * s,byte * f)1939 void lba_to_msf (int lba, byte *m, byte *s, byte *f)
1940 {
1941 lba += CD_MSF_OFFSET;
1942 lba &= 0xffffff; /* negative lbas use only 24 bits */
1943 *m = lba / (CD_SECS * CD_FRAMES);
1944 lba %= (CD_SECS * CD_FRAMES);
1945 *s = lba / CD_FRAMES;
1946 *f = lba % CD_FRAMES;
1947 }
1948
1949
1950 static inline
msf_to_lba(byte m,byte s,byte f)1951 int msf_to_lba (byte m, byte s, byte f)
1952 {
1953 return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
1954 }
1955
cdrom_check_status(ide_drive_t * drive,struct request_sense * sense)1956 static int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense)
1957 {
1958 struct packet_command pc;
1959 struct cdrom_info *info = drive->driver_data;
1960 struct cdrom_device_info *cdi = &info->devinfo;
1961
1962 memset(&pc, 0, sizeof(pc));
1963 pc.sense = sense;
1964
1965 pc.c[0] = GPCMD_TEST_UNIT_READY;
1966
1967 #if ! STANDARD_ATAPI
1968 /* the Sanyo 3 CD changer uses byte 7 of TEST_UNIT_READY to
1969 switch CDs instead of supporting the LOAD_UNLOAD opcode */
1970
1971 pc.c[7] = cdi->sanyo_slot % 3;
1972 #endif /* not STANDARD_ATAPI */
1973
1974 return cdrom_queue_packet_command(drive, &pc);
1975 }
1976
1977
1978 /* Lock the door if LOCKFLAG is nonzero; unlock it otherwise. */
1979 static int
cdrom_lockdoor(ide_drive_t * drive,int lockflag,struct request_sense * sense)1980 cdrom_lockdoor(ide_drive_t *drive, int lockflag, struct request_sense *sense)
1981 {
1982 struct request_sense my_sense;
1983 struct packet_command pc;
1984 int stat;
1985
1986 if (sense == NULL)
1987 sense = &my_sense;
1988
1989 /* If the drive cannot lock the door, just pretend. */
1990 if (CDROM_CONFIG_FLAGS(drive)->no_doorlock) {
1991 stat = 0;
1992 } else {
1993 memset(&pc, 0, sizeof(pc));
1994 pc.sense = sense;
1995 pc.c[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
1996 pc.c[4] = lockflag ? 1 : 0;
1997 stat = cdrom_queue_packet_command(drive, &pc);
1998 }
1999
2000 /* If we got an illegal field error, the drive
2001 probably cannot lock the door. */
2002 if (stat != 0 &&
2003 sense->sense_key == ILLEGAL_REQUEST &&
2004 (sense->asc == 0x24 || sense->asc == 0x20)) {
2005 printk ("%s: door locking not supported\n",
2006 drive->name);
2007 CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
2008 stat = 0;
2009 }
2010
2011 /* no medium, that's alright. */
2012 if (stat != 0 && sense->sense_key == NOT_READY && sense->asc == 0x3a)
2013 stat = 0;
2014
2015 if (stat == 0)
2016 CDROM_STATE_FLAGS(drive)->door_locked = lockflag;
2017
2018 return stat;
2019 }
2020
2021
2022 /* Eject the disk if EJECTFLAG is 0.
2023 If EJECTFLAG is 1, try to reload the disk. */
cdrom_eject(ide_drive_t * drive,int ejectflag,struct request_sense * sense)2024 static int cdrom_eject(ide_drive_t *drive, int ejectflag,
2025 struct request_sense *sense)
2026 {
2027 struct packet_command pc;
2028
2029 if (CDROM_CONFIG_FLAGS(drive)->no_eject && !ejectflag)
2030 return -EDRIVE_CANT_DO_THIS;
2031
2032 /* reload fails on some drives, if the tray is locked */
2033 if (CDROM_STATE_FLAGS(drive)->door_locked && ejectflag)
2034 return 0;
2035
2036 memset(&pc, 0, sizeof (pc));
2037 pc.sense = sense;
2038
2039 pc.c[0] = GPCMD_START_STOP_UNIT;
2040 pc.c[4] = 0x02 + (ejectflag != 0);
2041 return cdrom_queue_packet_command(drive, &pc);
2042 }
2043
cdrom_read_capacity(ide_drive_t * drive,unsigned long * capacity,struct request_sense * sense)2044 static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity,
2045 struct request_sense *sense)
2046 {
2047 struct {
2048 __u32 lba;
2049 __u32 blocklen;
2050 } capbuf;
2051
2052 int stat;
2053 struct packet_command pc;
2054
2055 memset(&pc, 0, sizeof(pc));
2056 pc.sense = sense;
2057
2058 pc.c[0] = GPCMD_READ_CDVD_CAPACITY;
2059 pc.buffer = (char *)&capbuf;
2060 pc.buflen = sizeof(capbuf);
2061
2062 stat = cdrom_queue_packet_command(drive, &pc);
2063 if (stat == 0)
2064 *capacity = 1 + be32_to_cpu(capbuf.lba);
2065
2066 return stat;
2067 }
2068
cdrom_read_tocentry(ide_drive_t * drive,int trackno,int msf_flag,int format,char * buf,int buflen,struct request_sense * sense)2069 static int cdrom_read_tocentry(ide_drive_t *drive, int trackno, int msf_flag,
2070 int format, char *buf, int buflen,
2071 struct request_sense *sense)
2072 {
2073 struct packet_command pc;
2074
2075 memset(&pc, 0, sizeof(pc));
2076 pc.sense = sense;
2077
2078 pc.buffer = buf;
2079 pc.buflen = buflen;
2080 pc.quiet = 1;
2081 pc.c[0] = GPCMD_READ_TOC_PMA_ATIP;
2082 pc.c[6] = trackno;
2083 pc.c[7] = (buflen >> 8);
2084 pc.c[8] = (buflen & 0xff);
2085 pc.c[9] = (format << 6);
2086
2087 if (msf_flag)
2088 pc.c[1] = 2;
2089
2090 return cdrom_queue_packet_command(drive, &pc);
2091 }
2092
2093
2094 /* Try to read the entire TOC for the disk into our internal buffer. */
cdrom_read_toc(ide_drive_t * drive,struct request_sense * sense)2095 static int cdrom_read_toc(ide_drive_t *drive, struct request_sense *sense)
2096 {
2097 int minor, stat, ntracks, i;
2098 kdev_t dev;
2099 struct cdrom_info *info = drive->driver_data;
2100 struct atapi_toc *toc = info->toc;
2101 struct {
2102 struct atapi_toc_header hdr;
2103 struct atapi_toc_entry ent;
2104 } ms_tmp;
2105
2106 if (toc == NULL) {
2107 /* Try to allocate space. */
2108 toc = (struct atapi_toc *) kmalloc (sizeof (struct atapi_toc),
2109 GFP_KERNEL);
2110 info->toc = toc;
2111 if (toc == NULL) {
2112 printk ("%s: No cdrom TOC buffer!\n", drive->name);
2113 return -ENOMEM;
2114 }
2115 }
2116
2117 /* Check to see if the existing data is still valid.
2118 If it is, just return. */
2119 (void) cdrom_check_status(drive, sense);
2120
2121 if (CDROM_STATE_FLAGS(drive)->toc_valid)
2122 return 0;
2123
2124 /* First read just the header, so we know how long the TOC is. */
2125 stat = cdrom_read_tocentry(drive, 0, 1, 0, (char *) &toc->hdr,
2126 sizeof(struct atapi_toc_header), sense);
2127 if (stat) return stat;
2128
2129 #if ! STANDARD_ATAPI
2130 if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd) {
2131 toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
2132 toc->hdr.last_track = bcd2bin(toc->hdr.last_track);
2133 }
2134 #endif /* not STANDARD_ATAPI */
2135
2136 ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
2137 if (ntracks <= 0)
2138 return -EIO;
2139 if (ntracks > MAX_TRACKS)
2140 ntracks = MAX_TRACKS;
2141
2142 /* Now read the whole schmeer. */
2143 stat = cdrom_read_tocentry(drive, toc->hdr.first_track, 1, 0,
2144 (char *)&toc->hdr,
2145 sizeof(struct atapi_toc_header) +
2146 (ntracks + 1) *
2147 sizeof(struct atapi_toc_entry), sense);
2148
2149 if (stat && toc->hdr.first_track > 1) {
2150 /* Cds with CDI tracks only don't have any TOC entries,
2151 despite of this the returned values are
2152 first_track == last_track = number of CDI tracks + 1,
2153 so that this case is indistinguishable from the same
2154 layout plus an additional audio track.
2155 If we get an error for the regular case, we assume
2156 a CDI without additional audio tracks. In this case
2157 the readable TOC is empty (CDI tracks are not included)
2158 and only holds the Leadout entry. Heiko Ei�feldt */
2159 ntracks = 0;
2160 stat = cdrom_read_tocentry(drive, CDROM_LEADOUT, 1, 0,
2161 (char *)&toc->hdr,
2162 sizeof(struct atapi_toc_header) +
2163 (ntracks + 1) *
2164 sizeof(struct atapi_toc_entry),
2165 sense);
2166 if (stat) {
2167 return stat;
2168 }
2169 #if ! STANDARD_ATAPI
2170 if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd) {
2171 toc->hdr.first_track = bin2bcd(CDROM_LEADOUT);
2172 toc->hdr.last_track = bin2bcd(CDROM_LEADOUT);
2173 } else
2174 #endif /* not STANDARD_ATAPI */
2175 {
2176 toc->hdr.first_track = CDROM_LEADOUT;
2177 toc->hdr.last_track = CDROM_LEADOUT;
2178 }
2179 }
2180
2181 if (stat)
2182 return stat;
2183
2184 toc->hdr.toc_length = ntohs (toc->hdr.toc_length);
2185
2186 #if ! STANDARD_ATAPI
2187 if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd) {
2188 toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
2189 toc->hdr.last_track = bcd2bin(toc->hdr.last_track);
2190 }
2191 #endif /* not STANDARD_ATAPI */
2192
2193 for (i=0; i<=ntracks; i++) {
2194 #if ! STANDARD_ATAPI
2195 if (CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd) {
2196 if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd)
2197 toc->ent[i].track = bcd2bin(toc->ent[i].track);
2198 msf_from_bcd(&toc->ent[i].addr.msf);
2199 }
2200 #endif /* not STANDARD_ATAPI */
2201 toc->ent[i].addr.lba = msf_to_lba (toc->ent[i].addr.msf.minute,
2202 toc->ent[i].addr.msf.second,
2203 toc->ent[i].addr.msf.frame);
2204 }
2205
2206 /* Read the multisession information. */
2207 if (toc->hdr.first_track != CDROM_LEADOUT) {
2208 /* Read the multisession information. */
2209 stat = cdrom_read_tocentry(drive, 0, 0, 1, (char *)&ms_tmp,
2210 sizeof(ms_tmp), sense);
2211 if (stat) return stat;
2212
2213 toc->last_session_lba = be32_to_cpu(ms_tmp.ent.addr.lba);
2214 } else {
2215 ms_tmp.hdr.first_track = ms_tmp.hdr.last_track = CDROM_LEADOUT;
2216 toc->last_session_lba = msf_to_lba(0, 2, 0); /* 0m 2s 0f */
2217 }
2218
2219 #if ! STANDARD_ATAPI
2220 if (CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd) {
2221 /* Re-read multisession information using MSF format */
2222 stat = cdrom_read_tocentry(drive, 0, 1, 1, (char *)&ms_tmp,
2223 sizeof(ms_tmp), sense);
2224 if (stat)
2225 return stat;
2226
2227 msf_from_bcd (&ms_tmp.ent.addr.msf);
2228 toc->last_session_lba = msf_to_lba(ms_tmp.ent.addr.msf.minute,
2229 ms_tmp.ent.addr.msf.second,
2230 ms_tmp.ent.addr.msf.frame);
2231 }
2232 #endif /* not STANDARD_ATAPI */
2233
2234 toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track);
2235
2236 /* Now try to get the total cdrom capacity. */
2237 minor = (drive->select.b.unit) << PARTN_BITS;
2238 dev = MKDEV(HWIF(drive)->major, minor);
2239 stat = cdrom_get_last_written(dev, &toc->capacity);
2240 if (stat || !toc->capacity)
2241 stat = cdrom_read_capacity(drive, &toc->capacity, sense);
2242 if (stat)
2243 toc->capacity = 0x1fffff;
2244
2245 HWIF(drive)->gd->sizes[drive->select.b.unit << PARTN_BITS] = (toc->capacity * SECTORS_PER_FRAME) >> (BLOCK_SIZE_BITS - 9);
2246 drive->part[0].nr_sects = toc->capacity * SECTORS_PER_FRAME;
2247
2248 /* Remember that we've read this stuff. */
2249 CDROM_STATE_FLAGS(drive)->toc_valid = 1;
2250
2251 return 0;
2252 }
2253
2254
cdrom_read_subchannel(ide_drive_t * drive,int format,char * buf,int buflen,struct request_sense * sense)2255 static int cdrom_read_subchannel(ide_drive_t *drive, int format, char *buf,
2256 int buflen, struct request_sense *sense)
2257 {
2258 struct packet_command pc;
2259
2260 memset(&pc, 0, sizeof(pc));
2261 pc.sense = sense;
2262
2263 pc.buffer = buf;
2264 pc.buflen = buflen;
2265 pc.c[0] = GPCMD_READ_SUBCHANNEL;
2266 pc.c[1] = 2; /* MSF addressing */
2267 pc.c[2] = 0x40; /* request subQ data */
2268 pc.c[3] = format;
2269 pc.c[7] = (buflen >> 8);
2270 pc.c[8] = (buflen & 0xff);
2271 return cdrom_queue_packet_command(drive, &pc);
2272 }
2273
2274 /* ATAPI cdrom drives are free to select the speed you request or any slower
2275 rate :-( Requesting too fast a speed will _not_ produce an error. */
cdrom_select_speed(ide_drive_t * drive,int speed,struct request_sense * sense)2276 static int cdrom_select_speed(ide_drive_t *drive, int speed,
2277 struct request_sense *sense)
2278 {
2279 struct packet_command pc;
2280 memset(&pc, 0, sizeof(pc));
2281 pc.sense = sense;
2282
2283 if (speed == 0)
2284 speed = 0xffff; /* set to max */
2285 else
2286 speed *= 177; /* Nx to kbytes/s */
2287
2288 pc.c[0] = GPCMD_SET_SPEED;
2289 /* Read Drive speed in kbytes/second MSB */
2290 pc.c[2] = (speed >> 8) & 0xff;
2291 /* Read Drive speed in kbytes/second LSB */
2292 pc.c[3] = speed & 0xff;
2293 if (CDROM_CONFIG_FLAGS(drive)->cd_r ||
2294 CDROM_CONFIG_FLAGS(drive)->cd_rw ||
2295 CDROM_CONFIG_FLAGS(drive)->dvd_r) {
2296 /* Write Drive speed in kbytes/second MSB */
2297 pc.c[4] = (speed >> 8) & 0xff;
2298 /* Write Drive speed in kbytes/second LSB */
2299 pc.c[5] = speed & 0xff;
2300 }
2301
2302 return cdrom_queue_packet_command(drive, &pc);
2303 }
2304
cdrom_play_audio(ide_drive_t * drive,int lba_start,int lba_end)2305 static int cdrom_play_audio(ide_drive_t *drive, int lba_start, int lba_end)
2306 {
2307 struct request_sense sense;
2308 struct packet_command pc;
2309
2310 memset(&pc, 0, sizeof (pc));
2311 pc.sense = &sense;
2312
2313 pc.c[0] = GPCMD_PLAY_AUDIO_MSF;
2314 lba_to_msf(lba_start, &pc.c[3], &pc.c[4], &pc.c[5]);
2315 lba_to_msf(lba_end-1, &pc.c[6], &pc.c[7], &pc.c[8]);
2316
2317 return cdrom_queue_packet_command(drive, &pc);
2318 }
2319
cdrom_get_toc_entry(ide_drive_t * drive,int track,struct atapi_toc_entry ** ent)2320 static int cdrom_get_toc_entry(ide_drive_t *drive, int track,
2321 struct atapi_toc_entry **ent)
2322 {
2323 struct cdrom_info *info = drive->driver_data;
2324 struct atapi_toc *toc = info->toc;
2325 int ntracks;
2326
2327 /*
2328 * don't serve cached data, if the toc isn't valid
2329 */
2330 if (!CDROM_STATE_FLAGS(drive)->toc_valid)
2331 return -EINVAL;
2332
2333 /* Check validity of requested track number. */
2334 ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
2335 if (toc->hdr.first_track == CDROM_LEADOUT) ntracks = 0;
2336 if (track == CDROM_LEADOUT)
2337 *ent = &toc->ent[ntracks];
2338 else if (track < toc->hdr.first_track ||
2339 track > toc->hdr.last_track)
2340 return -EINVAL;
2341 else
2342 *ent = &toc->ent[track - toc->hdr.first_track];
2343
2344 return 0;
2345 }
2346
2347 /* the generic packet interface to cdrom.c */
ide_cdrom_packet(struct cdrom_device_info * cdi,struct cdrom_generic_command * cgc)2348 static int ide_cdrom_packet(struct cdrom_device_info *cdi,
2349 struct cdrom_generic_command *cgc)
2350 {
2351 struct packet_command pc;
2352 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2353
2354 if (cgc->timeout <= 0)
2355 cgc->timeout = WAIT_CMD;
2356
2357 /* here we queue the commands from the uniform CD-ROM
2358 layer. the packet must be complete, as we do not
2359 touch it at all. */
2360 memset(&pc, 0, sizeof(pc));
2361 if (cgc->sense)
2362 memset(cgc->sense, 0, sizeof(struct request_sense));
2363 memcpy(pc.c, cgc->cmd, CDROM_PACKET_SIZE);
2364 pc.buffer = cgc->buffer;
2365 pc.buflen = cgc->buflen;
2366 pc.quiet = cgc->quiet;
2367 pc.timeout = cgc->timeout;
2368 pc.sense = cgc->sense;
2369 return cgc->stat = cdrom_queue_packet_command(drive, &pc);
2370 }
2371
2372 static
ide_cdrom_dev_ioctl(struct cdrom_device_info * cdi,unsigned int cmd,unsigned long arg)2373 int ide_cdrom_dev_ioctl (struct cdrom_device_info *cdi,
2374 unsigned int cmd, unsigned long arg)
2375 {
2376 struct cdrom_generic_command cgc;
2377 char buffer[16];
2378 int stat;
2379
2380 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
2381
2382 /* These will be moved into the Uniform layer shortly... */
2383 switch (cmd) {
2384 case CDROMSETSPINDOWN: {
2385 char spindown;
2386
2387 if (copy_from_user(&spindown, (void *) arg, sizeof(char)))
2388 return -EFAULT;
2389
2390 if ((stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0)))
2391 return stat;
2392
2393 buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f);
2394
2395 return cdrom_mode_select(cdi, &cgc);
2396 }
2397
2398 case CDROMGETSPINDOWN: {
2399 char spindown;
2400
2401 if ((stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0)))
2402 return stat;
2403
2404 spindown = buffer[11] & 0x0f;
2405
2406 if (copy_to_user((void *) arg, &spindown, sizeof (char)))
2407 return -EFAULT;
2408
2409 return 0;
2410 }
2411
2412 default:
2413 return -EINVAL;
2414 }
2415
2416 }
2417
2418 static
ide_cdrom_audio_ioctl(struct cdrom_device_info * cdi,unsigned int cmd,void * arg)2419 int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi,
2420 unsigned int cmd, void *arg)
2421
2422 {
2423 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2424 struct cdrom_info *info = drive->driver_data;
2425 int stat;
2426
2427 switch (cmd) {
2428 /*
2429 * emulate PLAY_AUDIO_TI command with PLAY_AUDIO_10, since
2430 * atapi doesn't support it
2431 */
2432 case CDROMPLAYTRKIND: {
2433 unsigned long lba_start, lba_end;
2434 struct cdrom_ti *ti = (struct cdrom_ti *)arg;
2435 struct atapi_toc_entry *first_toc, *last_toc;
2436
2437 stat = cdrom_get_toc_entry(drive, ti->cdti_trk0, &first_toc);
2438 if (stat)
2439 return stat;
2440
2441 stat = cdrom_get_toc_entry(drive, ti->cdti_trk1, &last_toc);
2442 if (stat)
2443 return stat;
2444
2445 if (ti->cdti_trk1 != CDROM_LEADOUT)
2446 ++last_toc;
2447 lba_start = first_toc->addr.lba;
2448 lba_end = last_toc->addr.lba;
2449
2450 if (lba_end <= lba_start)
2451 return -EINVAL;
2452
2453 return cdrom_play_audio(drive, lba_start, lba_end);
2454 }
2455
2456 case CDROMREADTOCHDR: {
2457 struct cdrom_tochdr *tochdr = (struct cdrom_tochdr *) arg;
2458 struct atapi_toc *toc;
2459
2460 /* Make sure our saved TOC is valid. */
2461 stat = cdrom_read_toc(drive, NULL);
2462 if (stat) return stat;
2463
2464 toc = info->toc;
2465 tochdr->cdth_trk0 = toc->hdr.first_track;
2466 tochdr->cdth_trk1 = toc->hdr.last_track;
2467
2468 return 0;
2469 }
2470
2471 case CDROMREADTOCENTRY: {
2472 struct cdrom_tocentry *tocentry = (struct cdrom_tocentry*) arg;
2473 struct atapi_toc_entry *toce;
2474
2475 stat = cdrom_get_toc_entry(drive, tocentry->cdte_track, &toce);
2476 if (stat) return stat;
2477
2478 tocentry->cdte_ctrl = toce->control;
2479 tocentry->cdte_adr = toce->adr;
2480 if (tocentry->cdte_format == CDROM_MSF) {
2481 lba_to_msf (toce->addr.lba,
2482 &tocentry->cdte_addr.msf.minute,
2483 &tocentry->cdte_addr.msf.second,
2484 &tocentry->cdte_addr.msf.frame);
2485 } else
2486 tocentry->cdte_addr.lba = toce->addr.lba;
2487
2488 return 0;
2489 }
2490
2491 default:
2492 return -EINVAL;
2493 }
2494 }
2495
2496 static
ide_cdrom_reset(struct cdrom_device_info * cdi)2497 int ide_cdrom_reset (struct cdrom_device_info *cdi)
2498 {
2499 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2500 struct request_sense sense;
2501 struct request req;
2502 int ret;
2503
2504 ide_init_drive_cmd (&req);
2505 req.cmd = RESET_DRIVE_COMMAND;
2506 ret = ide_do_drive_cmd(drive, &req, ide_wait);
2507
2508 /*
2509 * A reset will unlock the door. If it was previously locked,
2510 * lock it again.
2511 */
2512 if (CDROM_STATE_FLAGS(drive)->door_locked)
2513 (void) cdrom_lockdoor(drive, 1, &sense);
2514
2515 return ret;
2516 }
2517
2518
2519 static
ide_cdrom_tray_move(struct cdrom_device_info * cdi,int position)2520 int ide_cdrom_tray_move (struct cdrom_device_info *cdi, int position)
2521 {
2522 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2523 struct request_sense sense;
2524
2525 if (position) {
2526 int stat = cdrom_lockdoor(drive, 0, &sense);
2527 if (stat) return stat;
2528 }
2529
2530 return cdrom_eject(drive, !position, &sense);
2531 }
2532
2533 static
ide_cdrom_lock_door(struct cdrom_device_info * cdi,int lock)2534 int ide_cdrom_lock_door (struct cdrom_device_info *cdi, int lock)
2535 {
2536 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2537 return cdrom_lockdoor(drive, lock, NULL);
2538 }
2539
2540 static
ide_cdrom_select_speed(struct cdrom_device_info * cdi,int speed)2541 int ide_cdrom_select_speed (struct cdrom_device_info *cdi, int speed)
2542 {
2543 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2544 struct request_sense sense;
2545 int stat;
2546
2547 if ((stat = cdrom_select_speed(drive, speed, &sense)) < 0)
2548 return stat;
2549
2550 cdi->speed = CDROM_STATE_FLAGS(drive)->current_speed;
2551 return 0;
2552 }
2553
2554 static
ide_cdrom_drive_status(struct cdrom_device_info * cdi,int slot_nr)2555 int ide_cdrom_drive_status (struct cdrom_device_info *cdi, int slot_nr)
2556 {
2557 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2558
2559 if (slot_nr == CDSL_CURRENT) {
2560 struct request_sense sense;
2561 int stat = cdrom_check_status(drive, &sense);
2562 if (stat == 0 || sense.sense_key == UNIT_ATTENTION)
2563 return CDS_DISC_OK;
2564
2565 if (sense.sense_key == NOT_READY && sense.asc == 0x04 &&
2566 sense.ascq == 0x04)
2567 return CDS_DISC_OK;
2568
2569
2570 /*
2571 * If not using Mt Fuji extended media tray reports,
2572 * just return TRAY_OPEN since ATAPI doesn't provide
2573 * any other way to detect this...
2574 */
2575 if (sense.sense_key == NOT_READY) {
2576 if (sense.asc == 0x3a && sense.ascq == 1)
2577 return CDS_NO_DISC;
2578 else
2579 return CDS_TRAY_OPEN;
2580 }
2581
2582 return CDS_DRIVE_NOT_READY;
2583 }
2584 return -EINVAL;
2585 }
2586
2587 static
ide_cdrom_get_last_session(struct cdrom_device_info * cdi,struct cdrom_multisession * ms_info)2588 int ide_cdrom_get_last_session (struct cdrom_device_info *cdi,
2589 struct cdrom_multisession *ms_info)
2590 {
2591 struct atapi_toc *toc;
2592 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2593 struct cdrom_info *info = drive->driver_data;
2594 struct request_sense sense;
2595 int ret;
2596
2597 if (!CDROM_STATE_FLAGS(drive)->toc_valid || info->toc == NULL)
2598 if ((ret = cdrom_read_toc(drive, &sense)))
2599 return ret;
2600
2601 toc = info->toc;
2602 ms_info->addr.lba = toc->last_session_lba;
2603 ms_info->xa_flag = toc->xa_flag;
2604
2605 return 0;
2606 }
2607
2608 static
ide_cdrom_get_mcn(struct cdrom_device_info * cdi,struct cdrom_mcn * mcn_info)2609 int ide_cdrom_get_mcn (struct cdrom_device_info *cdi,
2610 struct cdrom_mcn *mcn_info)
2611 {
2612 int stat;
2613 char mcnbuf[24];
2614 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2615
2616 /* get MCN */
2617 if ((stat = cdrom_read_subchannel(drive, 2, mcnbuf, sizeof (mcnbuf), NULL)))
2618 return stat;
2619
2620 memcpy (mcn_info->medium_catalog_number, mcnbuf+9,
2621 sizeof (mcn_info->medium_catalog_number)-1);
2622 mcn_info->medium_catalog_number[sizeof (mcn_info->medium_catalog_number)-1]
2623 = '\0';
2624
2625 return 0;
2626 }
2627
2628
2629
2630 /****************************************************************************
2631 * Other driver requests (open, close, check media change).
2632 */
2633
2634 static
ide_cdrom_check_media_change_real(struct cdrom_device_info * cdi,int slot_nr)2635 int ide_cdrom_check_media_change_real (struct cdrom_device_info *cdi,
2636 int slot_nr)
2637 {
2638 ide_drive_t *drive = (ide_drive_t*) cdi->handle;
2639 int retval;
2640
2641 if (slot_nr == CDSL_CURRENT) {
2642 (void) cdrom_check_status(drive, NULL);
2643 retval = CDROM_STATE_FLAGS(drive)->media_changed;
2644 CDROM_STATE_FLAGS(drive)->media_changed = 0;
2645 return retval;
2646 } else {
2647 return -EINVAL;
2648 }
2649 }
2650
2651
2652 static
ide_cdrom_open_real(struct cdrom_device_info * cdi,int purpose)2653 int ide_cdrom_open_real (struct cdrom_device_info *cdi, int purpose)
2654 {
2655 return 0;
2656 }
2657
2658
2659 /*
2660 * Close down the device. Invalidate all cached blocks.
2661 */
2662
2663 static
ide_cdrom_release_real(struct cdrom_device_info * cdi)2664 void ide_cdrom_release_real (struct cdrom_device_info *cdi)
2665 {
2666 }
2667
2668
2669
2670 /****************************************************************************
2671 * Device initialization.
2672 */
2673 static struct cdrom_device_ops ide_cdrom_dops = {
2674 open: ide_cdrom_open_real,
2675 release: ide_cdrom_release_real,
2676 drive_status: ide_cdrom_drive_status,
2677 media_changed: ide_cdrom_check_media_change_real,
2678 tray_move: ide_cdrom_tray_move,
2679 lock_door: ide_cdrom_lock_door,
2680 select_speed: ide_cdrom_select_speed,
2681 get_last_session: ide_cdrom_get_last_session,
2682 get_mcn: ide_cdrom_get_mcn,
2683 reset: ide_cdrom_reset,
2684 audio_ioctl: ide_cdrom_audio_ioctl,
2685 dev_ioctl: ide_cdrom_dev_ioctl,
2686 capability: CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK |
2687 CDC_SELECT_SPEED | CDC_SELECT_DISC |
2688 CDC_MULTI_SESSION | CDC_MCN |
2689 CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET |
2690 CDC_IOCTLS | CDC_DRIVE_STATUS | CDC_CD_R |
2691 CDC_CD_RW | CDC_DVD | CDC_DVD_R| CDC_DVD_RAM |
2692 CDC_GENERIC_PACKET,
2693 generic_packet: ide_cdrom_packet,
2694 };
2695
ide_cdrom_register(ide_drive_t * drive,int nslots)2696 static int ide_cdrom_register (ide_drive_t *drive, int nslots)
2697 {
2698 struct cdrom_info *info = drive->driver_data;
2699 struct cdrom_device_info *devinfo = &info->devinfo;
2700 int minor = (drive->select.b.unit) << PARTN_BITS;
2701
2702 devinfo->dev = MKDEV(HWIF(drive)->major, minor);
2703 devinfo->ops = &ide_cdrom_dops;
2704 devinfo->mask = 0;
2705 devinfo->speed = CDROM_STATE_FLAGS(drive)->current_speed;
2706 devinfo->capacity = nslots;
2707 devinfo->handle = (void *) drive;
2708 strcpy(devinfo->name, drive->name);
2709
2710 /* set capability mask to match the probe. */
2711 if (!CDROM_CONFIG_FLAGS(drive)->cd_r)
2712 devinfo->mask |= CDC_CD_R;
2713 if (!CDROM_CONFIG_FLAGS(drive)->cd_rw)
2714 devinfo->mask |= CDC_CD_RW;
2715 if (!CDROM_CONFIG_FLAGS(drive)->dvd)
2716 devinfo->mask |= CDC_DVD;
2717 if (!CDROM_CONFIG_FLAGS(drive)->dvd_r)
2718 devinfo->mask |= CDC_DVD_R;
2719 if (!CDROM_CONFIG_FLAGS(drive)->dvd_ram)
2720 devinfo->mask |= CDC_DVD_RAM;
2721 if (!CDROM_CONFIG_FLAGS(drive)->is_changer)
2722 devinfo->mask |= CDC_SELECT_DISC;
2723 if (!CDROM_CONFIG_FLAGS(drive)->audio_play)
2724 devinfo->mask |= CDC_PLAY_AUDIO;
2725 if (!CDROM_CONFIG_FLAGS(drive)->close_tray)
2726 devinfo->mask |= CDC_CLOSE_TRAY;
2727
2728 devinfo->de = devfs_register(drive->de, "cd", DEVFS_FL_DEFAULT,
2729 HWIF(drive)->major, minor,
2730 S_IFBLK | S_IRUGO | S_IWUGO,
2731 ide_fops, NULL);
2732
2733 return register_cdrom(devinfo);
2734 }
2735
2736 static
ide_cdrom_get_capabilities(ide_drive_t * drive,struct atapi_capabilities_page * cap)2737 int ide_cdrom_get_capabilities(ide_drive_t *drive, struct atapi_capabilities_page *cap)
2738 {
2739 struct cdrom_info *info = drive->driver_data;
2740 struct cdrom_device_info *cdi = &info->devinfo;
2741 struct cdrom_generic_command cgc;
2742 int stat, attempts = 3, size = sizeof(*cap);
2743
2744 /*
2745 * ACER50 (and others?) require the full spec length mode sense
2746 * page capabilities size, but older drives break.
2747 */
2748 if (!(!strcmp(drive->id->model, "ATAPI CD ROM DRIVE 50X MAX") ||
2749 !strcmp(drive->id->model, "WPI CDS-32X")))
2750 size -= sizeof(cap->pad);
2751
2752 /* we have to cheat a little here. the packet will eventually
2753 * be queued with ide_cdrom_packet(), which extracts the
2754 * drive from cdi->handle. Since this device hasn't been
2755 * registered with the Uniform layer yet, it can't do this.
2756 * Same goes for cdi->ops.
2757 */
2758 cdi->handle = (ide_drive_t *) drive;
2759 cdi->ops = &ide_cdrom_dops;
2760 init_cdrom_command(&cgc, cap, size, CGC_DATA_UNKNOWN);
2761 do { /* we seem to get stat=0x01,err=0x00 the first time (??) */
2762 stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
2763 if (!stat)
2764 break;
2765 } while (--attempts);
2766 return stat;
2767 }
2768
2769 static
ide_cdrom_probe_capabilities(ide_drive_t * drive)2770 int ide_cdrom_probe_capabilities (ide_drive_t *drive)
2771 {
2772 struct cdrom_info *info = drive->driver_data;
2773 struct cdrom_device_info *cdi = &info->devinfo;
2774 struct atapi_capabilities_page cap;
2775 int nslots = 1;
2776
2777 if (CDROM_CONFIG_FLAGS(drive)->nec260) {
2778 CDROM_CONFIG_FLAGS(drive)->no_eject = 0;
2779 CDROM_CONFIG_FLAGS(drive)->audio_play = 1;
2780 return nslots;
2781 }
2782
2783 if (ide_cdrom_get_capabilities(drive, &cap))
2784 return 0;
2785
2786 if (cap.lock == 0)
2787 CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
2788 if (cap.eject)
2789 CDROM_CONFIG_FLAGS(drive)->no_eject = 0;
2790 if (cap.cd_r_write)
2791 CDROM_CONFIG_FLAGS(drive)->cd_r = 1;
2792 if (cap.cd_rw_write)
2793 CDROM_CONFIG_FLAGS(drive)->cd_rw = 1;
2794 if (cap.test_write)
2795 CDROM_CONFIG_FLAGS(drive)->test_write = 1;
2796 if (cap.dvd_ram_read || cap.dvd_r_read || cap.dvd_rom)
2797 CDROM_CONFIG_FLAGS(drive)->dvd = 1;
2798 if (cap.dvd_ram_write)
2799 CDROM_CONFIG_FLAGS(drive)->dvd_ram = 1;
2800 if (cap.dvd_r_write)
2801 CDROM_CONFIG_FLAGS(drive)->dvd_r = 1;
2802 if (cap.audio_play)
2803 CDROM_CONFIG_FLAGS(drive)->audio_play = 1;
2804 if (cap.mechtype == mechtype_caddy || cap.mechtype == mechtype_popup)
2805 CDROM_CONFIG_FLAGS(drive)->close_tray = 0;
2806
2807 /* Some drives used by Apple don't advertise audio play
2808 * but they do support reading TOC & audio datas
2809 */
2810 if (strcmp(drive->id->model, "MATSHITADVD-ROM SR-8187") == 0 ||
2811 strcmp(drive->id->model, "MATSHITADVD-ROM SR-8186") == 0 ||
2812 strcmp(drive->id->model, "MATSHITADVD-ROM SR-8176") == 0 ||
2813 strcmp(drive->id->model, "MATSHITADVD-ROM SR-8174") == 0)
2814 CDROM_CONFIG_FLAGS(drive)->audio_play = 1;
2815
2816 #if ! STANDARD_ATAPI
2817 if (cdi->sanyo_slot > 0) {
2818 CDROM_CONFIG_FLAGS(drive)->is_changer = 1;
2819 nslots = 3;
2820 }
2821
2822 else
2823 #endif /* not STANDARD_ATAPI */
2824 if (cap.mechtype == mechtype_individual_changer ||
2825 cap.mechtype == mechtype_cartridge_changer) {
2826 if ((nslots = cdrom_number_of_slots(cdi)) > 1) {
2827 CDROM_CONFIG_FLAGS(drive)->is_changer = 1;
2828 CDROM_CONFIG_FLAGS(drive)->supp_disc_present = 1;
2829 }
2830 }
2831
2832 /* The ACER/AOpen 24X cdrom has the speed fields byte-swapped */
2833 if (!drive->id->model[0] &&
2834 !strncmp(drive->id->fw_rev, "241N", 4)) {
2835 CDROM_STATE_FLAGS(drive)->current_speed =
2836 (((unsigned int)cap.curspeed) + (176/2)) / 176;
2837 CDROM_CONFIG_FLAGS(drive)->max_speed =
2838 (((unsigned int)cap.maxspeed) + (176/2)) / 176;
2839 } else {
2840 CDROM_STATE_FLAGS(drive)->current_speed =
2841 (ntohs(cap.curspeed) + (176/2)) / 176;
2842 CDROM_CONFIG_FLAGS(drive)->max_speed =
2843 (ntohs(cap.maxspeed) + (176/2)) / 176;
2844 }
2845
2846 /* don't print speed if the drive reported 0.
2847 */
2848 printk(KERN_INFO "%s: ATAPI", drive->name);
2849 if (CDROM_CONFIG_FLAGS(drive)->max_speed)
2850 printk(" %dX", CDROM_CONFIG_FLAGS(drive)->max_speed);
2851 printk(" %s", CDROM_CONFIG_FLAGS(drive)->dvd ? "DVD-ROM" : "CD-ROM");
2852
2853 if (CDROM_CONFIG_FLAGS(drive)->dvd_r|CDROM_CONFIG_FLAGS(drive)->dvd_ram)
2854 printk(" DVD%s%s",
2855 (CDROM_CONFIG_FLAGS(drive)->dvd_r)? "-R" : "",
2856 (CDROM_CONFIG_FLAGS(drive)->dvd_ram)? "-RAM" : "");
2857
2858 if (CDROM_CONFIG_FLAGS(drive)->cd_r|CDROM_CONFIG_FLAGS(drive)->cd_rw)
2859 printk(" CD%s%s",
2860 (CDROM_CONFIG_FLAGS(drive)->cd_r)? "-R" : "",
2861 (CDROM_CONFIG_FLAGS(drive)->cd_rw)? "/RW" : "");
2862
2863 if (CDROM_CONFIG_FLAGS(drive)->is_changer)
2864 printk(" changer w/%d slots", nslots);
2865 else
2866 printk(" drive");
2867
2868 printk(", %dkB Cache", be16_to_cpu(cap.buffer_size));
2869
2870 #ifdef CONFIG_BLK_DEV_IDEDMA
2871 if (drive->using_dma)
2872 (void) HWIF(drive)->ide_dma_verbose(drive);
2873 #endif /* CONFIG_BLK_DEV_IDEDMA */
2874 printk("\n");
2875
2876 return nslots;
2877 }
2878
ide_cdrom_add_settings(ide_drive_t * drive)2879 static void ide_cdrom_add_settings(ide_drive_t *drive)
2880 {
2881 int major = HWIF(drive)->major;
2882 int minor = drive->select.b.unit << PARTN_BITS;
2883
2884 ide_add_setting(drive, "breada_readahead", SETTING_RW, BLKRAGET, BLKRASET, TYPE_INT, 0, 255, 1, 2, &read_ahead[major], NULL);
2885 ide_add_setting(drive, "file_readahead", SETTING_RW, BLKFRAGET, BLKFRASET, TYPE_INTA, 0, INT_MAX, 1, 1024, &max_readahead[major][minor], NULL);
2886 ide_add_setting(drive, "max_kb_per_request", SETTING_RW, BLKSECTGET, BLKSECTSET, TYPE_INTA, 1, 255, 1, 2, &max_sectors[major][minor], NULL);
2887 ide_add_setting(drive, "dsc_overlap", SETTING_RW, -1, -1, TYPE_BYTE, 0, 1, 1, 1, &drive->dsc_overlap, NULL);
2888 }
2889
2890 static
ide_cdrom_setup(ide_drive_t * drive)2891 int ide_cdrom_setup (ide_drive_t *drive)
2892 {
2893 struct cdrom_info *info = drive->driver_data;
2894 struct cdrom_device_info *cdi = &info->devinfo;
2895 int minor = drive->select.b.unit << PARTN_BITS;
2896 int nslots;
2897
2898 /*
2899 * default to read-only always and fix latter at the bottom
2900 */
2901 set_device_ro(MKDEV(HWIF(drive)->major, minor), 1);
2902 set_blocksize(MKDEV(HWIF(drive)->major, minor), CD_FRAMESIZE);
2903
2904 drive->special.all = 0;
2905 drive->ready_stat = 0;
2906
2907 CDROM_STATE_FLAGS(drive)->media_changed = 1;
2908 CDROM_STATE_FLAGS(drive)->toc_valid = 0;
2909 CDROM_STATE_FLAGS(drive)->door_locked = 0;
2910
2911 #if NO_DOOR_LOCKING
2912 CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
2913 #else
2914 CDROM_CONFIG_FLAGS(drive)->no_doorlock = 0;
2915 #endif
2916
2917 CDROM_CONFIG_FLAGS(drive)->drq_interrupt =
2918 ((drive->id->config & 0x0060) == 0x20);
2919
2920 CDROM_CONFIG_FLAGS(drive)->is_changer = 0;
2921 CDROM_CONFIG_FLAGS(drive)->cd_r = 0;
2922 CDROM_CONFIG_FLAGS(drive)->cd_rw = 0;
2923 CDROM_CONFIG_FLAGS(drive)->test_write = 0;
2924 CDROM_CONFIG_FLAGS(drive)->dvd = 0;
2925 CDROM_CONFIG_FLAGS(drive)->dvd_r = 0;
2926 CDROM_CONFIG_FLAGS(drive)->dvd_ram = 0;
2927 CDROM_CONFIG_FLAGS(drive)->no_eject = 1;
2928 CDROM_CONFIG_FLAGS(drive)->supp_disc_present = 0;
2929 CDROM_CONFIG_FLAGS(drive)->audio_play = 0;
2930 CDROM_CONFIG_FLAGS(drive)->close_tray = 1;
2931
2932 /* limit transfer size per interrupt. */
2933 CDROM_CONFIG_FLAGS(drive)->limit_nframes = 0;
2934
2935 /* a testament to the nice quality of Samsung drives... */
2936 if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2430"))
2937 CDROM_CONFIG_FLAGS(drive)->limit_nframes = 1;
2938 else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2432"))
2939 CDROM_CONFIG_FLAGS(drive)->limit_nframes = 1;
2940 /* the 3231 model does not support the SET_CD_SPEED command */
2941 else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-3231"))
2942 cdi->mask |= CDC_SELECT_SPEED;
2943
2944 #if ! STANDARD_ATAPI
2945 /* by default Sanyo 3 CD changer support is turned off and
2946 ATAPI Rev 2.2+ standard support for CD changers is used */
2947 cdi->sanyo_slot = 0;
2948
2949 CDROM_CONFIG_FLAGS(drive)->nec260 = 0;
2950 CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd = 0;
2951 CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd = 0;
2952 CDROM_CONFIG_FLAGS(drive)->playmsf_as_bcd = 0;
2953 CDROM_CONFIG_FLAGS(drive)->subchan_as_bcd = 0;
2954
2955 if (strcmp (drive->id->model, "V003S0DS") == 0 &&
2956 drive->id->fw_rev[4] == '1' &&
2957 drive->id->fw_rev[6] <= '2') {
2958 /* Vertos 300.
2959 Some versions of this drive like to talk BCD. */
2960 CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd = 1;
2961 CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd = 1;
2962 CDROM_CONFIG_FLAGS(drive)->playmsf_as_bcd = 1;
2963 CDROM_CONFIG_FLAGS(drive)->subchan_as_bcd = 1;
2964 }
2965 else if (strcmp (drive->id->model, "V006E0DS") == 0 &&
2966 drive->id->fw_rev[4] == '1' &&
2967 drive->id->fw_rev[6] <= '2') {
2968 /* Vertos 600 ESD. */
2969 CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd = 1;
2970 }
2971
2972 else if (strcmp(drive->id->model,
2973 "NEC CD-ROM DRIVE:260") == 0 &&
2974 strncmp(drive->id->fw_rev, "1.01", 4) == 0) { /* FIXME */
2975 /* Old NEC260 (not R).
2976 This drive was released before the 1.2 version
2977 of the spec. */
2978 CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd = 1;
2979 CDROM_CONFIG_FLAGS(drive)->playmsf_as_bcd = 1;
2980 CDROM_CONFIG_FLAGS(drive)->subchan_as_bcd = 1;
2981 CDROM_CONFIG_FLAGS(drive)->nec260 = 1;
2982 }
2983 else if (strcmp(drive->id->model, "WEARNES CDD-120") == 0 &&
2984 strncmp(drive->id->fw_rev, "A1.1", 4) == 0) { /* FIXME */
2985 /* Wearnes */
2986 CDROM_CONFIG_FLAGS(drive)->playmsf_as_bcd = 1;
2987 CDROM_CONFIG_FLAGS(drive)->subchan_as_bcd = 1;
2988 }
2989 /* Sanyo 3 CD changer uses a non-standard command
2990 for CD changing */
2991 else if ((strcmp(drive->id->model, "CD-ROM CDR-C3 G") == 0) ||
2992 (strcmp(drive->id->model, "CD-ROM CDR-C3G") == 0) ||
2993 (strcmp(drive->id->model, "CD-ROM CDR_C36") == 0)) {
2994 /* uses CD in slot 0 when value is set to 3 */
2995 cdi->sanyo_slot = 3;
2996 }
2997 #endif /* not STANDARD_ATAPI */
2998
2999 info->toc = NULL;
3000 info->buffer = NULL;
3001 info->sector_buffered = 0;
3002 info->nsectors_buffered = 0;
3003 info->changer_info = NULL;
3004 info->last_block = 0;
3005 info->start_seek = 0;
3006
3007 nslots = ide_cdrom_probe_capabilities (drive);
3008
3009 if (CDROM_CONFIG_FLAGS(drive)->dvd_ram)
3010 set_device_ro(MKDEV(HWIF(drive)->major, minor), 0);
3011
3012 #if 0
3013 drive->dsc_overlap = (HWIF(drive)->no_dsc) ? 0 : 1;
3014 if (HWIF(drive)->no_dsc) {
3015 printk(KERN_INFO "ide-cd: %s: disabling DSC overlap\n",
3016 drive->name);
3017 drive->dsc_overlap = 0;
3018 }
3019 #endif
3020
3021 if (ide_cdrom_register(drive, nslots)) {
3022 printk ("%s: ide_cdrom_setup failed to register device with the cdrom driver.\n", drive->name);
3023 info->devinfo.handle = NULL;
3024 return 1;
3025 }
3026 ide_cdrom_add_settings(drive);
3027 return 0;
3028 }
3029
3030 /* Forwarding functions to generic routines. */
3031 static
ide_cdrom_ioctl(ide_drive_t * drive,struct inode * inode,struct file * file,unsigned int cmd,unsigned long arg)3032 int ide_cdrom_ioctl (ide_drive_t *drive,
3033 struct inode *inode, struct file *file,
3034 unsigned int cmd, unsigned long arg)
3035 {
3036 return cdrom_ioctl(inode, file, cmd, arg);
3037 }
3038
3039 static
ide_cdrom_open(struct inode * ip,struct file * fp,ide_drive_t * drive)3040 int ide_cdrom_open (struct inode *ip, struct file *fp, ide_drive_t *drive)
3041 {
3042 struct cdrom_info *info = drive->driver_data;
3043 int rc = -ENOMEM;
3044
3045 MOD_INC_USE_COUNT;
3046 if (info->buffer == NULL)
3047 info->buffer = (char *) kmalloc(SECTOR_BUFFER_SIZE, GFP_KERNEL);
3048 if ((info->buffer == NULL) || (rc = cdrom_open(ip, fp))) {
3049 drive->usage--;
3050 MOD_DEC_USE_COUNT;
3051 }
3052 return rc;
3053 }
3054
3055 static
ide_cdrom_release(struct inode * inode,struct file * file,ide_drive_t * drive)3056 void ide_cdrom_release (struct inode *inode, struct file *file,
3057 ide_drive_t *drive)
3058 {
3059 cdrom_release (inode, file);
3060 MOD_DEC_USE_COUNT;
3061 }
3062
3063 static
ide_cdrom_check_media_change(ide_drive_t * drive)3064 int ide_cdrom_check_media_change (ide_drive_t *drive)
3065 {
3066 return cdrom_media_changed(MKDEV (HWIF(drive)->major,
3067 (drive->select.b.unit) << PARTN_BITS));
3068 }
3069
3070 static
ide_cdrom_revalidate(ide_drive_t * drive)3071 void ide_cdrom_revalidate (ide_drive_t *drive)
3072 {
3073 struct cdrom_info *info = drive->driver_data;
3074 struct atapi_toc *toc;
3075 int minor = drive->select.b.unit << PARTN_BITS;
3076 struct request_sense sense;
3077
3078 cdrom_read_toc(drive, &sense);
3079
3080 if (!CDROM_STATE_FLAGS(drive)->toc_valid)
3081 return;
3082
3083 toc = info->toc;
3084
3085 /* for general /dev/cdrom like mounting, one big disc */
3086 drive->part[0].nr_sects = toc->capacity * SECTORS_PER_FRAME;
3087 HWIF(drive)->gd->sizes[minor] = toc->capacity * BLOCKS_PER_FRAME;
3088
3089 /*
3090 * reset block size, ide_revalidate_disk incorrectly sets it to
3091 * 1024 even for CDROM's
3092 */
3093 blk_size[HWIF(drive)->major] = HWIF(drive)->gd->sizes;
3094 set_blocksize(MKDEV(HWIF(drive)->major, minor), CD_FRAMESIZE);
3095 }
3096
3097 static
ide_cdrom_capacity(ide_drive_t * drive)3098 unsigned long ide_cdrom_capacity (ide_drive_t *drive)
3099 {
3100 unsigned long capacity;
3101
3102 if (cdrom_read_capacity(drive, &capacity, NULL))
3103 return 0;
3104
3105 return capacity * SECTORS_PER_FRAME;
3106 }
3107
3108 static
ide_cdrom_cleanup(ide_drive_t * drive)3109 int ide_cdrom_cleanup(ide_drive_t *drive)
3110 {
3111 struct cdrom_info *info = drive->driver_data;
3112 struct cdrom_device_info *devinfo = &info->devinfo;
3113
3114 if (ide_unregister_subdriver(drive)) {
3115 printk("%s: %s: failed to ide_unregister_subdriver\n",
3116 __FUNCTION__, drive->name);
3117 return 1;
3118 }
3119 if (info->buffer != NULL)
3120 kfree(info->buffer);
3121 if (info->toc != NULL)
3122 kfree(info->toc);
3123 if (info->changer_info != NULL)
3124 kfree(info->changer_info);
3125 if (devinfo->handle == drive && unregister_cdrom(devinfo))
3126 printk("%s: ide_cdrom_cleanup failed to unregister device from the cdrom driver.\n", drive->name);
3127 kfree(info);
3128 drive->driver_data = NULL;
3129 return 0;
3130 }
3131
3132 int ide_cdrom_init(void);
3133 int ide_cdrom_attach (ide_drive_t *drive);
3134
3135 static ide_driver_t ide_cdrom_driver = {
3136 name: "ide-cdrom",
3137 version: IDECD_VERSION,
3138 media: ide_cdrom,
3139 busy: 0,
3140 supports_dma: 1,
3141 supports_dsc_overlap: 1,
3142 cleanup: ide_cdrom_cleanup,
3143 standby: NULL,
3144 suspend: NULL,
3145 resume: NULL,
3146 flushcache: NULL,
3147 do_request: ide_do_rw_cdrom,
3148 end_request: ide_cdrom_end_request,
3149 sense: ide_cdrom_dump_status,
3150 error: ide_cdrom_error,
3151 abort: ide_cdrom_abort,
3152 ioctl: ide_cdrom_ioctl,
3153 open: ide_cdrom_open,
3154 release: ide_cdrom_release,
3155 media_change: ide_cdrom_check_media_change,
3156 revalidate: ide_cdrom_revalidate,
3157 pre_reset: NULL,
3158 capacity: ide_cdrom_capacity,
3159 special: NULL,
3160 proc: NULL,
3161 init: ide_cdrom_init,
3162 attach: ide_cdrom_attach,
3163 ata_prebuilder: NULL,
3164 atapi_prebuilder: NULL,
3165 };
3166
3167 static ide_module_t ide_cdrom_module = {
3168 IDE_DRIVER_MODULE,
3169 ide_cdrom_init,
3170 &ide_cdrom_driver,
3171 NULL
3172 };
3173
3174 /* options */
3175 char *ignore = NULL;
3176
3177 MODULE_PARM(ignore, "s");
3178 MODULE_DESCRIPTION("ATAPI CD-ROM Driver");
3179
ide_cdrom_attach(ide_drive_t * drive)3180 int ide_cdrom_attach (ide_drive_t *drive)
3181 {
3182 struct cdrom_info *info;
3183 int failed = 0;
3184
3185 if (drive->scsi) {
3186 printk("ide-cd: passing drive %s to ide-scsi emulation.\n",
3187 drive->name);
3188 return 1;
3189 }
3190
3191 MOD_INC_USE_COUNT;
3192 info = (struct cdrom_info *) kmalloc (sizeof (struct cdrom_info), GFP_KERNEL);
3193 if (info == NULL) {
3194 printk("%s: Can't allocate a cdrom structure\n", drive->name);
3195 MOD_DEC_USE_COUNT;
3196 return 1;
3197 }
3198 if (ide_register_subdriver(drive,
3199 &ide_cdrom_driver, IDE_SUBDRIVER_VERSION)) {
3200 printk(KERN_ERR "ide-cd: %s: Failed to register the driver "
3201 "with ide.c\n", drive->name);
3202 kfree(info);
3203 MOD_DEC_USE_COUNT;
3204 return 1;
3205 }
3206 memset(info, 0, sizeof(struct cdrom_info));
3207 drive->driver_data = info;
3208 DRIVER(drive)->busy++;
3209 if (ide_cdrom_setup(drive)) {
3210 DRIVER(drive)->busy--;
3211 if (ide_cdrom_cleanup(drive))
3212 printk("%s: ide_cdrom_cleanup failed in "
3213 "ide_cdrom_init\n", drive->name);
3214 MOD_DEC_USE_COUNT;
3215 return 1;
3216 }
3217 DRIVER(drive)->busy--;
3218 failed--;
3219
3220 MOD_DEC_USE_COUNT;
3221 return 0;
3222 }
3223
ide_cdrom_exit(void)3224 static void __exit ide_cdrom_exit(void)
3225 {
3226 ide_drive_t *drive;
3227 int failed = 0;
3228
3229 while ((drive = ide_scan_devices(ide_cdrom, ide_cdrom_driver.name,
3230 &ide_cdrom_driver, failed)) != NULL)
3231 if (ide_cdrom_cleanup(drive)) {
3232 printk("%s: cleanup_module() called while still "
3233 "busy\n", drive->name);
3234 failed++;
3235 }
3236 ide_unregister_module(&ide_cdrom_module);
3237 }
3238
ide_cdrom_init(void)3239 int ide_cdrom_init(void)
3240 {
3241 #ifdef CLASSIC_BUILTINS_METHOD
3242 ide_drive_t *drive;
3243 struct cdrom_info *info;
3244 int failed = 0;
3245 #endif /* CLASSIC_BUILTINS_METHOD */
3246 MOD_INC_USE_COUNT;
3247 #ifdef CLASSIC_BUILTINS_METHOD
3248 while ((drive = ide_scan_devices(ide_cdrom,
3249 ide_cdrom_driver.name, NULL, failed++)) != NULL) {
3250 /* skip drives that we were told to ignore */
3251 if (ignore != NULL) {
3252 if (strstr(ignore, drive->name)) {
3253 printk("ide-cd: ignoring drive %s\n",
3254 drive->name);
3255 continue;
3256 }
3257 }
3258 if (drive->scsi) {
3259 printk("ide-cd: passing drive %s to ide-scsi "
3260 "emulation.\n", drive->name);
3261 continue;
3262 }
3263 info = (struct cdrom_info *) kmalloc (sizeof (struct cdrom_info), GFP_KERNEL);
3264 if (info == NULL) {
3265 printk ("%s: Can't allocate a cdrom structure\n",
3266 drive->name);
3267 continue;
3268 }
3269 if (ide_register_subdriver(drive,
3270 &ide_cdrom_driver, IDE_SUBDRIVER_VERSION)) {
3271 printk("ide-cd: %s: Failed to register the driver with "
3272 "ide.c\n", drive->name);
3273 kfree(info);
3274 continue;
3275 }
3276 memset (info, 0, sizeof (struct cdrom_info));
3277 drive->driver_data = info;
3278 DRIVER(drive)->busy++;
3279 if (ide_cdrom_setup (drive)) {
3280 DRIVER(drive)->busy--;
3281 if (ide_cdrom_cleanup (drive))
3282 printk ("%s: ide_cdrom_cleanup failed in "
3283 "ide_cdrom_init\n", drive->name);
3284 continue;
3285 }
3286 DRIVER(drive)->busy--;
3287 failed--;
3288 }
3289 #endif /* CLASSIC_BUILTINS_METHOD */
3290 ide_register_module(&ide_cdrom_module);
3291 MOD_DEC_USE_COUNT;
3292 return 0;
3293 }
3294
3295 module_init(ide_cdrom_init);
3296 module_exit(ide_cdrom_exit);
3297 MODULE_LICENSE("GPL");
3298