ide-cd: remove struct ide_cd_{config,state}_flags
[linux-2.6] / drivers / ide / ide-cd.c
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  *
31  * For historical changelog please see:
32  *      Documentation/ide/ChangeLog.ide-cd.1994-2004
33  */
34
35 #define IDECD_VERSION "4.61"
36
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>
48 #include <linux/mutex.h>
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
60 static DEFINE_MUTEX(idecd_ref_mutex);
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
67 static struct cdrom_info *ide_cd_get(struct gendisk *disk)
68 {
69         struct cdrom_info *cd = NULL;
70
71         mutex_lock(&idecd_ref_mutex);
72         cd = ide_cd_g(disk);
73         if (cd)
74                 kref_get(&cd->kref);
75         mutex_unlock(&idecd_ref_mutex);
76         return cd;
77 }
78
79 static void ide_cd_release(struct kref *);
80
81 static void ide_cd_put(struct cdrom_info *cd)
82 {
83         mutex_lock(&idecd_ref_mutex);
84         kref_put(&cd->kref, ide_cd_release);
85         mutex_unlock(&idecd_ref_mutex);
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. */
94 static void cdrom_saw_media_change (ide_drive_t *drive)
95 {
96         struct cdrom_info *cd = drive->driver_data;
97
98         cd->cd_flags |= IDE_CD_FLAG_MEDIA_CHANGED;
99         cd->cd_flags &= ~IDE_CD_FLAG_TOC_VALID;
100         cd->nsectors_buffered = 0;
101 }
102
103 static int cdrom_log_sense(ide_drive_t *drive, struct request *rq,
104                            struct request_sense *sense)
105 {
106         int log = 0;
107
108         if (!sense || !rq || (rq->cmd_flags & REQ_QUIET))
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)
130                                 break;
131                         log = 1;
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
148 static
149 void cdrom_analyze_sense_data(ide_drive_t *drive,
150                               struct request *failed_command,
151                               struct request_sense *sense)
152 {
153         unsigned long sector;
154         unsigned long bio_sectors;
155         unsigned long valid;
156         struct cdrom_info *info = drive->driver_data;
157
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
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         }
201 #if VERBOSE_IDE_CD_ERRORS
202         {
203                 int i;
204                 const char *s = "bad sense key!";
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
217                 if (sense->sense_key < ARRAY_SIZE(sense_key_texts))
218                         s = sense_key_texts[sense->sense_key];
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 {
227                         int lo = 0, mid, hi = ARRAY_SIZE(sense_data_texts);
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
260                         int lo=0, mid, hi= ARRAY_SIZE(packet_command_texts);
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  */
328 static 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);
333         rq->cmd_type = REQ_TYPE_ATA_PC;
334         rq->rq_disk = cd->disk;
335 }
336
337 static 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
353         rq->cmd_type = REQ_TYPE_SENSE;
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
361 static 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
366         if (blk_sense_request(rq) && uptodate) {
367                 /*
368                  * For REQ_TYPE_SENSE, "rq->buffer" points to the original
369                  * failed request
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                         }
381                         cdrom_analyze_sense_data(drive, failed, sense);
382                         /*
383                          * now end failed request
384                          */
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);
391                                 if (__blk_end_request(failed, -EIO,
392                                                       failed->data_len))
393                                         BUG();
394                                 spin_unlock_irqrestore(&ide_lock, flags);
395                         }
396                 } else
397                         cdrom_analyze_sense_data(drive, NULL, sense);
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
411 static 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
418 /* Returns 0 if the request should be continued.
419    Returns 1 if the request was ended. */
420 static 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
442         if (blk_sense_request(rq)) {
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
447                 rq->cmd_flags |= REQ_FAILED;
448                 cdrom_end_request(drive, 0);
449                 ide_error(drive, "request sense failure", stat);
450                 return 1;
451
452         } else if (blk_pc_request(rq) || rq->cmd_type == REQ_TYPE_ATA_PC) {
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                  */
460                 if (blk_pc_request(rq) && !rq->errors)
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;
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                          */
480                 } else if (!(rq->cmd_flags & REQ_QUIET)) {
481                         /* Otherwise, print an error. */
482                         ide_dump_status(drive, "packet command error", stat);
483                 }
484                 
485                 rq->cmd_flags |= REQ_FAILED;
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.*/
555                         ide_dump_status_no_sense (drive, "command error", stat);
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 */
560                         ide_dump_status_no_sense (drive, "media error (bad sector)", stat);
561                         do_end_request = 1;
562                 } else if (sense_key == BLANK_CHECK) {
563                         /* Disk appears blank ?? */
564                         ide_dump_status_no_sense (drive, "media error (blank)", stat);
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
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                 }
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
606 static 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:
626                         if (!(rq->cmd_flags & REQ_QUIET))
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
641 static 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
653         /* FIXME: for Virtual DMA we must check harder */
654         if (info->dma)
655                 info->dma = !hwif->dma_setup(drive);
656
657         /* Set up the controller registers. */
658         ide_pktcmd_tf_load(drive, IDE_TFLAG_OUT_NSECT | IDE_TFLAG_OUT_LBAL |
659                            IDE_TFLAG_NO_SELECT_MASK, xferlen, info->dma);
660
661         if (info->cd_flags & IDE_CD_FLAG_DRQ_INTERRUPT) {
662                 /* waiting for CDB interrupt, not DMA yet. */
663                 if (info->dma)
664                         drive->waiting_for_dma = 0;
665
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. */
687 #define ATAPI_MIN_CDB_BYTES 12
688 static 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
697         if (info->cd_flags & IDE_CD_FLAG_DRQ_INTERRUPT) {
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;
704
705                 /* Ok, next interrupt will be DMA interrupt. */
706                 if (info->dma)
707                         drive->waiting_for_dma = 1;
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
737 typedef void (xfer_func_t)(ide_drive_t *, void *, u32);
738
739 static 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
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  */
755 static 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  */
798 static
799 int 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) {
804                 ide_hwif_t *hwif = drive->hwif;
805
806                 /* Whoops... The drive is expecting to receive data from us! */
807                 printk(KERN_ERR "%s: %s: wrong transfer direction!\n",
808                                 drive->name, __FUNCTION__);
809
810                 /* Throw some data at the drive so it doesn't hang
811                    and quit this request. */
812                 ide_cd_pad_transfer(drive, hwif->atapi_output_bytes, len);
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... */
821                 printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n",
822                                 drive->name, __FUNCTION__, ireason);
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  */
832 static 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;
847                 dma_error = HWIF(drive)->ide_dma_end(drive);
848                 if (dma_error) {
849                         printk(KERN_ERR "%s: DMA read error\n", drive->name);
850                         ide_dma_off(drive);
851                 }
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);
879                         rq->cmd_flags |= REQ_FAILED;
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);
896                 if (info->cd_flags & IDE_CD_FLAG_LIMIT_NFRAMES)
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");
900                         info->cd_flags |= IDE_CD_FLAG_LIMIT_NFRAMES;
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  */
967 static 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  */
1028 static 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
1068 static 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;
1076
1077         info->cd_flags |= IDE_CD_FLAG_SEEKING;
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
1092 static 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
1107 static 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;
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. */
1118 static 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  */
1136 static 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
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
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. */
1170 static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive)
1171 {
1172         struct request *rq = HWGROUP(drive)->rq;
1173         xfer_func_t *xferfunc = NULL;
1174         int stat, ireason, len, thislen, write;
1175         u8 lowcyl = 0, highcyl = 0;
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. */
1182         ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3;
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 {
1205                         rq->cmd_flags |= REQ_FAILED;
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;
1213         if (thislen > len)
1214                 thislen = len;
1215
1216         if (ireason == 0) {
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;
1222         }
1223
1224         if (xferfunc) {
1225                 if (!rq->data) {
1226                         printk(KERN_ERR "%s: confused, missing data\n",
1227                                         drive->name);
1228                         blk_dump_rq_flags(rq, write ? "cdrom_pc_intr, write"
1229                                                     : "cdrom_pc_intr, read");
1230                         goto pad;
1231                 }
1232                 /* Transfer the data. */
1233                 xferfunc(drive, rq->data, thislen);
1234
1235                 /* Keep count of how much data we've moved. */
1236                 len -= thislen;
1237                 rq->data += thislen;
1238                 rq->data_len -= thislen;
1239
1240                 if (write && blk_sense_request(rq))
1241                         rq->sense_len += thislen;
1242         } else {
1243                 printk (KERN_ERR "%s: cdrom_pc_intr: The drive "
1244                         "appears confused (ireason = 0x%02x). "
1245                         "Trying to recover by ending request.\n",
1246                         drive->name, ireason);
1247                 rq->cmd_flags |= REQ_FAILED;
1248                 cdrom_end_request(drive, 0);
1249                 return ide_stopped;
1250         }
1251 pad:
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
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
1264 static 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
1276 static 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;
1283         rq->cmd_flags &= ~REQ_FAILED;
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
1291 static int cdrom_queue_packet_command(ide_drive_t *drive, struct request *rq)
1292 {
1293         struct request_sense sense;
1294         int retries = 10;
1295         unsigned int flags = rq->cmd_flags;
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;
1304                 rq->cmd_flags = flags;
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 */
1311                 if (rq->cmd_flags & REQ_FAILED) {
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. */
1333         } while ((rq->cmd_flags & REQ_FAILED) && retries >= 0);
1334
1335         /* Return an error if the command failed. */
1336         return (rq->cmd_flags & REQ_FAILED) ? -EIO : 0;
1337 }
1338
1339 /*
1340  * Write handling
1341  */
1342 static int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason)
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) {
1351                 ide_hwif_t *hwif = drive->hwif;
1352
1353                 /* Whoops... The drive wants to send data. */
1354                 printk(KERN_ERR "%s: %s: wrong transfer direction!\n",
1355                                 drive->name, __FUNCTION__);
1356
1357                 ide_cd_pad_transfer(drive, hwif->atapi_input_bytes, len);
1358         } else {
1359                 /* Drive wants a command packet, or invalid ireason... */
1360                 printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n",
1361                                 drive->name, __FUNCTION__, ireason);
1362         }
1363
1364         cdrom_end_request(drive, 0);
1365         return 1;
1366 }
1367
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  */
1374 static int cdrom_newpc_intr_dummy_cb(struct request *rq)
1375 {
1376         return 1;
1377 }
1378
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  */
1385 static 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);
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                 }
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) {
1414                 if (dma_error)
1415                         return ide_error(drive, "dma error", stat);
1416
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;
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          */
1441         if ((stat & DRQ_STAT) == 0) {
1442                 spin_lock_irqsave(&ide_lock, flags);
1443                 if (__blk_end_request(rq, 0, rq->data_len))
1444                         BUG();
1445                 HWGROUP(drive)->rq = NULL;
1446                 spin_unlock_irqrestore(&ide_lock, flags);
1447
1448                 return ide_stopped;
1449         }
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)
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);
1510                 else
1511                         rq->data += blen;
1512         }
1513
1514         /*
1515          * pad, if necessary
1516          */
1517         if (len > 0)
1518                 ide_cd_pad_transfer(drive, xferfunc, len);
1519
1520         BUG_ON(HWGROUP(drive)->handler != NULL);
1521
1522         ide_set_handler(drive, cdrom_newpc_intr, rq->timeout, NULL);
1523         return ide_started;
1524 }
1525
1526 static 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;
1538                 dma_error = HWIF(drive)->ide_dma_end(drive);
1539                 if (dma_error) {
1540                         printk(KERN_ERR "%s: DMA write error\n", drive->name);
1541                         ide_dma_off(drive);
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. */
1560         ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3;
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) {
1573                         printk(KERN_ERR "%s: %s: data underrun (%d blocks)\n",
1574                                         drive->name, __FUNCTION__,
1575                                         rq->current_nr_sectors);
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) {
1595                         printk(KERN_ERR "%s: %s: confused, missing data\n",
1596                                         drive->name, __FUNCTION__);
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
1627 static 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
1639 static 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
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;
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
1674 static 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
1684 static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
1685 {
1686         struct cdrom_info *info = drive->driver_data;
1687
1688         rq->cmd_flags |= REQ_QUIET;
1689
1690         info->dma = 0;
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
1699                 info->dma = drive->using_dma;
1700
1701                 /*
1702                  * check if dma is safe
1703                  *
1704                  * NOTE! The "len" and "addr" checks should possibly have
1705                  * separate masks.
1706                  */
1707                 if ((rq->data_len & 15) || (addr & mask))
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  */
1718 static ide_startstop_t
1719 ide_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)) {
1725                 if (info->cd_flags & IDE_CD_FLAG_SEEKING) {
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                         }
1736                         info->cd_flags &= ~IDE_CD_FLAG_SEEKING;
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;
1748         } else if (rq->cmd_type == REQ_TYPE_SENSE ||
1749                    rq->cmd_type == REQ_TYPE_ATA_PC) {
1750                 return cdrom_do_packet_command(drive);
1751         } else if (blk_pc_request(rq)) {
1752                 return cdrom_do_block_pc(drive, rq);
1753         } else if (blk_special_request(rq)) {
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
1779 static inline
1780 int bin2bcd (int x)
1781 {
1782         return (x%10) | ((x/10) << 4);
1783 }
1784
1785
1786 static inline
1787 int bcd2bin (int x)
1788 {
1789         return (x >> 4) * 10 + (x & 0x0f);
1790 }
1791
1792 static
1793 void 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
1803 static inline
1804 void 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
1815 static inline
1816 int msf_to_lba (byte m, byte s, byte f)
1817 {
1818         return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
1819 }
1820
1821 static 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;
1831         req.cmd_flags |= REQ_QUIET;
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. */
1845 static int
1846 cdrom_lockdoor(ide_drive_t *drive, int lockflag, struct request_sense *sense)
1847 {
1848         struct cdrom_info *cd = drive->driver_data;
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. */
1857         if (cd->cd_flags & IDE_CD_FLAG_NO_DOORLOCK) {
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);
1874                 cd->cd_flags |= IDE_CD_FLAG_NO_DOORLOCK;
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
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         }
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. */
1895 static int cdrom_eject(ide_drive_t *drive, int ejectflag,
1896                        struct request_sense *sense)
1897 {
1898         struct cdrom_info *cd = drive->driver_data;
1899         struct cdrom_device_info *cdi = &cd->devinfo;
1900         struct request req;
1901         char loej = 0x02;
1902
1903         if ((cd->cd_flags & IDE_CD_FLAG_NO_EJECT) && !ejectflag)
1904                 return -EDRIVE_CANT_DO_THIS;
1905
1906         /* reload fails on some drives, if the tray is locked */
1907         if ((cd->cd_flags & IDE_CD_FLAG_DOOR_LOCKED) && ejectflag)
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 */
1913         if (ejectflag && (cdi->mask & CDC_CLOSE_TRAY))
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
1922 static 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);
1940         req.cmd_flags |= REQ_QUIET;
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
1952 static 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;
1963         req.cmd_flags |= REQ_QUIET;
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. */
1978 static 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. */
1993                 toc = kmalloc(sizeof(struct atapi_toc), GFP_KERNEL);
1994                 if (toc == NULL) {
1995                         printk (KERN_ERR "%s: No cdrom TOC buffer!\n", drive->name);
1996                         return -ENOMEM;
1997                 }
1998                 info->toc = toc;
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
2005         if (info->cd_flags & IDE_CD_FLAG_TOC_VALID)
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);
2015         /* Save a private copy of te TOC capacity for error handling */
2016         drive->probed_capacity = toc->capacity * sectors_per_frame;
2017
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);
2024         if (stat)
2025                 return stat;
2026
2027 #if ! STANDARD_ATAPI
2028         if (info->cd_flags & IDE_CD_FLAG_TOCTRACKS_AS_BCD) {
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)
2056                    and only holds the Leadout entry. Heiko Eißfeldt */
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
2068                 if (info->cd_flags & IDE_CD_FLAG_TOCTRACKS_AS_BCD) {
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
2085         if (info->cd_flags & IDE_CD_FLAG_TOCTRACKS_AS_BCD) {
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
2093                 if (info->cd_flags & IDE_CD_FLAG_TOCADDR_AS_BCD) {
2094                         if (info->cd_flags & IDE_CD_FLAG_TOCTRACKS_AS_BCD)
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);
2109                 if (stat)
2110                         return stat;
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
2119         if (info->cd_flags & IDE_CD_FLAG_TOCADDR_AS_BCD) {
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);
2140                 drive->probed_capacity = toc->capacity * sectors_per_frame;
2141         }
2142
2143         /* Remember that we've read this stuff. */
2144         info->cd_flags |= IDE_CD_FLAG_TOC_VALID;
2145
2146         return 0;
2147 }
2148
2149
2150 static 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. */
2171 static int cdrom_select_speed(ide_drive_t *drive, int speed,
2172                               struct request_sense *sense)
2173 {
2174         struct cdrom_info *cd = drive->driver_data;
2175         struct cdrom_device_info *cdi = &cd->devinfo;
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;
2190         if ((cdi->mask & (CDC_CD_R | CDC_CD_RW | CDC_DVD_R)) !=
2191             (CDC_CD_R | CDC_CD_RW | CDC_DVD_R)) {
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
2201 static 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
2216 static 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          */
2226         if ((info->cd_flags & IDE_CD_FLAG_TOC_VALID) == 0)
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 */
2244 static int ide_cdrom_packet(struct cdrom_device_info *cdi,
2245                             struct packet_command *cgc)
2246 {
2247         struct request req;
2248         ide_drive_t *drive = cdi->handle;
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)
2265                 req.cmd_flags |= REQ_QUIET;
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
2274 static
2275 int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi,
2276                            unsigned int cmd, void *arg)
2277                            
2278 {
2279         ide_drive_t *drive = cdi->handle;
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;
2290                 struct cdrom_ti *ti = arg;
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: {
2313                 struct cdrom_tochdr *tochdr = arg;
2314                 struct atapi_toc *toc;
2315
2316                 /* Make sure our saved TOC is valid. */
2317                 stat = cdrom_read_toc(drive, NULL);
2318                 if (stat)
2319                         return stat;
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: {
2329                 struct cdrom_tocentry *tocentry = arg;
2330                 struct atapi_toc_entry *toce;
2331
2332                 stat = cdrom_get_toc_entry(drive, tocentry->cdte_track, &toce);
2333                 if (stat)
2334                         return stat;
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
2354 static
2355 int ide_cdrom_reset (struct cdrom_device_info *cdi)
2356 {
2357         ide_drive_t *drive = cdi->handle;
2358         struct cdrom_info *cd = drive->driver_data;
2359         struct request_sense sense;
2360         struct request req;
2361         int ret;
2362
2363         cdrom_prepare_request(drive, &req);
2364         req.cmd_type = REQ_TYPE_SPECIAL;
2365         req.cmd_flags = REQ_QUIET;
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          */
2372         if (cd->cd_flags & IDE_CD_FLAG_DOOR_LOCKED)
2373                 (void) cdrom_lockdoor(drive, 1, &sense);
2374
2375         return ret;
2376 }
2377
2378
2379 static
2380 int ide_cdrom_tray_move (struct cdrom_device_info *cdi, int position)
2381 {
2382         ide_drive_t *drive = cdi->handle;
2383         struct request_sense sense;
2384
2385         if (position) {
2386                 int stat = cdrom_lockdoor(drive, 0, &sense);
2387                 if (stat)
2388                         return stat;
2389         }
2390
2391         return cdrom_eject(drive, !position, &sense);
2392 }
2393
2394 static
2395 int ide_cdrom_lock_door (struct cdrom_device_info *cdi, int lock)
2396 {
2397         ide_drive_t *drive = cdi->handle;
2398         return cdrom_lockdoor(drive, lock, NULL);
2399 }
2400
2401 static int ide_cdrom_get_capabilities(ide_drive_t *drive, u8 *buf)
2402 {
2403         struct cdrom_info *info = drive->driver_data;
2404         struct cdrom_device_info *cdi = &info->devinfo;
2405         struct packet_command cgc;
2406         int stat, attempts = 3, size = ATAPI_CAPABILITIES_PAGE_SIZE;
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")))
2414                 size -= ATAPI_CAPABILITIES_PAGE_PAD_SIZE;
2415
2416         init_cdrom_command(&cgc, buf, size, CGC_DATA_UNKNOWN);
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
2425 static void ide_cdrom_update_speed(ide_drive_t *drive, u8 *buf)
2426 {
2427         struct cdrom_info *cd = drive->driver_data;
2428         u16 curspeed, maxspeed;
2429
2430         curspeed = *(u16 *)&buf[8 + 14];
2431         maxspeed = *(u16 *)&buf[8 +  8];
2432
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)) {
2436                 curspeed = le16_to_cpu(curspeed);
2437                 maxspeed = le16_to_cpu(maxspeed);
2438         } else {
2439                 curspeed = be16_to_cpu(curspeed);
2440                 maxspeed = be16_to_cpu(maxspeed);
2441         }
2442
2443         cd->current_speed = (curspeed + (176/2)) / 176;
2444         cd->max_speed = (maxspeed + (176/2)) / 176;
2445 }
2446
2447 static
2448 int ide_cdrom_select_speed (struct cdrom_device_info *cdi, int speed)
2449 {
2450         ide_drive_t *drive = cdi->handle;
2451         struct cdrom_info *cd = drive->driver_data;
2452         struct request_sense sense;
2453         u8 buf[ATAPI_CAPABILITIES_PAGE_SIZE];
2454         int stat;
2455
2456         if ((stat = cdrom_select_speed(drive, speed, &sense)) < 0)
2457                 return stat;
2458
2459         if (!ide_cdrom_get_capabilities(drive, buf)) {
2460                 ide_cdrom_update_speed(drive, buf);
2461                 cdi->speed = cd->current_speed;
2462         }
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  */
2471 static
2472 int ide_cdrom_drive_status (struct cdrom_device_info *cdi, int slot_nr)
2473 {
2474         ide_drive_t *drive = cdi->handle;
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) {
2504                 if (sense.asc == 0x3a && sense.ascq == 1)
2505                         return CDS_NO_DISC;
2506                 else
2507                         return CDS_TRAY_OPEN;
2508         }
2509         return CDS_DRIVE_NOT_READY;
2510 }
2511
2512 static
2513 int ide_cdrom_get_last_session (struct cdrom_device_info *cdi,
2514                                 struct cdrom_multisession *ms_info)
2515 {
2516         struct atapi_toc *toc;
2517         ide_drive_t *drive = cdi->handle;
2518         struct cdrom_info *info = drive->driver_data;
2519         struct request_sense sense;
2520         int ret;
2521
2522         if ((info->cd_flags & IDE_CD_FLAG_TOC_VALID) == 0 || info->toc == NULL)
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
2533 static
2534 int ide_cdrom_get_mcn (struct cdrom_device_info *cdi,
2535                        struct cdrom_mcn *mcn_info)
2536 {
2537         int stat;
2538         char mcnbuf[24];
2539         ide_drive_t *drive = cdi->handle;
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
2559 static
2560 int ide_cdrom_check_media_change_real (struct cdrom_device_info *cdi,
2561                                        int slot_nr)
2562 {
2563         ide_drive_t *drive = cdi->handle;
2564         struct cdrom_info *cd = drive->driver_data;
2565         int retval;
2566
2567         if (slot_nr == CDSL_CURRENT) {
2568                 (void) cdrom_check_status(drive, NULL);
2569                 retval = (cd->cd_flags & IDE_CD_FLAG_MEDIA_CHANGED) ? 1 : 0;
2570                 cd->cd_flags &= ~IDE_CD_FLAG_MEDIA_CHANGED;
2571                 return retval;
2572         } else {
2573                 return -EINVAL;
2574         }
2575 }
2576
2577
2578 static
2579 int 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
2588 static
2589 void ide_cdrom_release_real (struct cdrom_device_info *cdi)
2590 {
2591         ide_drive_t *drive = cdi->handle;
2592         struct cdrom_info *cd = drive->driver_data;
2593
2594         if (!cdi->use_count)
2595                 cd->cd_flags &= ~IDE_CD_FLAG_TOC_VALID;
2596 }
2597
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)
2604
2605 static 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,
2617         .capability             = IDE_CD_CAPABILITIES,
2618         .generic_packet         = ide_cdrom_packet,
2619 };
2620
2621 static 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;
2627         devinfo->speed = info->current_speed;
2628         devinfo->capacity = nslots;
2629         devinfo->handle = drive;
2630         strcpy(devinfo->name, drive->name);
2631
2632         if (info->cd_flags & IDE_CD_FLAG_NO_SPEED_SELECT)
2633                 devinfo->mask |= CDC_SELECT_SPEED;
2634
2635         devinfo->disk = info->disk;
2636         return register_cdrom(devinfo);
2637 }
2638
2639 static
2640 int ide_cdrom_probe_capabilities (ide_drive_t *drive)
2641 {
2642         struct cdrom_info *cd = drive->driver_data;
2643         struct cdrom_device_info *cdi = &cd->devinfo;
2644         u8 buf[ATAPI_CAPABILITIES_PAGE_SIZE];
2645         mechtype_t mechtype;
2646         int nslots = 1;
2647
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
2652         if (drive->media == ide_optical) {
2653                 cdi->mask &= ~(CDC_MO_DRIVE | CDC_RAM);
2654                 printk(KERN_ERR "%s: ATAPI magneto-optical drive\n", drive->name);
2655                 return nslots;
2656         }
2657
2658         if ((cd->cd_flags & IDE_CD_FLAG_NEC260) ||
2659             !strcmp(drive->id->model,"STINGRAY 8422 IDE 8X CD-ROM 7-27-95")) {
2660                 cd->cd_flags &= ~IDE_CD_FLAG_NO_EJECT;
2661                 cdi->mask &= ~CDC_PLAY_AUDIO;
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          */
2672         cdi->handle = drive;
2673         cdi->ops = &ide_cdrom_dops;
2674
2675         if (ide_cdrom_get_capabilities(drive, buf))
2676                 return 0;
2677
2678         if ((buf[8 + 6] & 0x01) == 0)
2679                 cd->cd_flags |= IDE_CD_FLAG_NO_DOORLOCK;
2680         if (buf[8 + 6] & 0x08)
2681                 cd->cd_flags &= ~IDE_CD_FLAG_NO_EJECT;
2682         if (buf[8 + 3] & 0x01)
2683                 cdi->mask &= ~CDC_CD_R;
2684         if (buf[8 + 3] & 0x02)
2685                 cdi->mask &= ~(CDC_CD_RW | CDC_RAM);
2686         if (buf[8 + 2] & 0x38)
2687                 cdi->mask &= ~CDC_DVD;
2688         if (buf[8 + 3] & 0x20)
2689                 cdi->mask &= ~(CDC_DVD_RAM | CDC_RAM);
2690         if (buf[8 + 3] & 0x10)
2691                 cdi->mask &= ~CDC_DVD_R;
2692         if (buf[8 + 4] & 0x01)
2693                 cdi->mask &= ~CDC_PLAY_AUDIO;
2694
2695         mechtype = buf[8 + 6] >> 5;
2696         if (mechtype == mechtype_caddy || mechtype == mechtype_popup)
2697                 cdi->mask |= CDC_CLOSE_TRAY;
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)
2706                 cdi->mask &= ~CDC_PLAY_AUDIO;
2707
2708 #if ! STANDARD_ATAPI
2709         if (cdi->sanyo_slot > 0) {
2710                 cdi->mask &= ~CDC_SELECT_DISC;
2711                 nslots = 3;
2712         }
2713
2714         else
2715 #endif /* not STANDARD_ATAPI */
2716         if (mechtype == mechtype_individual_changer ||
2717             mechtype == mechtype_cartridge_changer) {
2718                 nslots = cdrom_number_of_slots(cdi);
2719                 if (nslots > 1)
2720                         cdi->mask &= ~CDC_SELECT_DISC;
2721         }
2722
2723         ide_cdrom_update_speed(drive, buf);
2724
2725         printk(KERN_INFO "%s: ATAPI", drive->name);
2726
2727         /* don't print speed if the drive reported 0 */
2728         if (cd->max_speed)
2729                 printk(KERN_CONT " %dX", cd->max_speed);
2730
2731         printk(KERN_CONT " %s", (cdi->mask & CDC_DVD) ? "CD-ROM" : "DVD-ROM");
2732
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");
2737
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");
2742
2743         if ((cdi->mask & CDC_SELECT_DISC) == 0)
2744                 printk(KERN_CONT " changer w/%d slots", nslots);
2745         else
2746                 printk(KERN_CONT " drive");
2747
2748         printk(KERN_CONT ", %dkB Cache\n", be16_to_cpu(*(u16 *)&buf[8 + 12]));
2749
2750         return nslots;
2751 }
2752
2753 #ifdef CONFIG_IDE_PROC_FS
2754 static void ide_cdrom_add_settings(ide_drive_t *drive)
2755 {
2756         ide_add_setting(drive, "dsc_overlap", SETTING_RW, TYPE_BYTE, 0, 1, 1, 1, &drive->dsc_overlap, NULL);
2757 }
2758 #else
2759 static inline void ide_cdrom_add_settings(ide_drive_t *drive) { ; }
2760 #endif
2761
2762 /*
2763  * standard prep_rq_fn that builds 10 byte cmds
2764  */
2765 static int ide_cdrom_prep_fs(struct request_queue *q, struct request *rq)
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  */
2799 static 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
2831 static int ide_cdrom_prep_fn(struct request_queue *q, struct request *rq)
2832 {
2833         if (blk_fs_request(rq))
2834                 return ide_cdrom_prep_fs(q, rq);
2835         else if (blk_pc_request(rq))
2836                 return ide_cdrom_prep_pc(rq);
2837
2838         return 0;
2839 }
2840
2841 static
2842 int ide_cdrom_setup (ide_drive_t *drive)
2843 {
2844         struct cdrom_info *cd = drive->driver_data;
2845         struct cdrom_device_info *cdi = &cd->devinfo;
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
2856         cd->cd_flags |= IDE_CD_FLAG_MEDIA_CHANGED;
2857
2858 #if NO_DOOR_LOCKING
2859         cd->cd_flags |= IDE_CD_FLAG_NO_DOORLOCK;
2860 #endif
2861         if ((drive->id->config & 0x0060) == 0x20)
2862                 cd->cd_flags |= IDE_CD_FLAG_DRQ_INTERRUPT;
2863         cd->cd_flags |= IDE_CD_FLAG_NO_EJECT;
2864
2865         /* limit transfer size per interrupt. */
2866         /* a testament to the nice quality of Samsung drives... */
2867         if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2430") ||
2868             !strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2432"))
2869                 cd->cd_flags |= IDE_CD_FLAG_LIMIT_NFRAMES;
2870         /* the 3231 model does not support the SET_CD_SPEED command */
2871         else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-3231"))
2872                 cd->cd_flags |= IDE_CD_FLAG_NO_SPEED_SELECT;
2873
2874 #if ! STANDARD_ATAPI
2875         if (strcmp (drive->id->model, "V003S0DS") == 0 &&
2876             drive->id->fw_rev[4] == '1' &&
2877             drive->id->fw_rev[6] <= '2') {
2878                 /* Vertos 300.
2879                    Some versions of this drive like to talk BCD. */
2880                 cd->cd_flags |= (IDE_CD_FLAG_TOCTRACKS_AS_BCD |
2881                                  IDE_CD_FLAG_TOCADDR_AS_BCD);
2882         }
2883         else if (strcmp (drive->id->model, "V006E0DS") == 0 &&
2884             drive->id->fw_rev[4] == '1' &&
2885             drive->id->fw_rev[6] <= '2') {
2886                 /* Vertos 600 ESD. */
2887                 cd->cd_flags |= IDE_CD_FLAG_TOCTRACKS_AS_BCD;
2888         }
2889         else if (strcmp(drive->id->model, "NEC CD-ROM DRIVE:260") == 0 &&
2890                  strncmp(drive->id->fw_rev, "1.01", 4) == 0) { /* FIXME */
2891                 /* Old NEC260 (not R).
2892                    This drive was released before the 1.2 version
2893                    of the spec. */
2894                 cd->cd_flags |= (IDE_CD_FLAG_TOCADDR_AS_BCD |
2895                                  IDE_CD_FLAG_NEC260);
2896         }
2897         /*
2898          * Sanyo 3 CD changer uses a non-standard command for CD changing
2899          * (by default standard ATAPI support for CD changers is used).
2900          */
2901         else if ((strcmp(drive->id->model, "CD-ROM CDR-C3 G") == 0) ||
2902                  (strcmp(drive->id->model, "CD-ROM CDR-C3G") == 0) ||
2903                  (strcmp(drive->id->model, "CD-ROM CDR_C36") == 0)) {
2904                  /* uses CD in slot 0 when value is set to 3 */
2905                  cdi->sanyo_slot = 3;
2906         }
2907 #endif /* not STANDARD_ATAPI */
2908
2909         nslots = ide_cdrom_probe_capabilities (drive);
2910
2911         /*
2912          * set correct block size
2913          */
2914         blk_queue_hardsect_size(drive->queue, CD_FRAMESIZE);
2915
2916         if (drive->autotune == IDE_TUNE_DEFAULT ||
2917             drive->autotune == IDE_TUNE_AUTO)
2918                 drive->dsc_overlap = (drive->next != drive);
2919
2920         if (ide_cdrom_register(drive, nslots)) {
2921                 printk (KERN_ERR "%s: ide_cdrom_setup failed to register device with the cdrom driver.\n", drive->name);
2922                 cd->devinfo.handle = NULL;
2923                 return 1;
2924         }
2925         ide_cdrom_add_settings(drive);
2926         return 0;
2927 }
2928
2929 #ifdef CONFIG_IDE_PROC_FS
2930 static
2931 sector_t ide_cdrom_capacity (ide_drive_t *drive)
2932 {
2933         unsigned long capacity, sectors_per_frame;
2934
2935         if (cdrom_read_capacity(drive, &capacity, &sectors_per_frame, NULL))
2936                 return 0;
2937
2938         return capacity * sectors_per_frame;
2939 }
2940 #endif
2941
2942 static void ide_cd_remove(ide_drive_t *drive)
2943 {
2944         struct cdrom_info *info = drive->driver_data;
2945
2946         ide_proc_unregister_driver(drive, info->driver);
2947
2948         del_gendisk(info->disk);
2949
2950         ide_cd_put(info);
2951 }
2952
2953 static void ide_cd_release(struct kref *kref)
2954 {
2955         struct cdrom_info *info = to_ide_cd(kref);
2956         struct cdrom_device_info *devinfo = &info->devinfo;
2957         ide_drive_t *drive = info->drive;
2958         struct gendisk *g = info->disk;
2959
2960         kfree(info->buffer);
2961         kfree(info->toc);
2962         if (devinfo->handle == drive && unregister_cdrom(devinfo))
2963                 printk(KERN_ERR "%s: %s failed to unregister device from the cdrom "
2964                                 "driver.\n", __FUNCTION__, drive->name);
2965         drive->dsc_overlap = 0;
2966         drive->driver_data = NULL;
2967         blk_queue_prep_rq(drive->queue, NULL);
2968         g->private_data = NULL;
2969         put_disk(g);
2970         kfree(info);
2971 }
2972
2973 static int ide_cd_probe(ide_drive_t *);
2974
2975 #ifdef CONFIG_IDE_PROC_FS
2976 static int proc_idecd_read_capacity
2977         (char *page, char **start, off_t off, int count, int *eof, void *data)
2978 {
2979         ide_drive_t *drive = data;
2980         int len;
2981
2982         len = sprintf(page,"%llu\n", (long long)ide_cdrom_capacity(drive));
2983         PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
2984 }
2985
2986 static ide_proc_entry_t idecd_proc[] = {
2987         { "capacity", S_IFREG|S_IRUGO, proc_idecd_read_capacity, NULL },
2988         { NULL, 0, NULL, NULL }
2989 };
2990 #endif
2991
2992 static ide_driver_t ide_cdrom_driver = {
2993         .gen_driver = {
2994                 .owner          = THIS_MODULE,
2995                 .name           = "ide-cdrom",
2996                 .bus            = &ide_bus_type,
2997         },
2998         .probe                  = ide_cd_probe,
2999         .remove                 = ide_cd_remove,
3000         .version                = IDECD_VERSION,
3001         .media                  = ide_cdrom,
3002         .supports_dsc_overlap   = 1,
3003         .do_request             = ide_do_rw_cdrom,
3004         .end_request            = ide_end_request,
3005         .error                  = __ide_error,
3006         .abort                  = __ide_abort,
3007 #ifdef CONFIG_IDE_PROC_FS
3008         .proc                   = idecd_proc,
3009 #endif
3010 };
3011
3012 static int idecd_open(struct inode * inode, struct file * file)
3013 {
3014         struct gendisk *disk = inode->i_bdev->bd_disk;
3015         struct cdrom_info *info;
3016         int rc = -ENOMEM;
3017
3018         if (!(info = ide_cd_get(disk)))
3019                 return -ENXIO;
3020
3021         if (!info->buffer)
3022                 info->buffer = kmalloc(SECTOR_BUFFER_SIZE, GFP_KERNEL|__GFP_REPEAT);
3023
3024         if (info->buffer)
3025                 rc = cdrom_open(&info->devinfo, inode, file);
3026
3027         if (rc < 0)
3028                 ide_cd_put(info);
3029
3030         return rc;
3031 }
3032
3033 static int idecd_release(struct inode * inode, struct file * file)
3034 {
3035         struct gendisk *disk = inode->i_bdev->bd_disk;
3036         struct cdrom_info *info = ide_cd_g(disk);
3037
3038         cdrom_release (&info->devinfo, file);
3039
3040         ide_cd_put(info);
3041
3042         return 0;
3043 }
3044
3045 static int idecd_set_spindown(struct cdrom_device_info *cdi, unsigned long arg)
3046 {
3047         struct packet_command cgc;
3048         char buffer[16];
3049         int stat;
3050         char spindown;
3051
3052         if (copy_from_user(&spindown, (void __user *)arg, sizeof(char)))
3053                 return -EFAULT;
3054
3055         init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
3056
3057         stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0);
3058         if (stat)
3059                 return stat;
3060
3061         buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f);
3062         return cdrom_mode_select(cdi, &cgc);
3063 }
3064
3065 static int idecd_get_spindown(struct cdrom_device_info *cdi, unsigned long arg)
3066 {
3067         struct packet_command cgc;
3068         char buffer[16];
3069         int stat;
3070         char spindown;
3071
3072         init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
3073
3074         stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0);
3075         if (stat)
3076                 return stat;
3077
3078         spindown = buffer[11] & 0x0f;
3079         if (copy_to_user((void __user *)arg, &spindown, sizeof (char)))
3080                 return -EFAULT;
3081         return 0;
3082 }
3083
3084 static int idecd_ioctl (struct inode *inode, struct file *file,
3085                         unsigned int cmd, unsigned long arg)
3086 {
3087         struct block_device *bdev = inode->i_bdev;
3088         struct cdrom_info *info = ide_cd_g(bdev->bd_disk);
3089         int err;
3090
3091         switch (cmd) {
3092         case CDROMSETSPINDOWN:
3093                 return idecd_set_spindown(&info->devinfo, arg);
3094         case CDROMGETSPINDOWN:
3095                 return idecd_get_spindown(&info->devinfo, arg);
3096         default:
3097                 break;
3098         }
3099
3100         err = generic_ide_ioctl(info->drive, file, bdev, cmd, arg);
3101         if (err == -EINVAL)
3102                 err = cdrom_ioctl(file, &info->devinfo, inode, cmd, arg);
3103
3104         return err;
3105 }
3106
3107 static int idecd_media_changed(struct gendisk *disk)
3108 {
3109         struct cdrom_info *info = ide_cd_g(disk);
3110         return cdrom_media_changed(&info->devinfo);
3111 }
3112
3113 static int idecd_revalidate_disk(struct gendisk *disk)
3114 {
3115         struct cdrom_info *info = ide_cd_g(disk);
3116         struct request_sense sense;
3117         cdrom_read_toc(info->drive, &sense);
3118         return  0;
3119 }
3120
3121 static struct block_device_operations idecd_ops = {
3122         .owner          = THIS_MODULE,
3123         .open           = idecd_open,
3124         .release        = idecd_release,
3125         .ioctl          = idecd_ioctl,
3126         .media_changed  = idecd_media_changed,
3127         .revalidate_disk= idecd_revalidate_disk
3128 };
3129
3130 /* options */
3131 static char *ignore = NULL;
3132
3133 module_param(ignore, charp, 0400);
3134 MODULE_DESCRIPTION("ATAPI CD-ROM Driver");
3135
3136 static int ide_cd_probe(ide_drive_t *drive)
3137 {
3138         struct cdrom_info *info;
3139         struct gendisk *g;
3140         struct request_sense sense;
3141
3142         if (!strstr("ide-cdrom", drive->driver_req))
3143                 goto failed;
3144         if (!drive->present)
3145                 goto failed;
3146         if (drive->media != ide_cdrom && drive->media != ide_optical)
3147                 goto failed;
3148         /* skip drives that we were told to ignore */
3149         if (ignore != NULL) {
3150                 if (strstr(ignore, drive->name)) {
3151                         printk(KERN_INFO "ide-cd: ignoring drive %s\n", drive->name);
3152                         goto failed;
3153                 }
3154         }
3155         if (drive->scsi) {
3156                 printk(KERN_INFO "ide-cd: passing drive %s to ide-scsi emulation.\n", drive->name);
3157                 goto failed;
3158         }
3159         info = kzalloc(sizeof(struct cdrom_info), GFP_KERNEL);
3160         if (info == NULL) {
3161                 printk(KERN_ERR "%s: Can't allocate a cdrom structure\n", drive->name);
3162                 goto failed;
3163         }
3164
3165         g = alloc_disk(1 << PARTN_BITS);
3166         if (!g)
3167                 goto out_free_cd;
3168
3169         ide_init_disk(g, drive);
3170
3171         ide_proc_register_driver(drive, &ide_cdrom_driver);
3172
3173         kref_init(&info->kref);
3174
3175         info->drive = drive;
3176         info->driver = &ide_cdrom_driver;
3177         info->disk = g;
3178
3179         g->private_data = &info->driver;
3180
3181         drive->driver_data = info;
3182
3183         g->minors = 1;
3184         g->driverfs_dev = &drive->gendev;
3185         g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE;
3186         if (ide_cdrom_setup(drive)) {
3187                 ide_proc_unregister_driver(drive, &ide_cdrom_driver);
3188                 ide_cd_release(&info->kref);
3189                 goto failed;
3190         }
3191
3192         cdrom_read_toc(drive, &sense);
3193         g->fops = &idecd_ops;
3194         g->flags |= GENHD_FL_REMOVABLE;
3195         add_disk(g);
3196         return 0;
3197
3198 out_free_cd:
3199         kfree(info);
3200 failed:
3201         return -ENODEV;
3202 }
3203
3204 static void __exit ide_cdrom_exit(void)
3205 {
3206         driver_unregister(&ide_cdrom_driver.gen_driver);
3207 }
3208
3209 static int __init ide_cdrom_init(void)
3210 {
3211         return driver_register(&ide_cdrom_driver.gen_driver);
3212 }
3213
3214 MODULE_ALIAS("ide:*m-cdrom*");
3215 module_init(ide_cdrom_init);
3216 module_exit(ide_cdrom_exit);
3217 MODULE_LICENSE("GPL");