]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/ide/ide-cd.c
ide-cd: remove NO_DOOR_LOCKING define
[mirror_ubuntu-bionic-kernel.git] / drivers / ide / ide-cd.c
CommitLineData
1da177e4
LT
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 accommodated as much
23 * as possible via compile time or command-line options. Since I only have
24 * a few drives, you generally need to send me patches...
25 *
26 * ----------------------------------
27 * TO DO LIST:
28 * -Make it so that Pioneer CD DR-A24X and friends don't get screwed up on
29 * boot
30 *
03553353
BZ
31 * For historical changelog please see:
32 * Documentation/ide/ChangeLog.ide-cd.1994-2004
33 */
34
1da177e4
LT
35#define IDECD_VERSION "4.61"
36
1da177e4
LT
37#include <linux/module.h>
38#include <linux/types.h>
39#include <linux/kernel.h>
40#include <linux/delay.h>
41#include <linux/timer.h>
42#include <linux/slab.h>
43#include <linux/interrupt.h>
44#include <linux/errno.h>
45#include <linux/cdrom.h>
46#include <linux/ide.h>
47#include <linux/completion.h>
cf8b8975 48#include <linux/mutex.h>
1da177e4
LT
49
50#include <scsi/scsi.h> /* For SCSI -> ATAPI command conversion */
51
52#include <asm/irq.h>
53#include <asm/io.h>
54#include <asm/byteorder.h>
55#include <asm/uaccess.h>
56#include <asm/unaligned.h>
57
58#include "ide-cd.h"
59
cf8b8975 60static DEFINE_MUTEX(idecd_ref_mutex);
1da177e4
LT
61
62#define to_ide_cd(obj) container_of(obj, struct cdrom_info, kref)
63
64#define ide_cd_g(disk) \
65 container_of((disk)->private_data, struct cdrom_info, driver)
66
67static struct cdrom_info *ide_cd_get(struct gendisk *disk)
68{
69 struct cdrom_info *cd = NULL;
70
cf8b8975 71 mutex_lock(&idecd_ref_mutex);
1da177e4
LT
72 cd = ide_cd_g(disk);
73 if (cd)
74 kref_get(&cd->kref);
cf8b8975 75 mutex_unlock(&idecd_ref_mutex);
1da177e4
LT
76 return cd;
77}
78
79static void ide_cd_release(struct kref *);
80
81static void ide_cd_put(struct cdrom_info *cd)
82{
cf8b8975 83 mutex_lock(&idecd_ref_mutex);
1da177e4 84 kref_put(&cd->kref, ide_cd_release);
cf8b8975 85 mutex_unlock(&idecd_ref_mutex);
1da177e4
LT
86}
87
88/****************************************************************************
89 * Generic packet command support and error handling routines.
90 */
91
92/* Mark that we've seen a media change, and invalidate our internal
93 buffers. */
94static void cdrom_saw_media_change (ide_drive_t *drive)
95{
0ba11211
BZ
96 struct cdrom_info *cd = drive->driver_data;
97
2bc4cf2d
BZ
98 cd->cd_flags |= IDE_CD_FLAG_MEDIA_CHANGED;
99 cd->cd_flags &= ~IDE_CD_FLAG_TOC_VALID;
0ba11211 100 cd->nsectors_buffered = 0;
1da177e4
LT
101}
102
103static int cdrom_log_sense(ide_drive_t *drive, struct request *rq,
104 struct request_sense *sense)
105{
106 int log = 0;
107
4aff5e23 108 if (!sense || !rq || (rq->cmd_flags & REQ_QUIET))
1da177e4
LT
109 return 0;
110
111 switch (sense->sense_key) {
112 case NO_SENSE: case RECOVERED_ERROR:
113 break;
114 case NOT_READY:
115 /*
116 * don't care about tray state messages for
117 * e.g. capacity commands or in-progress or
118 * becoming ready
119 */
120 if (sense->asc == 0x3a || sense->asc == 0x04)
121 break;
122 log = 1;
123 break;
124 case ILLEGAL_REQUEST:
125 /*
126 * don't log START_STOP unit with LoEj set, since
127 * we cannot reliably check if drive can auto-close
128 */
129 if (rq->cmd[0] == GPCMD_START_STOP_UNIT && sense->asc == 0x24)
dbe217af
AC
130 break;
131 log = 1;
1da177e4
LT
132 break;
133 case UNIT_ATTENTION:
134 /*
135 * Make good and sure we've seen this potential media
136 * change. Some drives (i.e. Creative) fail to present
137 * the correct sense key in the error register.
138 */
139 cdrom_saw_media_change(drive);
140 break;
141 default:
142 log = 1;
143 break;
144 }
145 return log;
146}
147
148static
149void cdrom_analyze_sense_data(ide_drive_t *drive,
150 struct request *failed_command,
151 struct request_sense *sense)
152{
dbe217af
AC
153 unsigned long sector;
154 unsigned long bio_sectors;
155 unsigned long valid;
156 struct cdrom_info *info = drive->driver_data;
157
1da177e4
LT
158 if (!cdrom_log_sense(drive, failed_command, sense))
159 return;
160
161 /*
162 * If a read toc is executed for a CD-R or CD-RW medium where
163 * the first toc has not been recorded yet, it will fail with
164 * 05/24/00 (which is a confusing error)
165 */
166 if (failed_command && failed_command->cmd[0] == GPCMD_READ_TOC_PMA_ATIP)
167 if (sense->sense_key == 0x05 && sense->asc == 0x24)
168 return;
169
dbe217af
AC
170 if (sense->error_code == 0x70) { /* Current Error */
171 switch(sense->sense_key) {
172 case MEDIUM_ERROR:
173 case VOLUME_OVERFLOW:
174 case ILLEGAL_REQUEST:
175 if (!sense->valid)
176 break;
177 if (failed_command == NULL ||
178 !blk_fs_request(failed_command))
179 break;
180 sector = (sense->information[0] << 24) |
181 (sense->information[1] << 16) |
182 (sense->information[2] << 8) |
183 (sense->information[3]);
184
185 bio_sectors = bio_sectors(failed_command->bio);
186 if (bio_sectors < 4)
187 bio_sectors = 4;
188 if (drive->queue->hardsect_size == 2048)
189 sector <<= 2; /* Device sector size is 2K */
190 sector &= ~(bio_sectors -1);
191 valid = (sector - failed_command->sector) << 9;
192
193 if (valid < 0)
194 valid = 0;
195 if (sector < get_capacity(info->disk) &&
196 drive->probed_capacity - sector < 4 * 75) {
197 set_capacity(info->disk, sector);
198 }
199 }
200 }
1da177e4
LT
201#if VERBOSE_IDE_CD_ERRORS
202 {
203 int i;
70d1d47c 204 const char *s = "bad sense key!";
1da177e4
LT
205 char buf[80];
206
207 printk ("ATAPI device %s:\n", drive->name);
208 if (sense->error_code==0x70)
209 printk(" Error: ");
210 else if (sense->error_code==0x71)
211 printk(" Deferred Error: ");
212 else if (sense->error_code == 0x7f)
213 printk(" Vendor-specific Error: ");
214 else
215 printk(" Unknown Error Type: ");
216
74c8f97a 217 if (sense->sense_key < ARRAY_SIZE(sense_key_texts))
1da177e4 218 s = sense_key_texts[sense->sense_key];
1da177e4
LT
219
220 printk("%s -- (Sense key=0x%02x)\n", s, sense->sense_key);
221
222 if (sense->asc == 0x40) {
223 sprintf(buf, "Diagnostic failure on component 0x%02x",
224 sense->ascq);
225 s = buf;
226 } else {
74c8f97a 227 int lo = 0, mid, hi = ARRAY_SIZE(sense_data_texts);
1da177e4
LT
228 unsigned long key = (sense->sense_key << 16);
229 key |= (sense->asc << 8);
230 if (!(sense->ascq >= 0x80 && sense->ascq <= 0xdd))
231 key |= sense->ascq;
232 s = NULL;
233
234 while (hi > lo) {
235 mid = (lo + hi) / 2;
236 if (sense_data_texts[mid].asc_ascq == key ||
237 sense_data_texts[mid].asc_ascq == (0xff0000|key)) {
238 s = sense_data_texts[mid].text;
239 break;
240 }
241 else if (sense_data_texts[mid].asc_ascq > key)
242 hi = mid;
243 else
244 lo = mid+1;
245 }
246 }
247
248 if (s == NULL) {
249 if (sense->asc > 0x80)
250 s = "(vendor-specific error)";
251 else
252 s = "(reserved error code)";
253 }
254
255 printk(KERN_ERR " %s -- (asc=0x%02x, ascq=0x%02x)\n",
256 s, sense->asc, sense->ascq);
257
258 if (failed_command != NULL) {
259
74c8f97a 260 int lo=0, mid, hi= ARRAY_SIZE(packet_command_texts);
1da177e4
LT
261 s = NULL;
262
263 while (hi > lo) {
264 mid = (lo + hi) / 2;
265 if (packet_command_texts[mid].packet_command ==
266 failed_command->cmd[0]) {
267 s = packet_command_texts[mid].text;
268 break;
269 }
270 if (packet_command_texts[mid].packet_command >
271 failed_command->cmd[0])
272 hi = mid;
273 else
274 lo = mid+1;
275 }
276
277 printk (KERN_ERR " The failed \"%s\" packet command was: \n \"", s);
278 for (i=0; i<sizeof (failed_command->cmd); i++)
279 printk ("%02x ", failed_command->cmd[i]);
280 printk ("\"\n");
281 }
282
283 /* The SKSV bit specifies validity of the sense_key_specific
284 * in the next two commands. It is bit 7 of the first byte.
285 * In the case of NOT_READY, if SKSV is set the drive can
286 * give us nice ETA readings.
287 */
288 if (sense->sense_key == NOT_READY && (sense->sks[0] & 0x80)) {
289 int progress = (sense->sks[1] << 8 | sense->sks[2]) * 100;
290 printk(KERN_ERR " Command is %02d%% complete\n", progress / 0xffff);
291
292 }
293
294 if (sense->sense_key == ILLEGAL_REQUEST &&
295 (sense->sks[0] & 0x80) != 0) {
296 printk(KERN_ERR " Error in %s byte %d",
297 (sense->sks[0] & 0x40) != 0 ?
298 "command packet" : "command data",
299 (sense->sks[1] << 8) + sense->sks[2]);
300
301 if ((sense->sks[0] & 0x40) != 0)
302 printk (" bit %d", sense->sks[0] & 0x07);
303
304 printk ("\n");
305 }
306 }
307
308#else /* not VERBOSE_IDE_CD_ERRORS */
309
310 /* Suppress printing unit attention and `in progress of becoming ready'
311 errors when we're not being verbose. */
312
313 if (sense->sense_key == UNIT_ATTENTION ||
314 (sense->sense_key == NOT_READY && (sense->asc == 4 ||
315 sense->asc == 0x3a)))
316 return;
317
318 printk(KERN_ERR "%s: error code: 0x%02x sense_key: 0x%02x asc: 0x%02x ascq: 0x%02x\n",
319 drive->name,
320 sense->error_code, sense->sense_key,
321 sense->asc, sense->ascq);
322#endif /* not VERBOSE_IDE_CD_ERRORS */
323}
324
325/*
326 * Initialize a ide-cd packet command request
327 */
328static void cdrom_prepare_request(ide_drive_t *drive, struct request *rq)
329{
330 struct cdrom_info *cd = drive->driver_data;
331
332 ide_init_drive_cmd(rq);
cea2885a 333 rq->cmd_type = REQ_TYPE_ATA_PC;
1da177e4
LT
334 rq->rq_disk = cd->disk;
335}
336
337static void cdrom_queue_request_sense(ide_drive_t *drive, void *sense,
338 struct request *failed_command)
339{
340 struct cdrom_info *info = drive->driver_data;
341 struct request *rq = &info->request_sense_request;
342
343 if (sense == NULL)
344 sense = &info->sense_data;
345
346 /* stuff the sense request in front of our current request */
347 cdrom_prepare_request(drive, rq);
348
349 rq->data = sense;
350 rq->cmd[0] = GPCMD_REQUEST_SENSE;
351 rq->cmd[4] = rq->data_len = 18;
352
4aff5e23 353 rq->cmd_type = REQ_TYPE_SENSE;
1da177e4
LT
354
355 /* NOTE! Save the failed command in "rq->buffer" */
356 rq->buffer = (void *) failed_command;
357
358 (void) ide_do_drive_cmd(drive, rq, ide_preempt);
359}
360
361static void cdrom_end_request (ide_drive_t *drive, int uptodate)
362{
363 struct request *rq = HWGROUP(drive)->rq;
364 int nsectors = rq->hard_cur_sectors;
365
4aff5e23 366 if (blk_sense_request(rq) && uptodate) {
1da177e4 367 /*
4aff5e23
JA
368 * For REQ_TYPE_SENSE, "rq->buffer" points to the original
369 * failed request
1da177e4
LT
370 */
371 struct request *failed = (struct request *) rq->buffer;
372 struct cdrom_info *info = drive->driver_data;
373 void *sense = &info->sense_data;
374 unsigned long flags;
375
376 if (failed) {
377 if (failed->sense) {
378 sense = failed->sense;
379 failed->sense_len = rq->sense_len;
380 }
dbe217af 381 cdrom_analyze_sense_data(drive, failed, sense);
1da177e4
LT
382 /*
383 * now end failed request
384 */
dbe217af
AC
385 if (blk_fs_request(failed)) {
386 if (ide_end_dequeued_request(drive, failed, 0,
387 failed->hard_nr_sectors))
388 BUG();
389 } else {
390 spin_lock_irqsave(&ide_lock, flags);
5e36bb6e
KU
391 if (__blk_end_request(failed, -EIO,
392 failed->data_len))
393 BUG();
dbe217af
AC
394 spin_unlock_irqrestore(&ide_lock, flags);
395 }
396 } else
397 cdrom_analyze_sense_data(drive, NULL, sense);
1da177e4
LT
398 }
399
400 if (!rq->current_nr_sectors && blk_fs_request(rq))
401 uptodate = 1;
402 /* make sure it's fully ended */
403 if (blk_pc_request(rq))
404 nsectors = (rq->data_len + 511) >> 9;
405 if (!nsectors)
406 nsectors = 1;
407
408 ide_end_request(drive, uptodate, nsectors);
409}
410
dbe217af
AC
411static void ide_dump_status_no_sense(ide_drive_t *drive, const char *msg, u8 stat)
412{
413 if (stat & 0x80)
414 return;
415 ide_dump_status(drive, msg, stat);
416}
417
1da177e4
LT
418/* Returns 0 if the request should be continued.
419 Returns 1 if the request was ended. */
420static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
421{
422 struct request *rq = HWGROUP(drive)->rq;
423 int stat, err, sense_key;
424
425 /* Check for errors. */
426 stat = HWIF(drive)->INB(IDE_STATUS_REG);
427 if (stat_ret)
428 *stat_ret = stat;
429
430 if (OK_STAT(stat, good_stat, BAD_R_STAT))
431 return 0;
432
433 /* Get the IDE error register. */
434 err = HWIF(drive)->INB(IDE_ERROR_REG);
435 sense_key = err >> 4;
436
437 if (rq == NULL) {
438 printk("%s: missing rq in cdrom_decode_status\n", drive->name);
439 return 1;
440 }
441
4aff5e23 442 if (blk_sense_request(rq)) {
1da177e4
LT
443 /* We got an error trying to get sense info
444 from the drive (probably while trying
445 to recover from a former error). Just give up. */
446
4aff5e23 447 rq->cmd_flags |= REQ_FAILED;
1da177e4
LT
448 cdrom_end_request(drive, 0);
449 ide_error(drive, "request sense failure", stat);
450 return 1;
451
8770c018 452 } else if (blk_pc_request(rq) || rq->cmd_type == REQ_TYPE_ATA_PC) {
1da177e4
LT
453 /* All other functions, except for READ. */
454 unsigned long flags;
455
456 /*
457 * if we have an error, pass back CHECK_CONDITION as the
458 * scsi status byte
459 */
b7156731 460 if (blk_pc_request(rq) && !rq->errors)
1da177e4
LT
461 rq->errors = SAM_STAT_CHECK_CONDITION;
462
463 /* Check for tray open. */
464 if (sense_key == NOT_READY) {
465 cdrom_saw_media_change (drive);
466 } else if (sense_key == UNIT_ATTENTION) {
467 /* Check for media change. */
468 cdrom_saw_media_change (drive);
469 /*printk("%s: media changed\n",drive->name);*/
470 return 0;
76ca1af1
SH
471 } else if ((sense_key == ILLEGAL_REQUEST) &&
472 (rq->cmd[0] == GPCMD_START_STOP_UNIT)) {
473 /*
474 * Don't print error message for this condition--
475 * SFF8090i indicates that 5/24/00 is the correct
476 * response to a request to close the tray if the
477 * drive doesn't have that capability.
478 * cdrom_log_sense() knows this!
479 */
4aff5e23 480 } else if (!(rq->cmd_flags & REQ_QUIET)) {
1da177e4
LT
481 /* Otherwise, print an error. */
482 ide_dump_status(drive, "packet command error", stat);
483 }
484
4aff5e23 485 rq->cmd_flags |= REQ_FAILED;
1da177e4
LT
486
487 /*
488 * instead of playing games with moving completions around,
489 * remove failed request completely and end it when the
490 * request sense has completed
491 */
492 if (stat & ERR_STAT) {
493 spin_lock_irqsave(&ide_lock, flags);
494 blkdev_dequeue_request(rq);
495 HWGROUP(drive)->rq = NULL;
496 spin_unlock_irqrestore(&ide_lock, flags);
497
498 cdrom_queue_request_sense(drive, rq->sense, rq);
499 } else
500 cdrom_end_request(drive, 0);
501
502 } else if (blk_fs_request(rq)) {
503 int do_end_request = 0;
504
505 /* Handle errors from READ and WRITE requests. */
506
507 if (blk_noretry_request(rq))
508 do_end_request = 1;
509
510 if (sense_key == NOT_READY) {
511 /* Tray open. */
512 if (rq_data_dir(rq) == READ) {
513 cdrom_saw_media_change (drive);
514
515 /* Fail the request. */
516 printk ("%s: tray open\n", drive->name);
517 do_end_request = 1;
518 } else {
519 struct cdrom_info *info = drive->driver_data;
520
521 /* allow the drive 5 seconds to recover, some
522 * devices will return this error while flushing
523 * data from cache */
524 if (!rq->errors)
525 info->write_timeout = jiffies + ATAPI_WAIT_WRITE_BUSY;
526 rq->errors = 1;
527 if (time_after(jiffies, info->write_timeout))
528 do_end_request = 1;
529 else {
530 unsigned long flags;
531
532 /*
533 * take a breather relying on the
534 * unplug timer to kick us again
535 */
536 spin_lock_irqsave(&ide_lock, flags);
537 blk_plug_device(drive->queue);
538 spin_unlock_irqrestore(&ide_lock,flags);
539 return 1;
540 }
541 }
542 } else if (sense_key == UNIT_ATTENTION) {
543 /* Media change. */
544 cdrom_saw_media_change (drive);
545
546 /* Arrange to retry the request.
547 But be sure to give up if we've retried
548 too many times. */
549 if (++rq->errors > ERROR_MAX)
550 do_end_request = 1;
551 } else if (sense_key == ILLEGAL_REQUEST ||
552 sense_key == DATA_PROTECT) {
553 /* No point in retrying after an illegal
554 request or data protect error.*/
dbe217af 555 ide_dump_status_no_sense (drive, "command error", stat);
1da177e4
LT
556 do_end_request = 1;
557 } else if (sense_key == MEDIUM_ERROR) {
558 /* No point in re-trying a zillion times on a bad
559 * sector... If we got here the error is not correctable */
dbe217af 560 ide_dump_status_no_sense (drive, "media error (bad sector)", stat);
1da177e4
LT
561 do_end_request = 1;
562 } else if (sense_key == BLANK_CHECK) {
563 /* Disk appears blank ?? */
dbe217af 564 ide_dump_status_no_sense (drive, "media error (blank)", stat);
1da177e4
LT
565 do_end_request = 1;
566 } else if ((err & ~ABRT_ERR) != 0) {
567 /* Go to the default handler
568 for other errors. */
569 ide_error(drive, "cdrom_decode_status", stat);
570 return 1;
571 } else if ((++rq->errors > ERROR_MAX)) {
572 /* We've racked up too many retries. Abort. */
573 do_end_request = 1;
574 }
575
dbe217af
AC
576 /* End a request through request sense analysis when we have
577 sense data. We need this in order to perform end of media
578 processing */
579
580 if (do_end_request) {
581 if (stat & ERR_STAT) {
582 unsigned long flags;
583 spin_lock_irqsave(&ide_lock, flags);
584 blkdev_dequeue_request(rq);
585 HWGROUP(drive)->rq = NULL;
586 spin_unlock_irqrestore(&ide_lock, flags);
587
588 cdrom_queue_request_sense(drive, rq->sense, rq);
589 } else
590 cdrom_end_request(drive, 0);
591 } else {
592 /* If we got a CHECK_CONDITION status,
593 queue a request sense command. */
594 if (stat & ERR_STAT)
595 cdrom_queue_request_sense(drive, NULL, NULL);
596 }
1da177e4
LT
597 } else {
598 blk_dump_rq_flags(rq, "ide-cd: bad rq");
599 cdrom_end_request(drive, 0);
600 }
601
602 /* Retry, or handle the next request. */
603 return 1;
604}
605
606static int cdrom_timer_expiry(ide_drive_t *drive)
607{
608 struct request *rq = HWGROUP(drive)->rq;
609 unsigned long wait = 0;
610
611 /*
612 * Some commands are *slow* and normally take a long time to
613 * complete. Usually we can use the ATAPI "disconnect" to bypass
614 * this, but not all commands/drives support that. Let
615 * ide_timer_expiry keep polling us for these.
616 */
617 switch (rq->cmd[0]) {
618 case GPCMD_BLANK:
619 case GPCMD_FORMAT_UNIT:
620 case GPCMD_RESERVE_RZONE_TRACK:
621 case GPCMD_CLOSE_TRACK:
622 case GPCMD_FLUSH_CACHE:
623 wait = ATAPI_WAIT_PC;
624 break;
625 default:
4aff5e23 626 if (!(rq->cmd_flags & REQ_QUIET))
1da177e4
LT
627 printk(KERN_INFO "ide-cd: cmd 0x%x timed out\n", rq->cmd[0]);
628 wait = 0;
629 break;
630 }
631 return wait;
632}
633
634/* Set up the device registers for transferring a packet command on DEV,
635 expecting to later transfer XFERLEN bytes. HANDLER is the routine
636 which actually transfers the command to the drive. If this is a
637 drq_interrupt device, this routine will arrange for HANDLER to be
638 called when the interrupt from the drive arrives. Otherwise, HANDLER
639 will be called immediately after the drive is prepared for the transfer. */
640
641static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive,
642 int xferlen,
643 ide_handler_t *handler)
644{
645 ide_startstop_t startstop;
646 struct cdrom_info *info = drive->driver_data;
647 ide_hwif_t *hwif = drive->hwif;
648
649 /* Wait for the controller to be idle. */
650 if (ide_wait_stat(&startstop, drive, 0, BUSY_STAT, WAIT_READY))
651 return startstop;
652
3a6a3549 653 /* FIXME: for Virtual DMA we must check harder */
1da177e4
LT
654 if (info->dma)
655 info->dma = !hwif->dma_setup(drive);
656
657 /* Set up the controller registers. */
2fc57388
BZ
658 ide_pktcmd_tf_load(drive, IDE_TFLAG_OUT_NSECT | IDE_TFLAG_OUT_LBAL |
659 IDE_TFLAG_NO_SELECT_MASK, xferlen, info->dma);
4fe67178 660
2bc4cf2d 661 if (info->cd_flags & IDE_CD_FLAG_DRQ_INTERRUPT) {
f0dd8712
AL
662 /* waiting for CDB interrupt, not DMA yet. */
663 if (info->dma)
664 drive->waiting_for_dma = 0;
665
1da177e4
LT
666 /* packet command */
667 ide_execute_command(drive, WIN_PACKETCMD, handler, ATAPI_WAIT_PC, cdrom_timer_expiry);
668 return ide_started;
669 } else {
670 unsigned long flags;
671
672 /* packet command */
673 spin_lock_irqsave(&ide_lock, flags);
674 hwif->OUTBSYNC(drive, WIN_PACKETCMD, IDE_COMMAND_REG);
675 ndelay(400);
676 spin_unlock_irqrestore(&ide_lock, flags);
677
678 return (*handler) (drive);
679 }
680}
681
682/* Send a packet command to DRIVE described by CMD_BUF and CMD_LEN.
683 The device registers must have already been prepared
684 by cdrom_start_packet_command.
685 HANDLER is the interrupt handler to call when the command completes
686 or there's data ready. */
1da177e4
LT
687#define ATAPI_MIN_CDB_BYTES 12
688static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive,
689 struct request *rq,
690 ide_handler_t *handler)
691{
692 ide_hwif_t *hwif = drive->hwif;
693 int cmd_len;
694 struct cdrom_info *info = drive->driver_data;
695 ide_startstop_t startstop;
696
2bc4cf2d 697 if (info->cd_flags & IDE_CD_FLAG_DRQ_INTERRUPT) {
1da177e4
LT
698 /* Here we should have been called after receiving an interrupt
699 from the device. DRQ should how be set. */
700
701 /* Check for errors. */
702 if (cdrom_decode_status(drive, DRQ_STAT, NULL))
703 return ide_stopped;
f0dd8712
AL
704
705 /* Ok, next interrupt will be DMA interrupt. */
706 if (info->dma)
707 drive->waiting_for_dma = 1;
1da177e4
LT
708 } else {
709 /* Otherwise, we must wait for DRQ to get set. */
710 if (ide_wait_stat(&startstop, drive, DRQ_STAT,
711 BUSY_STAT, WAIT_READY))
712 return startstop;
713 }
714
715 /* Arm the interrupt handler. */
716 ide_set_handler(drive, handler, rq->timeout, cdrom_timer_expiry);
717
718 /* ATAPI commands get padded out to 12 bytes minimum */
719 cmd_len = COMMAND_SIZE(rq->cmd[0]);
720 if (cmd_len < ATAPI_MIN_CDB_BYTES)
721 cmd_len = ATAPI_MIN_CDB_BYTES;
722
723 /* Send the command to the device. */
724 HWIF(drive)->atapi_output_bytes(drive, rq->cmd, cmd_len);
725
726 /* Start the DMA if need be */
727 if (info->dma)
728 hwif->dma_start(drive);
729
730 return ide_started;
731}
732
733/****************************************************************************
734 * Block read functions.
735 */
736
68661c53
BZ
737typedef void (xfer_func_t)(ide_drive_t *, void *, u32);
738
5a5222d9
BZ
739static void ide_cd_pad_transfer(ide_drive_t *drive, xfer_func_t *xf, int len)
740{
741 while (len > 0) {
742 int dum = 0;
743 xf(drive, &dum, sizeof(dum));
744 len -= sizeof(dum);
745 }
746}
747
1da177e4
LT
748/*
749 * Buffer up to SECTORS_TO_TRANSFER sectors from the drive in our sector
750 * buffer. Once the first sector is added, any subsequent sectors are
751 * assumed to be continuous (until the buffer is cleared). For the first
752 * sector added, SECTOR is its sector number. (SECTOR is then ignored until
753 * the buffer is cleared.)
754 */
755static void cdrom_buffer_sectors (ide_drive_t *drive, unsigned long sector,
756 int sectors_to_transfer)
757{
758 struct cdrom_info *info = drive->driver_data;
759
760 /* Number of sectors to read into the buffer. */
761 int sectors_to_buffer = min_t(int, sectors_to_transfer,
762 (SECTOR_BUFFER_SIZE >> SECTOR_BITS) -
763 info->nsectors_buffered);
764
765 char *dest;
766
767 /* If we couldn't get a buffer, don't try to buffer anything... */
768 if (info->buffer == NULL)
769 sectors_to_buffer = 0;
770
771 /* If this is the first sector in the buffer, remember its number. */
772 if (info->nsectors_buffered == 0)
773 info->sector_buffered = sector;
774
775 /* Read the data into the buffer. */
776 dest = info->buffer + info->nsectors_buffered * SECTOR_SIZE;
777 while (sectors_to_buffer > 0) {
778 HWIF(drive)->atapi_input_bytes(drive, dest, SECTOR_SIZE);
779 --sectors_to_buffer;
780 --sectors_to_transfer;
781 ++info->nsectors_buffered;
782 dest += SECTOR_SIZE;
783 }
784
785 /* Throw away any remaining data. */
786 while (sectors_to_transfer > 0) {
787 static char dum[SECTOR_SIZE];
788 HWIF(drive)->atapi_input_bytes(drive, dum, sizeof (dum));
789 --sectors_to_transfer;
790 }
791}
792
793/*
794 * Check the contents of the interrupt reason register from the cdrom
795 * and attempt to recover if there are problems. Returns 0 if everything's
796 * ok; nonzero if the request has been terminated.
797 */
858119e1 798static
1da177e4
LT
799int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason)
800{
801 if (ireason == 2)
802 return 0;
803 else if (ireason == 0) {
5a5222d9
BZ
804 ide_hwif_t *hwif = drive->hwif;
805
1da177e4 806 /* Whoops... The drive is expecting to receive data from us! */
35379c07
BZ
807 printk(KERN_ERR "%s: %s: wrong transfer direction!\n",
808 drive->name, __FUNCTION__);
1da177e4
LT
809
810 /* Throw some data at the drive so it doesn't hang
811 and quit this request. */
5a5222d9 812 ide_cd_pad_transfer(drive, hwif->atapi_output_bytes, len);
1da177e4
LT
813 } else if (ireason == 1) {
814 /* Some drives (ASUS) seem to tell us that status
815 * info is available. just get it and ignore.
816 */
817 (void) HWIF(drive)->INB(IDE_STATUS_REG);
818 return 0;
819 } else {
820 /* Drive wants a command packet, or invalid ireason... */
35379c07
BZ
821 printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n",
822 drive->name, __FUNCTION__, ireason);
1da177e4
LT
823 }
824
825 cdrom_end_request(drive, 0);
826 return -1;
827}
828
829/*
830 * Interrupt routine. Called when a read request has completed.
831 */
832static ide_startstop_t cdrom_read_intr (ide_drive_t *drive)
833{
834 int stat;
835 int ireason, len, sectors_to_transfer, nskip;
836 struct cdrom_info *info = drive->driver_data;
837 u8 lowcyl = 0, highcyl = 0;
838 int dma = info->dma, dma_error = 0;
839
840 struct request *rq = HWGROUP(drive)->rq;
841
842 /*
843 * handle dma case
844 */
845 if (dma) {
846 info->dma = 0;
52ef2ed0
BZ
847 dma_error = HWIF(drive)->ide_dma_end(drive);
848 if (dma_error) {
849 printk(KERN_ERR "%s: DMA read error\n", drive->name);
7469aaf6 850 ide_dma_off(drive);
52ef2ed0 851 }
1da177e4
LT
852 }
853
854 if (cdrom_decode_status(drive, 0, &stat))
855 return ide_stopped;
856
857 if (dma) {
858 if (!dma_error) {
859 ide_end_request(drive, 1, rq->nr_sectors);
860 return ide_stopped;
861 } else
862 return ide_error(drive, "dma error", stat);
863 }
864
865 /* Read the interrupt reason and the transfer length. */
866 ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3;
867 lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
868 highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
869
870 len = lowcyl + (256 * highcyl);
871
872 /* If DRQ is clear, the command has completed. */
873 if ((stat & DRQ_STAT) == 0) {
874 /* If we're not done filling the current buffer, complain.
875 Otherwise, complete the command normally. */
876 if (rq->current_nr_sectors > 0) {
877 printk (KERN_ERR "%s: cdrom_read_intr: data underrun (%d blocks)\n",
878 drive->name, rq->current_nr_sectors);
4aff5e23 879 rq->cmd_flags |= REQ_FAILED;
1da177e4
LT
880 cdrom_end_request(drive, 0);
881 } else
882 cdrom_end_request(drive, 1);
883 return ide_stopped;
884 }
885
886 /* Check that the drive is expecting to do the same thing we are. */
887 if (cdrom_read_check_ireason (drive, len, ireason))
888 return ide_stopped;
889
890 /* Assume that the drive will always provide data in multiples
891 of at least SECTOR_SIZE, as it gets hairy to keep track
892 of the transfers otherwise. */
893 if ((len % SECTOR_SIZE) != 0) {
894 printk (KERN_ERR "%s: cdrom_read_intr: Bad transfer size %d\n",
895 drive->name, len);
2bc4cf2d 896 if (info->cd_flags & IDE_CD_FLAG_LIMIT_NFRAMES)
1da177e4
LT
897 printk (KERN_ERR " This drive is not supported by this version of the driver\n");
898 else {
899 printk (KERN_ERR " Trying to limit transfer sizes\n");
2bc4cf2d 900 info->cd_flags |= IDE_CD_FLAG_LIMIT_NFRAMES;
1da177e4
LT
901 }
902 cdrom_end_request(drive, 0);
903 return ide_stopped;
904 }
905
906 /* The number of sectors we need to read from the drive. */
907 sectors_to_transfer = len / SECTOR_SIZE;
908
909 /* First, figure out if we need to bit-bucket
910 any of the leading sectors. */
911 nskip = min_t(int, rq->current_nr_sectors - bio_cur_sectors(rq->bio), sectors_to_transfer);
912
913 while (nskip > 0) {
914 /* We need to throw away a sector. */
915 static char dum[SECTOR_SIZE];
916 HWIF(drive)->atapi_input_bytes(drive, dum, sizeof (dum));
917
918 --rq->current_nr_sectors;
919 --nskip;
920 --sectors_to_transfer;
921 }
922
923 /* Now loop while we still have data to read from the drive. */
924 while (sectors_to_transfer > 0) {
925 int this_transfer;
926
927 /* If we've filled the present buffer but there's another
928 chained buffer after it, move on. */
929 if (rq->current_nr_sectors == 0 && rq->nr_sectors)
930 cdrom_end_request(drive, 1);
931
932 /* If the buffers are full, cache the rest of the data in our
933 internal buffer. */
934 if (rq->current_nr_sectors == 0) {
935 cdrom_buffer_sectors(drive, rq->sector, sectors_to_transfer);
936 sectors_to_transfer = 0;
937 } else {
938 /* Transfer data to the buffers.
939 Figure out how many sectors we can transfer
940 to the current buffer. */
941 this_transfer = min_t(int, sectors_to_transfer,
942 rq->current_nr_sectors);
943
944 /* Read this_transfer sectors
945 into the current buffer. */
946 while (this_transfer > 0) {
947 HWIF(drive)->atapi_input_bytes(drive, rq->buffer, SECTOR_SIZE);
948 rq->buffer += SECTOR_SIZE;
949 --rq->nr_sectors;
950 --rq->current_nr_sectors;
951 ++rq->sector;
952 --this_transfer;
953 --sectors_to_transfer;
954 }
955 }
956 }
957
958 /* Done moving data! Wait for another interrupt. */
959 ide_set_handler(drive, &cdrom_read_intr, ATAPI_WAIT_PC, NULL);
960 return ide_started;
961}
962
963/*
964 * Try to satisfy some of the current read request from our cached data.
965 * Returns nonzero if the request has been completed, zero otherwise.
966 */
967static int cdrom_read_from_buffer (ide_drive_t *drive)
968{
969 struct cdrom_info *info = drive->driver_data;
970 struct request *rq = HWGROUP(drive)->rq;
971 unsigned short sectors_per_frame;
972
973 sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS;
974
975 /* Can't do anything if there's no buffer. */
976 if (info->buffer == NULL) return 0;
977
978 /* Loop while this request needs data and the next block is present
979 in our cache. */
980 while (rq->nr_sectors > 0 &&
981 rq->sector >= info->sector_buffered &&
982 rq->sector < info->sector_buffered + info->nsectors_buffered) {
983 if (rq->current_nr_sectors == 0)
984 cdrom_end_request(drive, 1);
985
986 memcpy (rq->buffer,
987 info->buffer +
988 (rq->sector - info->sector_buffered) * SECTOR_SIZE,
989 SECTOR_SIZE);
990 rq->buffer += SECTOR_SIZE;
991 --rq->current_nr_sectors;
992 --rq->nr_sectors;
993 ++rq->sector;
994 }
995
996 /* If we've satisfied the current request,
997 terminate it successfully. */
998 if (rq->nr_sectors == 0) {
999 cdrom_end_request(drive, 1);
1000 return -1;
1001 }
1002
1003 /* Move on to the next buffer if needed. */
1004 if (rq->current_nr_sectors == 0)
1005 cdrom_end_request(drive, 1);
1006
1007 /* If this condition does not hold, then the kluge i use to
1008 represent the number of sectors to skip at the start of a transfer
1009 will fail. I think that this will never happen, but let's be
1010 paranoid and check. */
1011 if (rq->current_nr_sectors < bio_cur_sectors(rq->bio) &&
1012 (rq->sector & (sectors_per_frame - 1))) {
1013 printk(KERN_ERR "%s: cdrom_read_from_buffer: buffer botch (%ld)\n",
1014 drive->name, (long)rq->sector);
1015 cdrom_end_request(drive, 0);
1016 return -1;
1017 }
1018
1019 return 0;
1020}
1021
1022/*
1023 * Routine to send a read packet command to the drive.
1024 * This is usually called directly from cdrom_start_read.
1025 * However, for drq_interrupt devices, it is called from an interrupt
1026 * when the drive is ready to accept the command.
1027 */
1028static ide_startstop_t cdrom_start_read_continuation (ide_drive_t *drive)
1029{
1030 struct request *rq = HWGROUP(drive)->rq;
1031 unsigned short sectors_per_frame;
1032 int nskip;
1033
1034 sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS;
1035
1036 /* If the requested sector doesn't start on a cdrom block boundary,
1037 we must adjust the start of the transfer so that it does,
1038 and remember to skip the first few sectors.
1039 If the CURRENT_NR_SECTORS field is larger than the size
1040 of the buffer, it will mean that we're to skip a number
1041 of sectors equal to the amount by which CURRENT_NR_SECTORS
1042 is larger than the buffer size. */
1043 nskip = rq->sector & (sectors_per_frame - 1);
1044 if (nskip > 0) {
1045 /* Sanity check... */
1046 if (rq->current_nr_sectors != bio_cur_sectors(rq->bio) &&
1047 (rq->sector & (sectors_per_frame - 1))) {
1048 printk(KERN_ERR "%s: cdrom_start_read_continuation: buffer botch (%u)\n",
1049 drive->name, rq->current_nr_sectors);
1050 cdrom_end_request(drive, 0);
1051 return ide_stopped;
1052 }
1053 rq->current_nr_sectors += nskip;
1054 }
1055
1056 /* Set up the command */
1057 rq->timeout = ATAPI_WAIT_PC;
1058
1059 /* Send the command to the drive and return. */
1060 return cdrom_transfer_packet_command(drive, rq, &cdrom_read_intr);
1061}
1062
1063
1064#define IDECD_SEEK_THRESHOLD (1000) /* 1000 blocks */
1065#define IDECD_SEEK_TIMER (5 * WAIT_MIN_SLEEP) /* 100 ms */
1066#define IDECD_SEEK_TIMEOUT (2 * WAIT_CMD) /* 20 sec */
1067
1068static ide_startstop_t cdrom_seek_intr (ide_drive_t *drive)
1069{
1070 struct cdrom_info *info = drive->driver_data;
1071 int stat;
1072 static int retry = 10;
1073
1074 if (cdrom_decode_status(drive, 0, &stat))
1075 return ide_stopped;
4fe67178 1076
2bc4cf2d 1077 info->cd_flags |= IDE_CD_FLAG_SEEKING;
1da177e4
LT
1078
1079 if (retry && time_after(jiffies, info->start_seek + IDECD_SEEK_TIMER)) {
1080 if (--retry == 0) {
1081 /*
1082 * this condition is far too common, to bother
1083 * users about it
1084 */
1085 /* printk("%s: disabled DSC seek overlap\n", drive->name);*/
1086 drive->dsc_overlap = 0;
1087 }
1088 }
1089 return ide_stopped;
1090}
1091
1092static ide_startstop_t cdrom_start_seek_continuation (ide_drive_t *drive)
1093{
1094 struct request *rq = HWGROUP(drive)->rq;
1095 sector_t frame = rq->sector;
1096
1097 sector_div(frame, queue_hardsect_size(drive->queue) >> SECTOR_BITS);
1098
1099 memset(rq->cmd, 0, sizeof(rq->cmd));
1100 rq->cmd[0] = GPCMD_SEEK;
1101 put_unaligned(cpu_to_be32(frame), (unsigned int *) &rq->cmd[2]);
1102
1103 rq->timeout = ATAPI_WAIT_PC;
1104 return cdrom_transfer_packet_command(drive, rq, &cdrom_seek_intr);
1105}
1106
1107static ide_startstop_t cdrom_start_seek (ide_drive_t *drive, unsigned int block)
1108{
1109 struct cdrom_info *info = drive->driver_data;
1110
1111 info->dma = 0;
1da177e4
LT
1112 info->start_seek = jiffies;
1113 return cdrom_start_packet_command(drive, 0, cdrom_start_seek_continuation);
1114}
1115
1116/* Fix up a possibly partially-processed request so that we can
1117 start it over entirely, or even put it back on the request queue. */
1118static void restore_request (struct request *rq)
1119{
1120 if (rq->buffer != bio_data(rq->bio)) {
1121 sector_t n = (rq->buffer - (char *) bio_data(rq->bio)) / SECTOR_SIZE;
1122
1123 rq->buffer = bio_data(rq->bio);
1124 rq->nr_sectors += n;
1125 rq->sector -= n;
1126 }
1127 rq->hard_cur_sectors = rq->current_nr_sectors = bio_cur_sectors(rq->bio);
1128 rq->hard_nr_sectors = rq->nr_sectors;
1129 rq->hard_sector = rq->sector;
1130 rq->q->prep_rq_fn(rq->q, rq);
1131}
1132
1133/*
1134 * Start a read request from the CD-ROM.
1135 */
1136static ide_startstop_t cdrom_start_read (ide_drive_t *drive, unsigned int block)
1137{
1138 struct cdrom_info *info = drive->driver_data;
1139 struct request *rq = HWGROUP(drive)->rq;
1140 unsigned short sectors_per_frame;
1141
1142 sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS;
1143
1144 /* We may be retrying this request after an error. Fix up
1145 any weirdness which might be present in the request packet. */
1146 restore_request(rq);
1147
1148 /* Satisfy whatever we can of this request from our cached sector. */
1149 if (cdrom_read_from_buffer(drive))
1150 return ide_stopped;
1151
1da177e4
LT
1152 /* Clear the local sector buffer. */
1153 info->nsectors_buffered = 0;
1154
1155 /* use dma, if possible. */
1156 info->dma = drive->using_dma;
1157 if ((rq->sector & (sectors_per_frame - 1)) ||
1158 (rq->nr_sectors & (sectors_per_frame - 1)))
1159 info->dma = 0;
1160
1da177e4
LT
1161 /* Start sending the read request to the drive. */
1162 return cdrom_start_packet_command(drive, 32768, cdrom_start_read_continuation);
1163}
1164
1165/****************************************************************************
1166 * Execute all other packet commands.
1167 */
1168
1169/* Interrupt routine for packet command completion. */
1170static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive)
1171{
1da177e4 1172 struct request *rq = HWGROUP(drive)->rq;
68661c53
BZ
1173 xfer_func_t *xferfunc = NULL;
1174 int stat, ireason, len, thislen, write;
1da177e4 1175 u8 lowcyl = 0, highcyl = 0;
1da177e4
LT
1176
1177 /* Check for errors. */
1178 if (cdrom_decode_status(drive, 0, &stat))
1179 return ide_stopped;
1180
1181 /* Read the interrupt reason and the transfer length. */
8606ab09 1182 ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3;
1da177e4
LT
1183 lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1184 highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1185
1186 len = lowcyl + (256 * highcyl);
1187
1188 /* If DRQ is clear, the command has completed.
1189 Complain if we still have data left to transfer. */
1190 if ((stat & DRQ_STAT) == 0) {
1191 /* Some of the trailing request sense fields are optional, and
1192 some drives don't send them. Sigh. */
1193 if (rq->cmd[0] == GPCMD_REQUEST_SENSE &&
1194 rq->data_len > 0 &&
1195 rq->data_len <= 5) {
1196 while (rq->data_len > 0) {
1197 *(unsigned char *)rq->data++ = 0;
1198 --rq->data_len;
1199 }
1200 }
1201
1202 if (rq->data_len == 0)
1203 cdrom_end_request(drive, 1);
1204 else {
4aff5e23 1205 rq->cmd_flags |= REQ_FAILED;
1da177e4
LT
1206 cdrom_end_request(drive, 0);
1207 }
1208 return ide_stopped;
1209 }
1210
1211 /* Figure out how much data to transfer. */
1212 thislen = rq->data_len;
68661c53
BZ
1213 if (thislen > len)
1214 thislen = len;
1da177e4 1215
8606ab09 1216 if (ireason == 0) {
68661c53
BZ
1217 write = 1;
1218 xferfunc = HWIF(drive)->atapi_output_bytes;
1219 } else if (ireason == 2) {
1220 write = 0;
1221 xferfunc = HWIF(drive)->atapi_input_bytes;
1da177e4
LT
1222 }
1223
68661c53 1224 if (xferfunc) {
1da177e4 1225 if (!rq->data) {
f1071e62
BZ
1226 printk(KERN_ERR "%s: confused, missing data\n",
1227 drive->name);
68661c53
BZ
1228 blk_dump_rq_flags(rq, write ? "cdrom_pc_intr, write"
1229 : "cdrom_pc_intr, read");
f1071e62 1230 goto pad;
1da177e4
LT
1231 }
1232 /* Transfer the data. */
68661c53 1233 xferfunc(drive, rq->data, thislen);
1da177e4 1234
1da177e4 1235 /* Keep count of how much data we've moved. */
5a5222d9 1236 len -= thislen;
1da177e4
LT
1237 rq->data += thislen;
1238 rq->data_len -= thislen;
1239
68661c53 1240 if (write && blk_sense_request(rq))
1da177e4
LT
1241 rq->sense_len += thislen;
1242 } else {
1da177e4 1243 printk (KERN_ERR "%s: cdrom_pc_intr: The drive "
1ad55440
RK
1244 "appears confused (ireason = 0x%02x). "
1245 "Trying to recover by ending request.\n",
1da177e4 1246 drive->name, ireason);
4aff5e23 1247 rq->cmd_flags |= REQ_FAILED;
1ad55440
RK
1248 cdrom_end_request(drive, 0);
1249 return ide_stopped;
1da177e4 1250 }
f1071e62 1251pad:
5a5222d9
BZ
1252 /*
1253 * If we haven't moved enough data to satisfy the drive,
1254 * add some padding.
1255 */
1256 if (len > 0)
1257 ide_cd_pad_transfer(drive, xferfunc, len);
1258
1da177e4
LT
1259 /* Now we wait for another interrupt. */
1260 ide_set_handler(drive, &cdrom_pc_intr, ATAPI_WAIT_PC, cdrom_timer_expiry);
1261 return ide_started;
1262}
1263
1264static ide_startstop_t cdrom_do_pc_continuation (ide_drive_t *drive)
1265{
1266 struct request *rq = HWGROUP(drive)->rq;
1267
1268 if (!rq->timeout)
1269 rq->timeout = ATAPI_WAIT_PC;
1270
1271 /* Send the command to the drive and return. */
1272 return cdrom_transfer_packet_command(drive, rq, &cdrom_pc_intr);
1273}
1274
1275
1276static ide_startstop_t cdrom_do_packet_command (ide_drive_t *drive)
1277{
1278 int len;
1279 struct request *rq = HWGROUP(drive)->rq;
1280 struct cdrom_info *info = drive->driver_data;
1281
1282 info->dma = 0;
4aff5e23 1283 rq->cmd_flags &= ~REQ_FAILED;
1da177e4
LT
1284 len = rq->data_len;
1285
1286 /* Start sending the command to the drive. */
1287 return cdrom_start_packet_command(drive, len, cdrom_do_pc_continuation);
1288}
1289
1290
dbe217af 1291static int cdrom_queue_packet_command(ide_drive_t *drive, struct request *rq)
1da177e4
LT
1292{
1293 struct request_sense sense;
1294 int retries = 10;
4aff5e23 1295 unsigned int flags = rq->cmd_flags;
1da177e4
LT
1296
1297 if (rq->sense == NULL)
1298 rq->sense = &sense;
1299
1300 /* Start of retry loop. */
1301 do {
1302 int error;
1303 unsigned long time = jiffies;
4aff5e23 1304 rq->cmd_flags = flags;
1da177e4
LT
1305
1306 error = ide_do_drive_cmd(drive, rq, ide_wait);
1307 time = jiffies - time;
1308
1309 /* FIXME: we should probably abort/retry or something
1310 * in case of failure */
4aff5e23 1311 if (rq->cmd_flags & REQ_FAILED) {
1da177e4
LT
1312 /* The request failed. Retry if it was due to a unit
1313 attention status
1314 (usually means media was changed). */
1315 struct request_sense *reqbuf = rq->sense;
1316
1317 if (reqbuf->sense_key == UNIT_ATTENTION)
1318 cdrom_saw_media_change(drive);
1319 else if (reqbuf->sense_key == NOT_READY &&
1320 reqbuf->asc == 4 && reqbuf->ascq != 4) {
1321 /* The drive is in the process of loading
1322 a disk. Retry, but wait a little to give
1323 the drive time to complete the load. */
1324 ssleep(2);
1325 } else {
1326 /* Otherwise, don't retry. */
1327 retries = 0;
1328 }
1329 --retries;
1330 }
1331
1332 /* End of retry loop. */
4aff5e23 1333 } while ((rq->cmd_flags & REQ_FAILED) && retries >= 0);
1da177e4
LT
1334
1335 /* Return an error if the command failed. */
4aff5e23 1336 return (rq->cmd_flags & REQ_FAILED) ? -EIO : 0;
1da177e4
LT
1337}
1338
1339/*
1340 * Write handling
1341 */
858119e1 1342static int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason)
1da177e4
LT
1343{
1344 /* Two notes about IDE interrupt reason here - 0 means that
1345 * the drive wants to receive data from us, 2 means that
1346 * the drive is expecting to transfer data to us.
1347 */
1348 if (ireason == 0)
1349 return 0;
1350 else if (ireason == 2) {
5a5222d9
BZ
1351 ide_hwif_t *hwif = drive->hwif;
1352
1da177e4 1353 /* Whoops... The drive wants to send data. */
35379c07
BZ
1354 printk(KERN_ERR "%s: %s: wrong transfer direction!\n",
1355 drive->name, __FUNCTION__);
1da177e4 1356
5a5222d9 1357 ide_cd_pad_transfer(drive, hwif->atapi_input_bytes, len);
1da177e4
LT
1358 } else {
1359 /* Drive wants a command packet, or invalid ireason... */
35379c07
BZ
1360 printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n",
1361 drive->name, __FUNCTION__, ireason);
1da177e4
LT
1362 }
1363
1364 cdrom_end_request(drive, 0);
1365 return 1;
1366}
1367
aaa04c28
KU
1368/*
1369 * Called from blk_end_request_callback() after the data of the request
1370 * is completed and before the request is completed.
1371 * By returning value '1', blk_end_request_callback() returns immediately
1372 * without completing the request.
1373 */
1374static int cdrom_newpc_intr_dummy_cb(struct request *rq)
1375{
1376 return 1;
1377}
1378
1da177e4
LT
1379/*
1380 * best way to deal with dma that is not sector aligned right now... note
1381 * that in this path we are not using ->data or ->buffer at all. this irs
1382 * can replace cdrom_pc_intr, cdrom_read_intr, and cdrom_write_intr in the
1383 * future.
1384 */
1385static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
1386{
1387 struct cdrom_info *info = drive->driver_data;
1388 struct request *rq = HWGROUP(drive)->rq;
1389 int dma_error, dma, stat, ireason, len, thislen;
1390 u8 lowcyl, highcyl;
1391 xfer_func_t *xferfunc;
1392 unsigned long flags;
1393
1394 /* Check for errors. */
1395 dma_error = 0;
1396 dma = info->dma;
1397 if (dma) {
1398 info->dma = 0;
1399 dma_error = HWIF(drive)->ide_dma_end(drive);
eba15fba
BZ
1400 if (dma_error) {
1401 printk(KERN_ERR "%s: DMA %s error\n", drive->name,
1402 rq_data_dir(rq) ? "write" : "read");
1403 ide_dma_off(drive);
1404 }
1da177e4
LT
1405 }
1406
1407 if (cdrom_decode_status(drive, 0, &stat))
1408 return ide_stopped;
1409
1410 /*
1411 * using dma, transfer is complete now
1412 */
1413 if (dma) {
eba15fba 1414 if (dma_error)
1da177e4 1415 return ide_error(drive, "dma error", stat);
1da177e4 1416
aaa04c28
KU
1417 spin_lock_irqsave(&ide_lock, flags);
1418 if (__blk_end_request(rq, 0, rq->data_len))
1419 BUG();
1420 HWGROUP(drive)->rq = NULL;
1421 spin_unlock_irqrestore(&ide_lock, flags);
1422
1423 return ide_stopped;
1da177e4
LT
1424 }
1425
1426 /*
1427 * ok we fall to pio :/
1428 */
1429 ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3;
1430 lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1431 highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1432
1433 len = lowcyl + (256 * highcyl);
1434 thislen = rq->data_len;
1435 if (thislen > len)
1436 thislen = len;
1437
1438 /*
1439 * If DRQ is clear, the command has completed.
1440 */
aaa04c28
KU
1441 if ((stat & DRQ_STAT) == 0) {
1442 spin_lock_irqsave(&ide_lock, flags);
4f4f6c25 1443 if (__blk_end_request(rq, 0, rq->data_len))
aaa04c28
KU
1444 BUG();
1445 HWGROUP(drive)->rq = NULL;
1446 spin_unlock_irqrestore(&ide_lock, flags);
1447
1448 return ide_stopped;
1449 }
1da177e4
LT
1450
1451 /*
1452 * check which way to transfer data
1453 */
1454 if (rq_data_dir(rq) == WRITE) {
1455 /*
1456 * write to drive
1457 */
1458 if (cdrom_write_check_ireason(drive, len, ireason))
1459 return ide_stopped;
1460
1461 xferfunc = HWIF(drive)->atapi_output_bytes;
1462 } else {
1463 /*
1464 * read from drive
1465 */
1466 if (cdrom_read_check_ireason(drive, len, ireason))
1467 return ide_stopped;
1468
1469 xferfunc = HWIF(drive)->atapi_input_bytes;
1470 }
1471
1472 /*
1473 * transfer data
1474 */
1475 while (thislen > 0) {
1476 int blen = blen = rq->data_len;
1477 char *ptr = rq->data;
1478
1479 /*
1480 * bio backed?
1481 */
1482 if (rq->bio) {
1483 ptr = bio_data(rq->bio);
1484 blen = bio_iovec(rq->bio)->bv_len;
1485 }
1486
1487 if (!ptr) {
1488 printk(KERN_ERR "%s: confused, missing data\n", drive->name);
1489 break;
1490 }
1491
1492 if (blen > thislen)
1493 blen = thislen;
1494
1495 xferfunc(drive, ptr, blen);
1496
1497 thislen -= blen;
1498 len -= blen;
1499 rq->data_len -= blen;
1500
1501 if (rq->bio)
aaa04c28
KU
1502 /*
1503 * The request can't be completed until DRQ is cleared.
1504 * So complete the data, but don't complete the request
1505 * using the dummy function for the callback feature
1506 * of blk_end_request_callback().
1507 */
1508 blk_end_request_callback(rq, 0, blen,
1509 cdrom_newpc_intr_dummy_cb);
1da177e4
LT
1510 else
1511 rq->data += blen;
1512 }
1513
1514 /*
1515 * pad, if necessary
1516 */
5a5222d9
BZ
1517 if (len > 0)
1518 ide_cd_pad_transfer(drive, xferfunc, len);
1da177e4 1519
125e1874 1520 BUG_ON(HWGROUP(drive)->handler != NULL);
1da177e4
LT
1521
1522 ide_set_handler(drive, cdrom_newpc_intr, rq->timeout, NULL);
1523 return ide_started;
1da177e4
LT
1524}
1525
1526static ide_startstop_t cdrom_write_intr(ide_drive_t *drive)
1527{
1528 int stat, ireason, len, sectors_to_transfer, uptodate;
1529 struct cdrom_info *info = drive->driver_data;
1530 int dma_error = 0, dma = info->dma;
1531 u8 lowcyl = 0, highcyl = 0;
1532
1533 struct request *rq = HWGROUP(drive)->rq;
1534
1535 /* Check for errors. */
1536 if (dma) {
1537 info->dma = 0;
b481b238
BZ
1538 dma_error = HWIF(drive)->ide_dma_end(drive);
1539 if (dma_error) {
1540 printk(KERN_ERR "%s: DMA write error\n", drive->name);
7469aaf6 1541 ide_dma_off(drive);
1da177e4
LT
1542 }
1543 }
1544
1545 if (cdrom_decode_status(drive, 0, &stat))
1546 return ide_stopped;
1547
1548 /*
1549 * using dma, transfer is complete now
1550 */
1551 if (dma) {
1552 if (dma_error)
1553 return ide_error(drive, "dma error", stat);
1554
1555 ide_end_request(drive, 1, rq->nr_sectors);
1556 return ide_stopped;
1557 }
1558
1559 /* Read the interrupt reason and the transfer length. */
31a71191 1560 ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3;
1da177e4
LT
1561 lowcyl = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1562 highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1563
1564 len = lowcyl + (256 * highcyl);
1565
1566 /* If DRQ is clear, the command has completed. */
1567 if ((stat & DRQ_STAT) == 0) {
1568 /* If we're not done writing, complain.
1569 * Otherwise, complete the command normally.
1570 */
1571 uptodate = 1;
1572 if (rq->current_nr_sectors > 0) {
b481b238
BZ
1573 printk(KERN_ERR "%s: %s: data underrun (%d blocks)\n",
1574 drive->name, __FUNCTION__,
1575 rq->current_nr_sectors);
1da177e4
LT
1576 uptodate = 0;
1577 }
1578 cdrom_end_request(drive, uptodate);
1579 return ide_stopped;
1580 }
1581
1582 /* Check that the drive is expecting to do the same thing we are. */
1583 if (cdrom_write_check_ireason(drive, len, ireason))
1584 return ide_stopped;
1585
1586 sectors_to_transfer = len / SECTOR_SIZE;
1587
1588 /*
1589 * now loop and write out the data
1590 */
1591 while (sectors_to_transfer > 0) {
1592 int this_transfer;
1593
1594 if (!rq->current_nr_sectors) {
b481b238
BZ
1595 printk(KERN_ERR "%s: %s: confused, missing data\n",
1596 drive->name, __FUNCTION__);
1da177e4
LT
1597 break;
1598 }
1599
1600 /*
1601 * Figure out how many sectors we can transfer
1602 */
1603 this_transfer = min_t(int, sectors_to_transfer, rq->current_nr_sectors);
1604
1605 while (this_transfer > 0) {
1606 HWIF(drive)->atapi_output_bytes(drive, rq->buffer, SECTOR_SIZE);
1607 rq->buffer += SECTOR_SIZE;
1608 --rq->nr_sectors;
1609 --rq->current_nr_sectors;
1610 ++rq->sector;
1611 --this_transfer;
1612 --sectors_to_transfer;
1613 }
1614
1615 /*
1616 * current buffer complete, move on
1617 */
1618 if (rq->current_nr_sectors == 0 && rq->nr_sectors)
1619 cdrom_end_request(drive, 1);
1620 }
1621
1622 /* re-arm handler */
1623 ide_set_handler(drive, &cdrom_write_intr, ATAPI_WAIT_PC, NULL);
1624 return ide_started;
1625}
1626
1627static ide_startstop_t cdrom_start_write_cont(ide_drive_t *drive)
1628{
1629 struct request *rq = HWGROUP(drive)->rq;
1630
1631#if 0 /* the immediate bit */
1632 rq->cmd[1] = 1 << 3;
1633#endif
1634 rq->timeout = ATAPI_WAIT_PC;
1635
1636 return cdrom_transfer_packet_command(drive, rq, cdrom_write_intr);
1637}
1638
1639static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq)
1640{
1641 struct cdrom_info *info = drive->driver_data;
1642 struct gendisk *g = info->disk;
1643 unsigned short sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS;
1644
1645 /*
1646 * writes *must* be hardware frame aligned
1647 */
1648 if ((rq->nr_sectors & (sectors_per_frame - 1)) ||
1649 (rq->sector & (sectors_per_frame - 1))) {
1650 cdrom_end_request(drive, 0);
1651 return ide_stopped;
1652 }
1653
1654 /*
1655 * disk has become write protected
1656 */
1657 if (g->policy) {
1658 cdrom_end_request(drive, 0);
1659 return ide_stopped;
1660 }
1661
1da177e4
LT
1662 info->nsectors_buffered = 0;
1663
1664 /* use dma, if possible. we don't need to check more, since we
1665 * know that the transfer is always (at least!) frame aligned */
1666 info->dma = drive->using_dma ? 1 : 0;
1da177e4
LT
1667
1668 info->devinfo.media_written = 1;
1669
1670 /* Start sending the write request to the drive. */
1671 return cdrom_start_packet_command(drive, 32768, cdrom_start_write_cont);
1672}
1673
1674static ide_startstop_t cdrom_do_newpc_cont(ide_drive_t *drive)
1675{
1676 struct request *rq = HWGROUP(drive)->rq;
1677
1678 if (!rq->timeout)
1679 rq->timeout = ATAPI_WAIT_PC;
1680
1681 return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr);
1682}
1683
1684static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
1685{
1686 struct cdrom_info *info = drive->driver_data;
1687
4aff5e23 1688 rq->cmd_flags |= REQ_QUIET;
1da177e4
LT
1689
1690 info->dma = 0;
1da177e4
LT
1691
1692 /*
1693 * sg request
1694 */
1695 if (rq->bio) {
1696 int mask = drive->queue->dma_alignment;
1697 unsigned long addr = (unsigned long) page_address(bio_page(rq->bio));
1698
1da177e4
LT
1699 info->dma = drive->using_dma;
1700
1701 /*
1702 * check if dma is safe
5d9e4ea5
LT
1703 *
1704 * NOTE! The "len" and "addr" checks should possibly have
1705 * separate masks.
1da177e4 1706 */
4e7c6816 1707 if ((rq->data_len & 15) || (addr & mask))
1da177e4
LT
1708 info->dma = 0;
1709 }
1710
1711 /* Start sending the command to the drive. */
1712 return cdrom_start_packet_command(drive, rq->data_len, cdrom_do_newpc_cont);
1713}
1714
1715/****************************************************************************
1716 * cdrom driver request routine.
1717 */
1718static ide_startstop_t
1719ide_do_rw_cdrom (ide_drive_t *drive, struct request *rq, sector_t block)
1720{
1721 ide_startstop_t action;
1722 struct cdrom_info *info = drive->driver_data;
1723
1724 if (blk_fs_request(rq)) {
2bc4cf2d 1725 if (info->cd_flags & IDE_CD_FLAG_SEEKING) {
1da177e4
LT
1726 unsigned long elapsed = jiffies - info->start_seek;
1727 int stat = HWIF(drive)->INB(IDE_STATUS_REG);
1728
1729 if ((stat & SEEK_STAT) != SEEK_STAT) {
1730 if (elapsed < IDECD_SEEK_TIMEOUT) {
1731 ide_stall_queue(drive, IDECD_SEEK_TIMER);
1732 return ide_stopped;
1733 }
1734 printk (KERN_ERR "%s: DSC timeout\n", drive->name);
1735 }
2bc4cf2d 1736 info->cd_flags &= ~IDE_CD_FLAG_SEEKING;
1da177e4
LT
1737 }
1738 if ((rq_data_dir(rq) == READ) && IDE_LARGE_SEEK(info->last_block, block, IDECD_SEEK_THRESHOLD) && drive->dsc_overlap) {
1739 action = cdrom_start_seek(drive, block);
1740 } else {
1741 if (rq_data_dir(rq) == READ)
1742 action = cdrom_start_read(drive, block);
1743 else
1744 action = cdrom_start_write(drive, rq);
1745 }
1746 info->last_block = block;
1747 return action;
cea2885a
JA
1748 } else if (rq->cmd_type == REQ_TYPE_SENSE ||
1749 rq->cmd_type == REQ_TYPE_ATA_PC) {
1da177e4 1750 return cdrom_do_packet_command(drive);
4aff5e23 1751 } else if (blk_pc_request(rq)) {
1da177e4 1752 return cdrom_do_block_pc(drive, rq);
4aff5e23 1753 } else if (blk_special_request(rq)) {
1da177e4
LT
1754 /*
1755 * right now this can only be a reset...
1756 */
1757 cdrom_end_request(drive, 1);
1758 return ide_stopped;
1759 }
1760
1761 blk_dump_rq_flags(rq, "ide-cd bad flags");
1762 cdrom_end_request(drive, 0);
1763 return ide_stopped;
1764}
1765
1766
1767
1768/****************************************************************************
1769 * Ioctl handling.
1770 *
1771 * Routines which queue packet commands take as a final argument a pointer
1772 * to a request_sense struct. If execution of the command results
1773 * in an error with a CHECK CONDITION status, this structure will be filled
1774 * with the results of the subsequent request sense command. The pointer
1775 * can also be NULL, in which case no sense information is returned.
1776 */
1777
1778#if ! STANDARD_ATAPI
1779static inline
1780int bin2bcd (int x)
1781{
1782 return (x%10) | ((x/10) << 4);
1783}
1784
1785
1786static inline
1787int bcd2bin (int x)
1788{
1789 return (x >> 4) * 10 + (x & 0x0f);
1790}
1791
1792static
1793void msf_from_bcd (struct atapi_msf *msf)
1794{
1795 msf->minute = bcd2bin (msf->minute);
1796 msf->second = bcd2bin (msf->second);
1797 msf->frame = bcd2bin (msf->frame);
1798}
1799
1800#endif /* not STANDARD_ATAPI */
1801
1802
1803static inline
1804void lba_to_msf (int lba, byte *m, byte *s, byte *f)
1805{
1806 lba += CD_MSF_OFFSET;
1807 lba &= 0xffffff; /* negative lbas use only 24 bits */
1808 *m = lba / (CD_SECS * CD_FRAMES);
1809 lba %= (CD_SECS * CD_FRAMES);
1810 *s = lba / CD_FRAMES;
1811 *f = lba % CD_FRAMES;
1812}
1813
1814
1815static inline
1816int msf_to_lba (byte m, byte s, byte f)
1817{
1818 return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
1819}
1820
1821static int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense)
1822{
1823 struct request req;
1824 struct cdrom_info *info = drive->driver_data;
1825 struct cdrom_device_info *cdi = &info->devinfo;
1826
1827 cdrom_prepare_request(drive, &req);
1828
1829 req.sense = sense;
1830 req.cmd[0] = GPCMD_TEST_UNIT_READY;
4aff5e23 1831 req.cmd_flags |= REQ_QUIET;
1da177e4
LT
1832
1833#if ! STANDARD_ATAPI
1834 /* the Sanyo 3 CD changer uses byte 7 of TEST_UNIT_READY to
1835 switch CDs instead of supporting the LOAD_UNLOAD opcode */
1836
1837 req.cmd[7] = cdi->sanyo_slot % 3;
1838#endif /* not STANDARD_ATAPI */
1839
1840 return cdrom_queue_packet_command(drive, &req);
1841}
1842
1843
1844/* Lock the door if LOCKFLAG is nonzero; unlock it otherwise. */
1845static int
1846cdrom_lockdoor(ide_drive_t *drive, int lockflag, struct request_sense *sense)
1847{
4fe67178 1848 struct cdrom_info *cd = drive->driver_data;
1da177e4
LT
1849 struct request_sense my_sense;
1850 struct request req;
1851 int stat;
1852
1853 if (sense == NULL)
1854 sense = &my_sense;
1855
1856 /* If the drive cannot lock the door, just pretend. */
2bc4cf2d 1857 if (cd->cd_flags & IDE_CD_FLAG_NO_DOORLOCK) {
1da177e4
LT
1858 stat = 0;
1859 } else {
1860 cdrom_prepare_request(drive, &req);
1861 req.sense = sense;
1862 req.cmd[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
1863 req.cmd[4] = lockflag ? 1 : 0;
1864 stat = cdrom_queue_packet_command(drive, &req);
1865 }
1866
1867 /* If we got an illegal field error, the drive
1868 probably cannot lock the door. */
1869 if (stat != 0 &&
1870 sense->sense_key == ILLEGAL_REQUEST &&
1871 (sense->asc == 0x24 || sense->asc == 0x20)) {
1872 printk (KERN_ERR "%s: door locking not supported\n",
1873 drive->name);
2bc4cf2d 1874 cd->cd_flags |= IDE_CD_FLAG_NO_DOORLOCK;
1da177e4
LT
1875 stat = 0;
1876 }
1877
1878 /* no medium, that's alright. */
1879 if (stat != 0 && sense->sense_key == NOT_READY && sense->asc == 0x3a)
1880 stat = 0;
1881
2bc4cf2d
BZ
1882 if (stat == 0) {
1883 if (lockflag)
1884 cd->cd_flags |= IDE_CD_FLAG_DOOR_LOCKED;
1885 else
1886 cd->cd_flags &= ~IDE_CD_FLAG_DOOR_LOCKED;
1887 }
1da177e4
LT
1888
1889 return stat;
1890}
1891
1892
1893/* Eject the disk if EJECTFLAG is 0.
1894 If EJECTFLAG is 1, try to reload the disk. */
1895static int cdrom_eject(ide_drive_t *drive, int ejectflag,
1896 struct request_sense *sense)
1897{
3f1b86d8
BZ
1898 struct cdrom_info *cd = drive->driver_data;
1899 struct cdrom_device_info *cdi = &cd->devinfo;
1da177e4
LT
1900 struct request req;
1901 char loej = 0x02;
1902
2bc4cf2d 1903 if ((cd->cd_flags & IDE_CD_FLAG_NO_EJECT) && !ejectflag)
1da177e4 1904 return -EDRIVE_CANT_DO_THIS;
4fe67178 1905
1da177e4 1906 /* reload fails on some drives, if the tray is locked */
2bc4cf2d 1907 if ((cd->cd_flags & IDE_CD_FLAG_DOOR_LOCKED) && ejectflag)
1da177e4
LT
1908 return 0;
1909
1910 cdrom_prepare_request(drive, &req);
1911
1912 /* only tell drive to close tray if open, if it can do that */
3f1b86d8 1913 if (ejectflag && (cdi->mask & CDC_CLOSE_TRAY))
1da177e4
LT
1914 loej = 0;
1915
1916 req.sense = sense;
1917 req.cmd[0] = GPCMD_START_STOP_UNIT;
1918 req.cmd[4] = loej | (ejectflag != 0);
1919 return cdrom_queue_packet_command(drive, &req);
1920}
1921
1922static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity,
1923 unsigned long *sectors_per_frame,
1924 struct request_sense *sense)
1925{
1926 struct {
1927 __u32 lba;
1928 __u32 blocklen;
1929 } capbuf;
1930
1931 int stat;
1932 struct request req;
1933
1934 cdrom_prepare_request(drive, &req);
1935
1936 req.sense = sense;
1937 req.cmd[0] = GPCMD_READ_CDVD_CAPACITY;
1938 req.data = (char *)&capbuf;
1939 req.data_len = sizeof(capbuf);
4aff5e23 1940 req.cmd_flags |= REQ_QUIET;
1da177e4
LT
1941
1942 stat = cdrom_queue_packet_command(drive, &req);
1943 if (stat == 0) {
1944 *capacity = 1 + be32_to_cpu(capbuf.lba);
1945 *sectors_per_frame =
1946 be32_to_cpu(capbuf.blocklen) >> SECTOR_BITS;
1947 }
1948
1949 return stat;
1950}
1951
1952static int cdrom_read_tocentry(ide_drive_t *drive, int trackno, int msf_flag,
1953 int format, char *buf, int buflen,
1954 struct request_sense *sense)
1955{
1956 struct request req;
1957
1958 cdrom_prepare_request(drive, &req);
1959
1960 req.sense = sense;
1961 req.data = buf;
1962 req.data_len = buflen;
4aff5e23 1963 req.cmd_flags |= REQ_QUIET;
1da177e4
LT
1964 req.cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
1965 req.cmd[6] = trackno;
1966 req.cmd[7] = (buflen >> 8);
1967 req.cmd[8] = (buflen & 0xff);
1968 req.cmd[9] = (format << 6);
1969
1970 if (msf_flag)
1971 req.cmd[1] = 2;
1972
1973 return cdrom_queue_packet_command(drive, &req);
1974}
1975
1976
1977/* Try to read the entire TOC for the disk into our internal buffer. */
1978static int cdrom_read_toc(ide_drive_t *drive, struct request_sense *sense)
1979{
1980 int stat, ntracks, i;
1981 struct cdrom_info *info = drive->driver_data;
1982 struct cdrom_device_info *cdi = &info->devinfo;
1983 struct atapi_toc *toc = info->toc;
1984 struct {
1985 struct atapi_toc_header hdr;
1986 struct atapi_toc_entry ent;
1987 } ms_tmp;
1988 long last_written;
1989 unsigned long sectors_per_frame = SECTORS_PER_FRAME;
1990
1991 if (toc == NULL) {
1992 /* Try to allocate space. */
2a91f3e5 1993 toc = kmalloc(sizeof(struct atapi_toc), GFP_KERNEL);
1da177e4
LT
1994 if (toc == NULL) {
1995 printk (KERN_ERR "%s: No cdrom TOC buffer!\n", drive->name);
1996 return -ENOMEM;
1997 }
2a91f3e5 1998 info->toc = toc;
1da177e4
LT
1999 }
2000
2001 /* Check to see if the existing data is still valid.
2002 If it is, just return. */
2003 (void) cdrom_check_status(drive, sense);
2004
2bc4cf2d 2005 if (info->cd_flags & IDE_CD_FLAG_TOC_VALID)
1da177e4
LT
2006 return 0;
2007
2008 /* Try to get the total cdrom capacity and sector size. */
2009 stat = cdrom_read_capacity(drive, &toc->capacity, &sectors_per_frame,
2010 sense);
2011 if (stat)
2012 toc->capacity = 0x1fffff;
2013
2014 set_capacity(info->disk, toc->capacity * sectors_per_frame);
dbe217af
AC
2015 /* Save a private copy of te TOC capacity for error handling */
2016 drive->probed_capacity = toc->capacity * sectors_per_frame;
2017
1da177e4
LT
2018 blk_queue_hardsect_size(drive->queue,
2019 sectors_per_frame << SECTOR_BITS);
2020
2021 /* First read just the header, so we know how long the TOC is. */
2022 stat = cdrom_read_tocentry(drive, 0, 1, 0, (char *) &toc->hdr,
2023 sizeof(struct atapi_toc_header), sense);
2a91f3e5
JJ
2024 if (stat)
2025 return stat;
1da177e4
LT
2026
2027#if ! STANDARD_ATAPI
2bc4cf2d 2028 if (info->cd_flags & IDE_CD_FLAG_TOCTRACKS_AS_BCD) {
1da177e4
LT
2029 toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
2030 toc->hdr.last_track = bcd2bin(toc->hdr.last_track);
2031 }
2032#endif /* not STANDARD_ATAPI */
2033
2034 ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
2035 if (ntracks <= 0)
2036 return -EIO;
2037 if (ntracks > MAX_TRACKS)
2038 ntracks = MAX_TRACKS;
2039
2040 /* Now read the whole schmeer. */
2041 stat = cdrom_read_tocentry(drive, toc->hdr.first_track, 1, 0,
2042 (char *)&toc->hdr,
2043 sizeof(struct atapi_toc_header) +
2044 (ntracks + 1) *
2045 sizeof(struct atapi_toc_entry), sense);
2046
2047 if (stat && toc->hdr.first_track > 1) {
2048 /* Cds with CDI tracks only don't have any TOC entries,
2049 despite of this the returned values are
2050 first_track == last_track = number of CDI tracks + 1,
2051 so that this case is indistinguishable from the same
2052 layout plus an additional audio track.
2053 If we get an error for the regular case, we assume
2054 a CDI without additional audio tracks. In this case
2055 the readable TOC is empty (CDI tracks are not included)
96de0e25 2056 and only holds the Leadout entry. Heiko Eißfeldt */
1da177e4
LT
2057 ntracks = 0;
2058 stat = cdrom_read_tocentry(drive, CDROM_LEADOUT, 1, 0,
2059 (char *)&toc->hdr,
2060 sizeof(struct atapi_toc_header) +
2061 (ntracks + 1) *
2062 sizeof(struct atapi_toc_entry),
2063 sense);
2064 if (stat) {
2065 return stat;
2066 }
2067#if ! STANDARD_ATAPI
2bc4cf2d 2068 if (info->cd_flags & IDE_CD_FLAG_TOCTRACKS_AS_BCD) {
1da177e4
LT
2069 toc->hdr.first_track = bin2bcd(CDROM_LEADOUT);
2070 toc->hdr.last_track = bin2bcd(CDROM_LEADOUT);
2071 } else
2072#endif /* not STANDARD_ATAPI */
2073 {
2074 toc->hdr.first_track = CDROM_LEADOUT;
2075 toc->hdr.last_track = CDROM_LEADOUT;
2076 }
2077 }
2078
2079 if (stat)
2080 return stat;
2081
2082 toc->hdr.toc_length = ntohs (toc->hdr.toc_length);
2083
2084#if ! STANDARD_ATAPI
2bc4cf2d 2085 if (info->cd_flags & IDE_CD_FLAG_TOCTRACKS_AS_BCD) {
1da177e4
LT
2086 toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
2087 toc->hdr.last_track = bcd2bin(toc->hdr.last_track);
2088 }
2089#endif /* not STANDARD_ATAPI */
2090
2091 for (i=0; i<=ntracks; i++) {
2092#if ! STANDARD_ATAPI
2bc4cf2d
BZ
2093 if (info->cd_flags & IDE_CD_FLAG_TOCADDR_AS_BCD) {
2094 if (info->cd_flags & IDE_CD_FLAG_TOCTRACKS_AS_BCD)
1da177e4
LT
2095 toc->ent[i].track = bcd2bin(toc->ent[i].track);
2096 msf_from_bcd(&toc->ent[i].addr.msf);
2097 }
2098#endif /* not STANDARD_ATAPI */
2099 toc->ent[i].addr.lba = msf_to_lba (toc->ent[i].addr.msf.minute,
2100 toc->ent[i].addr.msf.second,
2101 toc->ent[i].addr.msf.frame);
2102 }
2103
2104 /* Read the multisession information. */
2105 if (toc->hdr.first_track != CDROM_LEADOUT) {
2106 /* Read the multisession information. */
2107 stat = cdrom_read_tocentry(drive, 0, 0, 1, (char *)&ms_tmp,
2108 sizeof(ms_tmp), sense);
2a91f3e5
JJ
2109 if (stat)
2110 return stat;
1da177e4
LT
2111
2112 toc->last_session_lba = be32_to_cpu(ms_tmp.ent.addr.lba);
2113 } else {
2114 ms_tmp.hdr.first_track = ms_tmp.hdr.last_track = CDROM_LEADOUT;
2115 toc->last_session_lba = msf_to_lba(0, 2, 0); /* 0m 2s 0f */
2116 }
2117
2118#if ! STANDARD_ATAPI
2bc4cf2d 2119 if (info->cd_flags & IDE_CD_FLAG_TOCADDR_AS_BCD) {
1da177e4
LT
2120 /* Re-read multisession information using MSF format */
2121 stat = cdrom_read_tocentry(drive, 0, 1, 1, (char *)&ms_tmp,
2122 sizeof(ms_tmp), sense);
2123 if (stat)
2124 return stat;
2125
2126 msf_from_bcd (&ms_tmp.ent.addr.msf);
2127 toc->last_session_lba = msf_to_lba(ms_tmp.ent.addr.msf.minute,
2128 ms_tmp.ent.addr.msf.second,
2129 ms_tmp.ent.addr.msf.frame);
2130 }
2131#endif /* not STANDARD_ATAPI */
2132
2133 toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track);
2134
2135 /* Now try to get the total cdrom capacity. */
2136 stat = cdrom_get_last_written(cdi, &last_written);
2137 if (!stat && (last_written > toc->capacity)) {
2138 toc->capacity = last_written;
2139 set_capacity(info->disk, toc->capacity * sectors_per_frame);
dbe217af 2140 drive->probed_capacity = toc->capacity * sectors_per_frame;
1da177e4
LT
2141 }
2142
2143 /* Remember that we've read this stuff. */
2bc4cf2d 2144 info->cd_flags |= IDE_CD_FLAG_TOC_VALID;
1da177e4
LT
2145
2146 return 0;
2147}
2148
2149
2150static int cdrom_read_subchannel(ide_drive_t *drive, int format, char *buf,
2151 int buflen, struct request_sense *sense)
2152{
2153 struct request req;
2154
2155 cdrom_prepare_request(drive, &req);
2156
2157 req.sense = sense;
2158 req.data = buf;
2159 req.data_len = buflen;
2160 req.cmd[0] = GPCMD_READ_SUBCHANNEL;
2161 req.cmd[1] = 2; /* MSF addressing */
2162 req.cmd[2] = 0x40; /* request subQ data */
2163 req.cmd[3] = format;
2164 req.cmd[7] = (buflen >> 8);
2165 req.cmd[8] = (buflen & 0xff);
2166 return cdrom_queue_packet_command(drive, &req);
2167}
2168
2169/* ATAPI cdrom drives are free to select the speed you request or any slower
2170 rate :-( Requesting too fast a speed will _not_ produce an error. */
2171static int cdrom_select_speed(ide_drive_t *drive, int speed,
2172 struct request_sense *sense)
2173{
3f1b86d8
BZ
2174 struct cdrom_info *cd = drive->driver_data;
2175 struct cdrom_device_info *cdi = &cd->devinfo;
1da177e4
LT
2176 struct request req;
2177 cdrom_prepare_request(drive, &req);
2178
2179 req.sense = sense;
2180 if (speed == 0)
2181 speed = 0xffff; /* set to max */
2182 else
2183 speed *= 177; /* Nx to kbytes/s */
2184
2185 req.cmd[0] = GPCMD_SET_SPEED;
2186 /* Read Drive speed in kbytes/second MSB */
2187 req.cmd[2] = (speed >> 8) & 0xff;
2188 /* Read Drive speed in kbytes/second LSB */
2189 req.cmd[3] = speed & 0xff;
3f1b86d8
BZ
2190 if ((cdi->mask & (CDC_CD_R | CDC_CD_RW | CDC_DVD_R)) !=
2191 (CDC_CD_R | CDC_CD_RW | CDC_DVD_R)) {
1da177e4
LT
2192 /* Write Drive speed in kbytes/second MSB */
2193 req.cmd[4] = (speed >> 8) & 0xff;
2194 /* Write Drive speed in kbytes/second LSB */
2195 req.cmd[5] = speed & 0xff;
2196 }
2197
2198 return cdrom_queue_packet_command(drive, &req);
2199}
2200
2201static int cdrom_play_audio(ide_drive_t *drive, int lba_start, int lba_end)
2202{
2203 struct request_sense sense;
2204 struct request req;
2205
2206 cdrom_prepare_request(drive, &req);
2207
2208 req.sense = &sense;
2209 req.cmd[0] = GPCMD_PLAY_AUDIO_MSF;
2210 lba_to_msf(lba_start, &req.cmd[3], &req.cmd[4], &req.cmd[5]);
2211 lba_to_msf(lba_end-1, &req.cmd[6], &req.cmd[7], &req.cmd[8]);
2212
2213 return cdrom_queue_packet_command(drive, &req);
2214}
2215
2216static int cdrom_get_toc_entry(ide_drive_t *drive, int track,
2217 struct atapi_toc_entry **ent)
2218{
2219 struct cdrom_info *info = drive->driver_data;
2220 struct atapi_toc *toc = info->toc;
2221 int ntracks;
2222
2223 /*
2224 * don't serve cached data, if the toc isn't valid
2225 */
2bc4cf2d 2226 if ((info->cd_flags & IDE_CD_FLAG_TOC_VALID) == 0)
1da177e4
LT
2227 return -EINVAL;
2228
2229 /* Check validity of requested track number. */
2230 ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
2231 if (toc->hdr.first_track == CDROM_LEADOUT) ntracks = 0;
2232 if (track == CDROM_LEADOUT)
2233 *ent = &toc->ent[ntracks];
2234 else if (track < toc->hdr.first_track ||
2235 track > toc->hdr.last_track)
2236 return -EINVAL;
2237 else
2238 *ent = &toc->ent[track - toc->hdr.first_track];
2239
2240 return 0;
2241}
2242
2243/* the generic packet interface to cdrom.c */
2244static int ide_cdrom_packet(struct cdrom_device_info *cdi,
2245 struct packet_command *cgc)
2246{
2247 struct request req;
2a91f3e5 2248 ide_drive_t *drive = cdi->handle;
1da177e4
LT
2249
2250 if (cgc->timeout <= 0)
2251 cgc->timeout = ATAPI_WAIT_PC;
2252
2253 /* here we queue the commands from the uniform CD-ROM
2254 layer. the packet must be complete, as we do not
2255 touch it at all. */
2256 cdrom_prepare_request(drive, &req);
2257 memcpy(req.cmd, cgc->cmd, CDROM_PACKET_SIZE);
2258 if (cgc->sense)
2259 memset(cgc->sense, 0, sizeof(struct request_sense));
2260 req.data = cgc->buffer;
2261 req.data_len = cgc->buflen;
2262 req.timeout = cgc->timeout;
2263
2264 if (cgc->quiet)
4aff5e23 2265 req.cmd_flags |= REQ_QUIET;
1da177e4
LT
2266
2267 req.sense = cgc->sense;
2268 cgc->stat = cdrom_queue_packet_command(drive, &req);
2269 if (!cgc->stat)
2270 cgc->buflen -= req.data_len;
2271 return cgc->stat;
2272}
2273
1da177e4
LT
2274static
2275int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi,
2276 unsigned int cmd, void *arg)
2277
2278{
2a91f3e5 2279 ide_drive_t *drive = cdi->handle;
1da177e4
LT
2280 struct cdrom_info *info = drive->driver_data;
2281 int stat;
2282
2283 switch (cmd) {
2284 /*
2285 * emulate PLAY_AUDIO_TI command with PLAY_AUDIO_10, since
2286 * atapi doesn't support it
2287 */
2288 case CDROMPLAYTRKIND: {
2289 unsigned long lba_start, lba_end;
2a91f3e5 2290 struct cdrom_ti *ti = arg;
1da177e4
LT
2291 struct atapi_toc_entry *first_toc, *last_toc;
2292
2293 stat = cdrom_get_toc_entry(drive, ti->cdti_trk0, &first_toc);
2294 if (stat)
2295 return stat;
2296
2297 stat = cdrom_get_toc_entry(drive, ti->cdti_trk1, &last_toc);
2298 if (stat)
2299 return stat;
2300
2301 if (ti->cdti_trk1 != CDROM_LEADOUT)
2302 ++last_toc;
2303 lba_start = first_toc->addr.lba;
2304 lba_end = last_toc->addr.lba;
2305
2306 if (lba_end <= lba_start)
2307 return -EINVAL;
2308
2309 return cdrom_play_audio(drive, lba_start, lba_end);
2310 }
2311
2312 case CDROMREADTOCHDR: {
2a91f3e5 2313 struct cdrom_tochdr *tochdr = arg;
1da177e4
LT
2314 struct atapi_toc *toc;
2315
2316 /* Make sure our saved TOC is valid. */
2317 stat = cdrom_read_toc(drive, NULL);
2a91f3e5
JJ
2318 if (stat)
2319 return stat;
1da177e4
LT
2320
2321 toc = info->toc;
2322 tochdr->cdth_trk0 = toc->hdr.first_track;
2323 tochdr->cdth_trk1 = toc->hdr.last_track;
2324
2325 return 0;
2326 }
2327
2328 case CDROMREADTOCENTRY: {
2a91f3e5 2329 struct cdrom_tocentry *tocentry = arg;
1da177e4
LT
2330 struct atapi_toc_entry *toce;
2331
2332 stat = cdrom_get_toc_entry(drive, tocentry->cdte_track, &toce);
2a91f3e5
JJ
2333 if (stat)
2334 return stat;
1da177e4
LT
2335
2336 tocentry->cdte_ctrl = toce->control;
2337 tocentry->cdte_adr = toce->adr;
2338 if (tocentry->cdte_format == CDROM_MSF) {
2339 lba_to_msf (toce->addr.lba,
2340 &tocentry->cdte_addr.msf.minute,
2341 &tocentry->cdte_addr.msf.second,
2342 &tocentry->cdte_addr.msf.frame);
2343 } else
2344 tocentry->cdte_addr.lba = toce->addr.lba;
2345
2346 return 0;
2347 }
2348
2349 default:
2350 return -EINVAL;
2351 }
2352}
2353
2354static
2355int ide_cdrom_reset (struct cdrom_device_info *cdi)
2356{
2a91f3e5 2357 ide_drive_t *drive = cdi->handle;
0ba11211 2358 struct cdrom_info *cd = drive->driver_data;
1da177e4
LT
2359 struct request_sense sense;
2360 struct request req;
2361 int ret;
2362
2363 cdrom_prepare_request(drive, &req);
4aff5e23
JA
2364 req.cmd_type = REQ_TYPE_SPECIAL;
2365 req.cmd_flags = REQ_QUIET;
1da177e4
LT
2366 ret = ide_do_drive_cmd(drive, &req, ide_wait);
2367
2368 /*
2369 * A reset will unlock the door. If it was previously locked,
2370 * lock it again.
2371 */
2bc4cf2d 2372 if (cd->cd_flags & IDE_CD_FLAG_DOOR_LOCKED)
1da177e4
LT
2373 (void) cdrom_lockdoor(drive, 1, &sense);
2374
2375 return ret;
2376}
2377
2378
2379static
2380int ide_cdrom_tray_move (struct cdrom_device_info *cdi, int position)
2381{
2a91f3e5 2382 ide_drive_t *drive = cdi->handle;
1da177e4
LT
2383 struct request_sense sense;
2384
2385 if (position) {
2386 int stat = cdrom_lockdoor(drive, 0, &sense);
2a91f3e5
JJ
2387 if (stat)
2388 return stat;
1da177e4
LT
2389 }
2390
2391 return cdrom_eject(drive, !position, &sense);
2392}
2393
2394static
2395int ide_cdrom_lock_door (struct cdrom_device_info *cdi, int lock)
2396{
2a91f3e5 2397 ide_drive_t *drive = cdi->handle;
1da177e4
LT
2398 return cdrom_lockdoor(drive, lock, NULL);
2399}
2400
455d80a9 2401static int ide_cdrom_get_capabilities(ide_drive_t *drive, u8 *buf)
9235e68b
EP
2402{
2403 struct cdrom_info *info = drive->driver_data;
2404 struct cdrom_device_info *cdi = &info->devinfo;
2405 struct packet_command cgc;
455d80a9 2406 int stat, attempts = 3, size = ATAPI_CAPABILITIES_PAGE_SIZE;
9235e68b
EP
2407
2408 /*
2409 * ACER50 (and others?) require the full spec length mode sense
2410 * page capabilities size, but older drives break.
2411 */
2412 if (!(!strcmp(drive->id->model, "ATAPI CD ROM DRIVE 50X MAX") ||
2413 !strcmp(drive->id->model, "WPI CDS-32X")))
455d80a9 2414 size -= ATAPI_CAPABILITIES_PAGE_PAD_SIZE;
9235e68b 2415
455d80a9 2416 init_cdrom_command(&cgc, buf, size, CGC_DATA_UNKNOWN);
9235e68b
EP
2417 do { /* we seem to get stat=0x01,err=0x00 the first time (??) */
2418 stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
2419 if (!stat)
2420 break;
2421 } while (--attempts);
2422 return stat;
2423}
2424
455d80a9 2425static void ide_cdrom_update_speed(ide_drive_t *drive, u8 *buf)
9235e68b 2426{
4fe67178 2427 struct cdrom_info *cd = drive->driver_data;
481c8c64
BZ
2428 u16 curspeed, maxspeed;
2429
455d80a9
BZ
2430 curspeed = *(u16 *)&buf[8 + 14];
2431 maxspeed = *(u16 *)&buf[8 + 8];
2432
9235e68b
EP
2433 /* The ACER/AOpen 24X cdrom has the speed fields byte-swapped */
2434 if (!drive->id->model[0] &&
2435 !strncmp(drive->id->fw_rev, "241N", 4)) {
455d80a9
BZ
2436 curspeed = le16_to_cpu(curspeed);
2437 maxspeed = le16_to_cpu(maxspeed);
9235e68b 2438 } else {
455d80a9
BZ
2439 curspeed = be16_to_cpu(curspeed);
2440 maxspeed = be16_to_cpu(maxspeed);
9235e68b 2441 }
481c8c64 2442
2bc4cf2d
BZ
2443 cd->current_speed = (curspeed + (176/2)) / 176;
2444 cd->max_speed = (maxspeed + (176/2)) / 176;
9235e68b
EP
2445}
2446
1da177e4
LT
2447static
2448int ide_cdrom_select_speed (struct cdrom_device_info *cdi, int speed)
2449{
2a91f3e5 2450 ide_drive_t *drive = cdi->handle;
0ba11211 2451 struct cdrom_info *cd = drive->driver_data;
1da177e4 2452 struct request_sense sense;
455d80a9 2453 u8 buf[ATAPI_CAPABILITIES_PAGE_SIZE];
1da177e4
LT
2454 int stat;
2455
2456 if ((stat = cdrom_select_speed(drive, speed, &sense)) < 0)
2457 return stat;
2458
455d80a9
BZ
2459 if (!ide_cdrom_get_capabilities(drive, buf)) {
2460 ide_cdrom_update_speed(drive, buf);
2bc4cf2d 2461 cdi->speed = cd->current_speed;
9235e68b 2462 }
1da177e4
LT
2463 return 0;
2464}
2465
2466/*
2467 * add logic to try GET_EVENT command first to check for media and tray
2468 * status. this should be supported by newer cd-r/w and all DVD etc
2469 * drives
2470 */
2471static
2472int ide_cdrom_drive_status (struct cdrom_device_info *cdi, int slot_nr)
2473{
2a91f3e5 2474 ide_drive_t *drive = cdi->handle;
1da177e4
LT
2475 struct media_event_desc med;
2476 struct request_sense sense;
2477 int stat;
2478
2479 if (slot_nr != CDSL_CURRENT)
2480 return -EINVAL;
2481
2482 stat = cdrom_check_status(drive, &sense);
2483 if (!stat || sense.sense_key == UNIT_ATTENTION)
2484 return CDS_DISC_OK;
2485
2486 if (!cdrom_get_media_event(cdi, &med)) {
2487 if (med.media_present)
2488 return CDS_DISC_OK;
2489 else if (med.door_open)
2490 return CDS_TRAY_OPEN;
2491 else
2492 return CDS_NO_DISC;
2493 }
2494
2495 if (sense.sense_key == NOT_READY && sense.asc == 0x04 && sense.ascq == 0x04)
2496 return CDS_DISC_OK;
2497
2498 /*
2499 * If not using Mt Fuji extended media tray reports,
2500 * just return TRAY_OPEN since ATAPI doesn't provide
2501 * any other way to detect this...
2502 */
2503 if (sense.sense_key == NOT_READY) {
dbe217af
AC
2504 if (sense.asc == 0x3a && sense.ascq == 1)
2505 return CDS_NO_DISC;
2506 else
2507 return CDS_TRAY_OPEN;
1da177e4 2508 }
1da177e4
LT
2509 return CDS_DRIVE_NOT_READY;
2510}
2511
2512static
2513int ide_cdrom_get_last_session (struct cdrom_device_info *cdi,
2514 struct cdrom_multisession *ms_info)
2515{
2516 struct atapi_toc *toc;
2a91f3e5 2517 ide_drive_t *drive = cdi->handle;
1da177e4
LT
2518 struct cdrom_info *info = drive->driver_data;
2519 struct request_sense sense;
2520 int ret;
2521
2bc4cf2d 2522 if ((info->cd_flags & IDE_CD_FLAG_TOC_VALID) == 0 || info->toc == NULL)
1da177e4
LT
2523 if ((ret = cdrom_read_toc(drive, &sense)))
2524 return ret;
2525
2526 toc = info->toc;
2527 ms_info->addr.lba = toc->last_session_lba;
2528 ms_info->xa_flag = toc->xa_flag;
2529
2530 return 0;
2531}
2532
2533static
2534int ide_cdrom_get_mcn (struct cdrom_device_info *cdi,
2535 struct cdrom_mcn *mcn_info)
2536{
2537 int stat;
2538 char mcnbuf[24];
2a91f3e5 2539 ide_drive_t *drive = cdi->handle;
1da177e4
LT
2540
2541/* get MCN */
2542 if ((stat = cdrom_read_subchannel(drive, 2, mcnbuf, sizeof (mcnbuf), NULL)))
2543 return stat;
2544
2545 memcpy (mcn_info->medium_catalog_number, mcnbuf+9,
2546 sizeof (mcn_info->medium_catalog_number)-1);
2547 mcn_info->medium_catalog_number[sizeof (mcn_info->medium_catalog_number)-1]
2548 = '\0';
2549
2550 return 0;
2551}
2552
2553
2554
2555/****************************************************************************
2556 * Other driver requests (open, close, check media change).
2557 */
2558
2559static
2560int ide_cdrom_check_media_change_real (struct cdrom_device_info *cdi,
2561 int slot_nr)
2562{
2a91f3e5 2563 ide_drive_t *drive = cdi->handle;
0ba11211 2564 struct cdrom_info *cd = drive->driver_data;
1da177e4 2565 int retval;
0ba11211 2566
1da177e4
LT
2567 if (slot_nr == CDSL_CURRENT) {
2568 (void) cdrom_check_status(drive, NULL);
2bc4cf2d
BZ
2569 retval = (cd->cd_flags & IDE_CD_FLAG_MEDIA_CHANGED) ? 1 : 0;
2570 cd->cd_flags &= ~IDE_CD_FLAG_MEDIA_CHANGED;
1da177e4
LT
2571 return retval;
2572 } else {
2573 return -EINVAL;
2574 }
2575}
2576
2577
2578static
2579int ide_cdrom_open_real (struct cdrom_device_info *cdi, int purpose)
2580{
2581 return 0;
2582}
2583
2584/*
2585 * Close down the device. Invalidate all cached blocks.
2586 */
2587
2588static
2589void ide_cdrom_release_real (struct cdrom_device_info *cdi)
2590{
2591 ide_drive_t *drive = cdi->handle;
0ba11211 2592 struct cdrom_info *cd = drive->driver_data;
1da177e4
LT
2593
2594 if (!cdi->use_count)
2bc4cf2d 2595 cd->cd_flags &= ~IDE_CD_FLAG_TOC_VALID;
1da177e4
LT
2596}
2597
20e7f7ef
BZ
2598#define IDE_CD_CAPABILITIES \
2599 (CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK | CDC_SELECT_SPEED | \
2600 CDC_SELECT_DISC | CDC_MULTI_SESSION | CDC_MCN | CDC_MEDIA_CHANGED | \
2601 CDC_PLAY_AUDIO | CDC_RESET | CDC_DRIVE_STATUS | CDC_CD_R | \
2602 CDC_CD_RW | CDC_DVD | CDC_DVD_R | CDC_DVD_RAM | CDC_GENERIC_PACKET | \
2603 CDC_MO_DRIVE | CDC_MRW | CDC_MRW_W | CDC_RAM)
1da177e4 2604
1da177e4
LT
2605static struct cdrom_device_ops ide_cdrom_dops = {
2606 .open = ide_cdrom_open_real,
2607 .release = ide_cdrom_release_real,
2608 .drive_status = ide_cdrom_drive_status,
2609 .media_changed = ide_cdrom_check_media_change_real,
2610 .tray_move = ide_cdrom_tray_move,
2611 .lock_door = ide_cdrom_lock_door,
2612 .select_speed = ide_cdrom_select_speed,
2613 .get_last_session = ide_cdrom_get_last_session,
2614 .get_mcn = ide_cdrom_get_mcn,
2615 .reset = ide_cdrom_reset,
2616 .audio_ioctl = ide_cdrom_audio_ioctl,
20e7f7ef 2617 .capability = IDE_CD_CAPABILITIES,
1da177e4
LT
2618 .generic_packet = ide_cdrom_packet,
2619};
2620
2621static int ide_cdrom_register (ide_drive_t *drive, int nslots)
2622{
2623 struct cdrom_info *info = drive->driver_data;
2624 struct cdrom_device_info *devinfo = &info->devinfo;
2625
2626 devinfo->ops = &ide_cdrom_dops;
2bc4cf2d 2627 devinfo->speed = info->current_speed;
1da177e4 2628 devinfo->capacity = nslots;
2a91f3e5 2629 devinfo->handle = drive;
1da177e4 2630 strcpy(devinfo->name, drive->name);
1da177e4 2631
2bc4cf2d 2632 if (info->cd_flags & IDE_CD_FLAG_NO_SPEED_SELECT)
3cbd814e
BZ
2633 devinfo->mask |= CDC_SELECT_SPEED;
2634
1da177e4
LT
2635 devinfo->disk = info->disk;
2636 return register_cdrom(devinfo);
2637}
2638
1da177e4
LT
2639static
2640int ide_cdrom_probe_capabilities (ide_drive_t *drive)
2641{
4fe67178
BZ
2642 struct cdrom_info *cd = drive->driver_data;
2643 struct cdrom_device_info *cdi = &cd->devinfo;
455d80a9
BZ
2644 u8 buf[ATAPI_CAPABILITIES_PAGE_SIZE];
2645 mechtype_t mechtype;
1da177e4
LT
2646 int nslots = 1;
2647
3f1b86d8
BZ
2648 cdi->mask = (CDC_CD_R | CDC_CD_RW | CDC_DVD | CDC_DVD_R |
2649 CDC_DVD_RAM | CDC_SELECT_DISC | CDC_PLAY_AUDIO |
2650 CDC_MO_DRIVE | CDC_RAM);
2651
1da177e4 2652 if (drive->media == ide_optical) {
3f1b86d8 2653 cdi->mask &= ~(CDC_MO_DRIVE | CDC_RAM);
1da177e4
LT
2654 printk(KERN_ERR "%s: ATAPI magneto-optical drive\n", drive->name);
2655 return nslots;
2656 }
2657
2bc4cf2d 2658 if ((cd->cd_flags & IDE_CD_FLAG_NEC260) ||
1da177e4 2659 !strcmp(drive->id->model,"STINGRAY 8422 IDE 8X CD-ROM 7-27-95")) {
2bc4cf2d 2660 cd->cd_flags &= ~IDE_CD_FLAG_NO_EJECT;
3f1b86d8 2661 cdi->mask &= ~CDC_PLAY_AUDIO;
1da177e4
LT
2662 return nslots;
2663 }
2664
2665 /*
2666 * we have to cheat a little here. the packet will eventually
2667 * be queued with ide_cdrom_packet(), which extracts the
2668 * drive from cdi->handle. Since this device hasn't been
2669 * registered with the Uniform layer yet, it can't do this.
2670 * Same goes for cdi->ops.
2671 */
2a91f3e5 2672 cdi->handle = drive;
1da177e4
LT
2673 cdi->ops = &ide_cdrom_dops;
2674
455d80a9 2675 if (ide_cdrom_get_capabilities(drive, buf))
1da177e4
LT
2676 return 0;
2677
455d80a9 2678 if ((buf[8 + 6] & 0x01) == 0)
2bc4cf2d 2679 cd->cd_flags |= IDE_CD_FLAG_NO_DOORLOCK;
455d80a9 2680 if (buf[8 + 6] & 0x08)
2bc4cf2d 2681 cd->cd_flags &= ~IDE_CD_FLAG_NO_EJECT;
455d80a9 2682 if (buf[8 + 3] & 0x01)
3f1b86d8 2683 cdi->mask &= ~CDC_CD_R;
455d80a9 2684 if (buf[8 + 3] & 0x02)
3f1b86d8 2685 cdi->mask &= ~(CDC_CD_RW | CDC_RAM);
455d80a9 2686 if (buf[8 + 2] & 0x38)
3f1b86d8 2687 cdi->mask &= ~CDC_DVD;
455d80a9 2688 if (buf[8 + 3] & 0x20)
3f1b86d8 2689 cdi->mask &= ~(CDC_DVD_RAM | CDC_RAM);
455d80a9 2690 if (buf[8 + 3] & 0x10)
3f1b86d8 2691 cdi->mask &= ~CDC_DVD_R;
455d80a9 2692 if (buf[8 + 4] & 0x01)
3f1b86d8 2693 cdi->mask &= ~CDC_PLAY_AUDIO;
455d80a9
BZ
2694
2695 mechtype = buf[8 + 6] >> 5;
2696 if (mechtype == mechtype_caddy || mechtype == mechtype_popup)
3f1b86d8 2697 cdi->mask |= CDC_CLOSE_TRAY;
1da177e4
LT
2698
2699 /* Some drives used by Apple don't advertise audio play
2700 * but they do support reading TOC & audio datas
2701 */
2702 if (strcmp(drive->id->model, "MATSHITADVD-ROM SR-8187") == 0 ||
2703 strcmp(drive->id->model, "MATSHITADVD-ROM SR-8186") == 0 ||
2704 strcmp(drive->id->model, "MATSHITADVD-ROM SR-8176") == 0 ||
2705 strcmp(drive->id->model, "MATSHITADVD-ROM SR-8174") == 0)
3f1b86d8 2706 cdi->mask &= ~CDC_PLAY_AUDIO;
1da177e4
LT
2707
2708#if ! STANDARD_ATAPI
2709 if (cdi->sanyo_slot > 0) {
3f1b86d8 2710 cdi->mask &= ~CDC_SELECT_DISC;
1da177e4
LT
2711 nslots = 3;
2712 }
2713
2714 else
2715#endif /* not STANDARD_ATAPI */
455d80a9
BZ
2716 if (mechtype == mechtype_individual_changer ||
2717 mechtype == mechtype_cartridge_changer) {
2609d06d
BZ
2718 nslots = cdrom_number_of_slots(cdi);
2719 if (nslots > 1)
3f1b86d8 2720 cdi->mask &= ~CDC_SELECT_DISC;
1da177e4
LT
2721 }
2722
455d80a9 2723 ide_cdrom_update_speed(drive, buf);
4fe67178 2724
1da177e4 2725 printk(KERN_INFO "%s: ATAPI", drive->name);
4fe67178
BZ
2726
2727 /* don't print speed if the drive reported 0 */
2bc4cf2d
BZ
2728 if (cd->max_speed)
2729 printk(KERN_CONT " %dX", cd->max_speed);
4fe67178 2730
3f1b86d8 2731 printk(KERN_CONT " %s", (cdi->mask & CDC_DVD) ? "CD-ROM" : "DVD-ROM");
1da177e4 2732
3f1b86d8
BZ
2733 if ((cdi->mask & CDC_DVD_R) == 0 || (cdi->mask & CDC_DVD_RAM) == 0)
2734 printk(KERN_CONT " DVD%s%s",
2735 (cdi->mask & CDC_DVD_R) ? "" : "-R",
2736 (cdi->mask & CDC_DVD_RAM) ? "" : "-RAM");
1da177e4 2737
3f1b86d8
BZ
2738 if ((cdi->mask & CDC_CD_R) == 0 || (cdi->mask & CDC_CD_RW) == 0)
2739 printk(KERN_CONT " CD%s%s",
2740 (cdi->mask & CDC_CD_R) ? "" : "-R",
2741 (cdi->mask & CDC_CD_RW) ? "" : "/RW");
1da177e4 2742
3f1b86d8
BZ
2743 if ((cdi->mask & CDC_SELECT_DISC) == 0)
2744 printk(KERN_CONT " changer w/%d slots", nslots);
2745 else
2746 printk(KERN_CONT " drive");
1da177e4 2747
455d80a9 2748 printk(KERN_CONT ", %dkB Cache\n", be16_to_cpu(*(u16 *)&buf[8 + 12]));
1da177e4
LT
2749
2750 return nslots;
2751}
2752
7662d046 2753#ifdef CONFIG_IDE_PROC_FS
1da177e4
LT
2754static void ide_cdrom_add_settings(ide_drive_t *drive)
2755{
1497943e 2756 ide_add_setting(drive, "dsc_overlap", SETTING_RW, TYPE_BYTE, 0, 1, 1, 1, &drive->dsc_overlap, NULL);
1da177e4 2757}
7662d046
BZ
2758#else
2759static inline void ide_cdrom_add_settings(ide_drive_t *drive) { ; }
2760#endif
1da177e4
LT
2761
2762/*
2763 * standard prep_rq_fn that builds 10 byte cmds
2764 */
165125e1 2765static int ide_cdrom_prep_fs(struct request_queue *q, struct request *rq)
1da177e4
LT
2766{
2767 int hard_sect = queue_hardsect_size(q);
2768 long block = (long)rq->hard_sector / (hard_sect >> 9);
2769 unsigned long blocks = rq->hard_nr_sectors / (hard_sect >> 9);
2770
2771 memset(rq->cmd, 0, sizeof(rq->cmd));
2772
2773 if (rq_data_dir(rq) == READ)
2774 rq->cmd[0] = GPCMD_READ_10;
2775 else
2776 rq->cmd[0] = GPCMD_WRITE_10;
2777
2778 /*
2779 * fill in lba
2780 */
2781 rq->cmd[2] = (block >> 24) & 0xff;
2782 rq->cmd[3] = (block >> 16) & 0xff;
2783 rq->cmd[4] = (block >> 8) & 0xff;
2784 rq->cmd[5] = block & 0xff;
2785
2786 /*
2787 * and transfer length
2788 */
2789 rq->cmd[7] = (blocks >> 8) & 0xff;
2790 rq->cmd[8] = blocks & 0xff;
2791 rq->cmd_len = 10;
2792 return BLKPREP_OK;
2793}
2794
2795/*
2796 * Most of the SCSI commands are supported directly by ATAPI devices.
2797 * This transform handles the few exceptions.
2798 */
2799static int ide_cdrom_prep_pc(struct request *rq)
2800{
2801 u8 *c = rq->cmd;
2802
2803 /*
2804 * Transform 6-byte read/write commands to the 10-byte version
2805 */
2806 if (c[0] == READ_6 || c[0] == WRITE_6) {
2807 c[8] = c[4];
2808 c[5] = c[3];
2809 c[4] = c[2];
2810 c[3] = c[1] & 0x1f;
2811 c[2] = 0;
2812 c[1] &= 0xe0;
2813 c[0] += (READ_10 - READ_6);
2814 rq->cmd_len = 10;
2815 return BLKPREP_OK;
2816 }
2817
2818 /*
2819 * it's silly to pretend we understand 6-byte sense commands, just
2820 * reject with ILLEGAL_REQUEST and the caller should take the
2821 * appropriate action
2822 */
2823 if (c[0] == MODE_SENSE || c[0] == MODE_SELECT) {
2824 rq->errors = ILLEGAL_REQUEST;
2825 return BLKPREP_KILL;
2826 }
2827
2828 return BLKPREP_OK;
2829}
2830
165125e1 2831static int ide_cdrom_prep_fn(struct request_queue *q, struct request *rq)
1da177e4 2832{
4aff5e23 2833 if (blk_fs_request(rq))
1da177e4 2834 return ide_cdrom_prep_fs(q, rq);
4aff5e23 2835 else if (blk_pc_request(rq))
1da177e4
LT
2836 return ide_cdrom_prep_pc(rq);
2837
2838 return 0;
2839}
2840
2841static
2842int ide_cdrom_setup (ide_drive_t *drive)
2843{
4fe67178
BZ
2844 struct cdrom_info *cd = drive->driver_data;
2845 struct cdrom_device_info *cdi = &cd->devinfo;
1da177e4
LT
2846 int nslots;
2847
2848 blk_queue_prep_rq(drive->queue, ide_cdrom_prep_fn);
2849 blk_queue_dma_alignment(drive->queue, 31);
2850 drive->queue->unplug_delay = (1 * HZ) / 1000;
2851 if (!drive->queue->unplug_delay)
2852 drive->queue->unplug_delay = 1;
2853
2854 drive->special.all = 0;
2855
2bc4cf2d 2856 cd->cd_flags |= IDE_CD_FLAG_MEDIA_CHANGED;
1da177e4 2857
b8d25dee 2858 if ((drive->id->config & 0x0060) == 0x20)
2bc4cf2d
BZ
2859 cd->cd_flags |= IDE_CD_FLAG_DRQ_INTERRUPT;
2860 cd->cd_flags |= IDE_CD_FLAG_NO_EJECT;
b8d25dee 2861
1da177e4 2862 /* limit transfer size per interrupt. */
1da177e4 2863 /* a testament to the nice quality of Samsung drives... */
4fe67178
BZ
2864 if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2430") ||
2865 !strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2432"))
2bc4cf2d 2866 cd->cd_flags |= IDE_CD_FLAG_LIMIT_NFRAMES;
1da177e4
LT
2867 /* the 3231 model does not support the SET_CD_SPEED command */
2868 else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-3231"))
2bc4cf2d 2869 cd->cd_flags |= IDE_CD_FLAG_NO_SPEED_SELECT;
1da177e4
LT
2870
2871#if ! STANDARD_ATAPI
1da177e4
LT
2872 if (strcmp (drive->id->model, "V003S0DS") == 0 &&
2873 drive->id->fw_rev[4] == '1' &&
2874 drive->id->fw_rev[6] <= '2') {
2875 /* Vertos 300.
2876 Some versions of this drive like to talk BCD. */
2bc4cf2d
BZ
2877 cd->cd_flags |= (IDE_CD_FLAG_TOCTRACKS_AS_BCD |
2878 IDE_CD_FLAG_TOCADDR_AS_BCD);
1da177e4 2879 }
1da177e4
LT
2880 else if (strcmp (drive->id->model, "V006E0DS") == 0 &&
2881 drive->id->fw_rev[4] == '1' &&
2882 drive->id->fw_rev[6] <= '2') {
2883 /* Vertos 600 ESD. */
2bc4cf2d 2884 cd->cd_flags |= IDE_CD_FLAG_TOCTRACKS_AS_BCD;
1da177e4
LT
2885 }
2886 else if (strcmp(drive->id->model, "NEC CD-ROM DRIVE:260") == 0 &&
2887 strncmp(drive->id->fw_rev, "1.01", 4) == 0) { /* FIXME */
2888 /* Old NEC260 (not R).
2889 This drive was released before the 1.2 version
2890 of the spec. */
2bc4cf2d
BZ
2891 cd->cd_flags |= (IDE_CD_FLAG_TOCADDR_AS_BCD |
2892 IDE_CD_FLAG_NEC260);
1da177e4 2893 }
b8d25dee
BZ
2894 /*
2895 * Sanyo 3 CD changer uses a non-standard command for CD changing
2896 * (by default standard ATAPI support for CD changers is used).
2897 */
1da177e4
LT
2898 else if ((strcmp(drive->id->model, "CD-ROM CDR-C3 G") == 0) ||
2899 (strcmp(drive->id->model, "CD-ROM CDR-C3G") == 0) ||
2900 (strcmp(drive->id->model, "CD-ROM CDR_C36") == 0)) {
2901 /* uses CD in slot 0 when value is set to 3 */
2902 cdi->sanyo_slot = 3;
2903 }
2904#endif /* not STANDARD_ATAPI */
2905
1da177e4
LT
2906 nslots = ide_cdrom_probe_capabilities (drive);
2907
2908 /*
2909 * set correct block size
2910 */
2911 blk_queue_hardsect_size(drive->queue, CD_FRAMESIZE);
2912
2913 if (drive->autotune == IDE_TUNE_DEFAULT ||
2914 drive->autotune == IDE_TUNE_AUTO)
2915 drive->dsc_overlap = (drive->next != drive);
1da177e4
LT
2916
2917 if (ide_cdrom_register(drive, nslots)) {
2918 printk (KERN_ERR "%s: ide_cdrom_setup failed to register device with the cdrom driver.\n", drive->name);
4fe67178 2919 cd->devinfo.handle = NULL;
1da177e4
LT
2920 return 1;
2921 }
2922 ide_cdrom_add_settings(drive);
2923 return 0;
2924}
2925
ecfd80e4 2926#ifdef CONFIG_IDE_PROC_FS
1da177e4
LT
2927static
2928sector_t ide_cdrom_capacity (ide_drive_t *drive)
2929{
2930 unsigned long capacity, sectors_per_frame;
2931
2932 if (cdrom_read_capacity(drive, &capacity, &sectors_per_frame, NULL))
2933 return 0;
2934
2935 return capacity * sectors_per_frame;
2936}
d97b3214 2937#endif
1da177e4 2938
4031bbe4 2939static void ide_cd_remove(ide_drive_t *drive)
1da177e4
LT
2940{
2941 struct cdrom_info *info = drive->driver_data;
2942
7662d046 2943 ide_proc_unregister_driver(drive, info->driver);
1da177e4
LT
2944
2945 del_gendisk(info->disk);
2946
2947 ide_cd_put(info);
1da177e4
LT
2948}
2949
2950static void ide_cd_release(struct kref *kref)
2951{
2952 struct cdrom_info *info = to_ide_cd(kref);
2953 struct cdrom_device_info *devinfo = &info->devinfo;
2954 ide_drive_t *drive = info->drive;
2955 struct gendisk *g = info->disk;
2956
6044ec88
JJ
2957 kfree(info->buffer);
2958 kfree(info->toc);
1da177e4
LT
2959 if (devinfo->handle == drive && unregister_cdrom(devinfo))
2960 printk(KERN_ERR "%s: %s failed to unregister device from the cdrom "
2961 "driver.\n", __FUNCTION__, drive->name);
2962 drive->dsc_overlap = 0;
2963 drive->driver_data = NULL;
2964 blk_queue_prep_rq(drive->queue, NULL);
2965 g->private_data = NULL;
2966 put_disk(g);
2967 kfree(info);
2968}
2969
4031bbe4 2970static int ide_cd_probe(ide_drive_t *);
1da177e4 2971
ecfd80e4 2972#ifdef CONFIG_IDE_PROC_FS
1da177e4
LT
2973static int proc_idecd_read_capacity
2974 (char *page, char **start, off_t off, int count, int *eof, void *data)
2975{
2a91f3e5 2976 ide_drive_t *drive = data;
1da177e4
LT
2977 int len;
2978
2979 len = sprintf(page,"%llu\n", (long long)ide_cdrom_capacity(drive));
2980 PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
2981}
2982
2983static ide_proc_entry_t idecd_proc[] = {
2984 { "capacity", S_IFREG|S_IRUGO, proc_idecd_read_capacity, NULL },
2985 { NULL, 0, NULL, NULL }
2986};
1da177e4
LT
2987#endif
2988
2989static ide_driver_t ide_cdrom_driver = {
8604affd 2990 .gen_driver = {
4ef3b8f4 2991 .owner = THIS_MODULE,
8604affd
BZ
2992 .name = "ide-cdrom",
2993 .bus = &ide_bus_type,
8604affd 2994 },
4031bbe4
RK
2995 .probe = ide_cd_probe,
2996 .remove = ide_cd_remove,
1da177e4
LT
2997 .version = IDECD_VERSION,
2998 .media = ide_cdrom,
1da177e4 2999 .supports_dsc_overlap = 1,
1da177e4
LT
3000 .do_request = ide_do_rw_cdrom,
3001 .end_request = ide_end_request,
3002 .error = __ide_error,
3003 .abort = __ide_abort,
7662d046 3004#ifdef CONFIG_IDE_PROC_FS
1da177e4 3005 .proc = idecd_proc,
7662d046 3006#endif
1da177e4
LT
3007};
3008
3009static int idecd_open(struct inode * inode, struct file * file)
3010{
3011 struct gendisk *disk = inode->i_bdev->bd_disk;
3012 struct cdrom_info *info;
1da177e4
LT
3013 int rc = -ENOMEM;
3014
3015 if (!(info = ide_cd_get(disk)))
3016 return -ENXIO;
3017
1da177e4 3018 if (!info->buffer)
c94964a4
BZ
3019 info->buffer = kmalloc(SECTOR_BUFFER_SIZE, GFP_KERNEL|__GFP_REPEAT);
3020
3021 if (info->buffer)
3022 rc = cdrom_open(&info->devinfo, inode, file);
1da177e4
LT
3023
3024 if (rc < 0)
3025 ide_cd_put(info);
3026
3027 return rc;
3028}
3029
3030static int idecd_release(struct inode * inode, struct file * file)
3031{
3032 struct gendisk *disk = inode->i_bdev->bd_disk;
3033 struct cdrom_info *info = ide_cd_g(disk);
1da177e4
LT
3034
3035 cdrom_release (&info->devinfo, file);
1da177e4
LT
3036
3037 ide_cd_put(info);
3038
3039 return 0;
3040}
3041
6a2900b6
CH
3042static int idecd_set_spindown(struct cdrom_device_info *cdi, unsigned long arg)
3043{
3044 struct packet_command cgc;
3045 char buffer[16];
3046 int stat;
3047 char spindown;
3048
3049 if (copy_from_user(&spindown, (void __user *)arg, sizeof(char)))
3050 return -EFAULT;
3051
3052 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
3053
3054 stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0);
3055 if (stat)
3056 return stat;
3057
3058 buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f);
3059 return cdrom_mode_select(cdi, &cgc);
3060}
3061
3062static int idecd_get_spindown(struct cdrom_device_info *cdi, unsigned long arg)
3063{
3064 struct packet_command cgc;
3065 char buffer[16];
3066 int stat;
3067 char spindown;
3068
3069 init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
3070
3071 stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0);
3072 if (stat)
3073 return stat;
3074
3075 spindown = buffer[11] & 0x0f;
3076 if (copy_to_user((void __user *)arg, &spindown, sizeof (char)))
3077 return -EFAULT;
3078 return 0;
3079}
3080
1da177e4
LT
3081static int idecd_ioctl (struct inode *inode, struct file *file,
3082 unsigned int cmd, unsigned long arg)
3083{
3084 struct block_device *bdev = inode->i_bdev;
3085 struct cdrom_info *info = ide_cd_g(bdev->bd_disk);
3086 int err;
3087
6a2900b6
CH
3088 switch (cmd) {
3089 case CDROMSETSPINDOWN:
3090 return idecd_set_spindown(&info->devinfo, arg);
3091 case CDROMGETSPINDOWN:
3092 return idecd_get_spindown(&info->devinfo, arg);
3093 default:
3094 break;
3095 }
3096
3097 err = generic_ide_ioctl(info->drive, file, bdev, cmd, arg);
1da177e4
LT
3098 if (err == -EINVAL)
3099 err = cdrom_ioctl(file, &info->devinfo, inode, cmd, arg);
3100
3101 return err;
3102}
3103
3104static int idecd_media_changed(struct gendisk *disk)
3105{
3106 struct cdrom_info *info = ide_cd_g(disk);
3107 return cdrom_media_changed(&info->devinfo);
3108}
3109
3110static int idecd_revalidate_disk(struct gendisk *disk)
3111{
3112 struct cdrom_info *info = ide_cd_g(disk);
3113 struct request_sense sense;
3114 cdrom_read_toc(info->drive, &sense);
3115 return 0;
3116}
3117
3118static struct block_device_operations idecd_ops = {
3119 .owner = THIS_MODULE,
3120 .open = idecd_open,
3121 .release = idecd_release,
3122 .ioctl = idecd_ioctl,
3123 .media_changed = idecd_media_changed,
3124 .revalidate_disk= idecd_revalidate_disk
3125};
3126
3127/* options */
3128static char *ignore = NULL;
3129
3130module_param(ignore, charp, 0400);
3131MODULE_DESCRIPTION("ATAPI CD-ROM Driver");
3132
4031bbe4 3133static int ide_cd_probe(ide_drive_t *drive)
1da177e4
LT
3134{
3135 struct cdrom_info *info;
3136 struct gendisk *g;
3137 struct request_sense sense;
3138
3139 if (!strstr("ide-cdrom", drive->driver_req))
3140 goto failed;
3141 if (!drive->present)
3142 goto failed;
3143 if (drive->media != ide_cdrom && drive->media != ide_optical)
3144 goto failed;
3145 /* skip drives that we were told to ignore */
3146 if (ignore != NULL) {
3147 if (strstr(ignore, drive->name)) {
3148 printk(KERN_INFO "ide-cd: ignoring drive %s\n", drive->name);
3149 goto failed;
3150 }
3151 }
3152 if (drive->scsi) {
3153 printk(KERN_INFO "ide-cd: passing drive %s to ide-scsi emulation.\n", drive->name);
3154 goto failed;
3155 }
f5e3c2fa 3156 info = kzalloc(sizeof(struct cdrom_info), GFP_KERNEL);
1da177e4
LT
3157 if (info == NULL) {
3158 printk(KERN_ERR "%s: Can't allocate a cdrom structure\n", drive->name);
3159 goto failed;
3160 }
3161
3162 g = alloc_disk(1 << PARTN_BITS);
3163 if (!g)
3164 goto out_free_cd;
3165
3166 ide_init_disk(g, drive);
3167
7662d046 3168 ide_proc_register_driver(drive, &ide_cdrom_driver);
8604affd 3169
1da177e4
LT
3170 kref_init(&info->kref);
3171
3172 info->drive = drive;
3173 info->driver = &ide_cdrom_driver;
3174 info->disk = g;
3175
3176 g->private_data = &info->driver;
3177
3178 drive->driver_data = info;
3179
1da177e4 3180 g->minors = 1;
1da177e4
LT
3181 g->driverfs_dev = &drive->gendev;
3182 g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE;
3183 if (ide_cdrom_setup(drive)) {
7662d046 3184 ide_proc_unregister_driver(drive, &ide_cdrom_driver);
05017db3 3185 ide_cd_release(&info->kref);
1da177e4
LT
3186 goto failed;
3187 }
1da177e4
LT
3188
3189 cdrom_read_toc(drive, &sense);
3190 g->fops = &idecd_ops;
3191 g->flags |= GENHD_FL_REMOVABLE;
3192 add_disk(g);
3193 return 0;
3194
1da177e4
LT
3195out_free_cd:
3196 kfree(info);
3197failed:
8604affd 3198 return -ENODEV;
1da177e4
LT
3199}
3200
3201static void __exit ide_cdrom_exit(void)
3202{
8604affd 3203 driver_unregister(&ide_cdrom_driver.gen_driver);
1da177e4 3204}
17514e8a
BZ
3205
3206static int __init ide_cdrom_init(void)
1da177e4 3207{
8604affd 3208 return driver_register(&ide_cdrom_driver.gen_driver);
1da177e4
LT
3209}
3210
263756ec 3211MODULE_ALIAS("ide:*m-cdrom*");
1da177e4
LT
3212module_init(ide_cdrom_init);
3213module_exit(ide_cdrom_exit);
3214MODULE_LICENSE("GPL");