ide-cd.c revision 20e7f7efa3da3678c65cea45903260dfabb8264c
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
60static 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
67static 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
79static void ide_cd_release(struct kref *);
80
81static 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. */
94static void cdrom_saw_media_change (ide_drive_t *drive)
95{
96	struct cdrom_info *info = drive->driver_data;
97
98	CDROM_STATE_FLAGS (drive)->media_changed = 1;
99	CDROM_STATE_FLAGS (drive)->toc_valid = 0;
100	info->nsectors_buffered = 0;
101}
102
103static int cdrom_log_sense(ide_drive_t *drive, struct request *rq,
104			   struct request_sense *sense)
105{
106	int log = 0;
107
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
148static
149void 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 */
328static void cdrom_prepare_request(ide_drive_t *drive, struct request *rq)
329{
330	struct cdrom_info *cd = drive->driver_data;
331
332	ide_init_drive_cmd(rq);
333	rq->cmd_type = REQ_TYPE_ATA_PC;
334	rq->rq_disk = cd->disk;
335}
336
337static void cdrom_queue_request_sense(ide_drive_t *drive, void *sense,
338				      struct request *failed_command)
339{
340	struct cdrom_info *info		= drive->driver_data;
341	struct request *rq		= &info->request_sense_request;
342
343	if (sense == NULL)
344		sense = &info->sense_data;
345
346	/* stuff the sense request in front of our current request */
347	cdrom_prepare_request(drive, rq);
348
349	rq->data = sense;
350	rq->cmd[0] = GPCMD_REQUEST_SENSE;
351	rq->cmd[4] = rq->data_len = 18;
352
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
361static void cdrom_end_request (ide_drive_t *drive, int uptodate)
362{
363	struct request *rq = HWGROUP(drive)->rq;
364	int nsectors = rq->hard_cur_sectors;
365
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
411static void ide_dump_status_no_sense(ide_drive_t *drive, const char *msg, u8 stat)
412{
413	if (stat & 0x80)
414		return;
415	ide_dump_status(drive, msg, stat);
416}
417
418/* Returns 0 if the request should be continued.
419   Returns 1 if the request was ended. */
420static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
421{
422	struct request *rq = HWGROUP(drive)->rq;
423	int stat, err, sense_key;
424
425	/* Check for errors. */
426	stat = HWIF(drive)->INB(IDE_STATUS_REG);
427	if (stat_ret)
428		*stat_ret = stat;
429
430	if (OK_STAT(stat, good_stat, BAD_R_STAT))
431		return 0;
432
433	/* Get the IDE error register. */
434	err = HWIF(drive)->INB(IDE_ERROR_REG);
435	sense_key = err >> 4;
436
437	if (rq == NULL) {
438		printk("%s: missing rq in cdrom_decode_status\n", drive->name);
439		return 1;
440	}
441
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
606static int cdrom_timer_expiry(ide_drive_t *drive)
607{
608	struct request *rq = HWGROUP(drive)->rq;
609	unsigned long wait = 0;
610
611	/*
612	 * Some commands are *slow* and normally take a long time to
613	 * complete. Usually we can use the ATAPI "disconnect" to bypass
614	 * this, but not all commands/drives support that. Let
615	 * ide_timer_expiry keep polling us for these.
616	 */
617	switch (rq->cmd[0]) {
618		case GPCMD_BLANK:
619		case GPCMD_FORMAT_UNIT:
620		case GPCMD_RESERVE_RZONE_TRACK:
621		case GPCMD_CLOSE_TRACK:
622		case GPCMD_FLUSH_CACHE:
623			wait = ATAPI_WAIT_PC;
624			break;
625		default:
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
641static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive,
642						  int xferlen,
643						  ide_handler_t *handler)
644{
645	ide_startstop_t startstop;
646	struct cdrom_info *info = drive->driver_data;
647	ide_hwif_t *hwif = drive->hwif;
648
649	/* Wait for the controller to be idle. */
650	if (ide_wait_stat(&startstop, drive, 0, BUSY_STAT, WAIT_READY))
651		return startstop;
652
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 (CDROM_CONFIG_FLAGS (drive)->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
688static ide_startstop_t cdrom_transfer_packet_command (ide_drive_t *drive,
689					  struct request *rq,
690					  ide_handler_t *handler)
691{
692	ide_hwif_t *hwif = drive->hwif;
693	int cmd_len;
694	struct cdrom_info *info = drive->driver_data;
695	ide_startstop_t startstop;
696
697	if (CDROM_CONFIG_FLAGS(drive)->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
737typedef void (xfer_func_t)(ide_drive_t *, void *, u32);
738
739static void ide_cd_pad_transfer(ide_drive_t *drive, xfer_func_t *xf, int len)
740{
741	while (len > 0) {
742		int dum = 0;
743		xf(drive, &dum, sizeof(dum));
744		len -= sizeof(dum);
745	}
746}
747
748/*
749 * Buffer up to SECTORS_TO_TRANSFER sectors from the drive in our sector
750 * buffer.  Once the first sector is added, any subsequent sectors are
751 * assumed to be continuous (until the buffer is cleared).  For the first
752 * sector added, SECTOR is its sector number.  (SECTOR is then ignored until
753 * the buffer is cleared.)
754 */
755static void cdrom_buffer_sectors (ide_drive_t *drive, unsigned long sector,
756                                  int sectors_to_transfer)
757{
758	struct cdrom_info *info = drive->driver_data;
759
760	/* Number of sectors to read into the buffer. */
761	int sectors_to_buffer = min_t(int, sectors_to_transfer,
762				     (SECTOR_BUFFER_SIZE >> SECTOR_BITS) -
763				       info->nsectors_buffered);
764
765	char *dest;
766
767	/* If we couldn't get a buffer, don't try to buffer anything... */
768	if (info->buffer == NULL)
769		sectors_to_buffer = 0;
770
771	/* If this is the first sector in the buffer, remember its number. */
772	if (info->nsectors_buffered == 0)
773		info->sector_buffered = sector;
774
775	/* Read the data into the buffer. */
776	dest = info->buffer + info->nsectors_buffered * SECTOR_SIZE;
777	while (sectors_to_buffer > 0) {
778		HWIF(drive)->atapi_input_bytes(drive, dest, SECTOR_SIZE);
779		--sectors_to_buffer;
780		--sectors_to_transfer;
781		++info->nsectors_buffered;
782		dest += SECTOR_SIZE;
783	}
784
785	/* Throw away any remaining data. */
786	while (sectors_to_transfer > 0) {
787		static char dum[SECTOR_SIZE];
788		HWIF(drive)->atapi_input_bytes(drive, dum, sizeof (dum));
789		--sectors_to_transfer;
790	}
791}
792
793/*
794 * Check the contents of the interrupt reason register from the cdrom
795 * and attempt to recover if there are problems.  Returns  0 if everything's
796 * ok; nonzero if the request has been terminated.
797 */
798static
799int cdrom_read_check_ireason (ide_drive_t *drive, int len, int ireason)
800{
801	if (ireason == 2)
802		return 0;
803	else if (ireason == 0) {
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 */
832static ide_startstop_t cdrom_read_intr (ide_drive_t *drive)
833{
834	int stat;
835	int ireason, len, sectors_to_transfer, nskip;
836	struct cdrom_info *info = drive->driver_data;
837	u8 lowcyl = 0, highcyl = 0;
838	int dma = info->dma, dma_error = 0;
839
840	struct request *rq = HWGROUP(drive)->rq;
841
842	/*
843	 * handle dma case
844	 */
845	if (dma) {
846		info->dma = 0;
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 (CDROM_CONFIG_FLAGS(drive)->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			CDROM_CONFIG_FLAGS(drive)->limit_nframes = 1;
901		}
902		cdrom_end_request(drive, 0);
903		return ide_stopped;
904	}
905
906	/* The number of sectors we need to read from the drive. */
907	sectors_to_transfer = len / SECTOR_SIZE;
908
909	/* First, figure out if we need to bit-bucket
910	   any of the leading sectors. */
911	nskip = min_t(int, rq->current_nr_sectors - bio_cur_sectors(rq->bio), sectors_to_transfer);
912
913	while (nskip > 0) {
914		/* We need to throw away a sector. */
915		static char dum[SECTOR_SIZE];
916		HWIF(drive)->atapi_input_bytes(drive, dum, sizeof (dum));
917
918		--rq->current_nr_sectors;
919		--nskip;
920		--sectors_to_transfer;
921	}
922
923	/* Now loop while we still have data to read from the drive. */
924	while (sectors_to_transfer > 0) {
925		int this_transfer;
926
927		/* If we've filled the present buffer but there's another
928		   chained buffer after it, move on. */
929		if (rq->current_nr_sectors == 0 && rq->nr_sectors)
930			cdrom_end_request(drive, 1);
931
932		/* If the buffers are full, cache the rest of the data in our
933		   internal buffer. */
934		if (rq->current_nr_sectors == 0) {
935			cdrom_buffer_sectors(drive, rq->sector, sectors_to_transfer);
936			sectors_to_transfer = 0;
937		} else {
938			/* Transfer data to the buffers.
939			   Figure out how many sectors we can transfer
940			   to the current buffer. */
941			this_transfer = min_t(int, sectors_to_transfer,
942					     rq->current_nr_sectors);
943
944			/* Read this_transfer sectors
945			   into the current buffer. */
946			while (this_transfer > 0) {
947				HWIF(drive)->atapi_input_bytes(drive, rq->buffer, SECTOR_SIZE);
948				rq->buffer += SECTOR_SIZE;
949				--rq->nr_sectors;
950				--rq->current_nr_sectors;
951				++rq->sector;
952				--this_transfer;
953				--sectors_to_transfer;
954			}
955		}
956	}
957
958	/* Done moving data!  Wait for another interrupt. */
959	ide_set_handler(drive, &cdrom_read_intr, ATAPI_WAIT_PC, NULL);
960	return ide_started;
961}
962
963/*
964 * Try to satisfy some of the current read request from our cached data.
965 * Returns nonzero if the request has been completed, zero otherwise.
966 */
967static int cdrom_read_from_buffer (ide_drive_t *drive)
968{
969	struct cdrom_info *info = drive->driver_data;
970	struct request *rq = HWGROUP(drive)->rq;
971	unsigned short sectors_per_frame;
972
973	sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS;
974
975	/* Can't do anything if there's no buffer. */
976	if (info->buffer == NULL) return 0;
977
978	/* Loop while this request needs data and the next block is present
979	   in our cache. */
980	while (rq->nr_sectors > 0 &&
981	       rq->sector >= info->sector_buffered &&
982	       rq->sector < info->sector_buffered + info->nsectors_buffered) {
983		if (rq->current_nr_sectors == 0)
984			cdrom_end_request(drive, 1);
985
986		memcpy (rq->buffer,
987			info->buffer +
988			(rq->sector - info->sector_buffered) * SECTOR_SIZE,
989			SECTOR_SIZE);
990		rq->buffer += SECTOR_SIZE;
991		--rq->current_nr_sectors;
992		--rq->nr_sectors;
993		++rq->sector;
994	}
995
996	/* If we've satisfied the current request,
997	   terminate it successfully. */
998	if (rq->nr_sectors == 0) {
999		cdrom_end_request(drive, 1);
1000		return -1;
1001	}
1002
1003	/* Move on to the next buffer if needed. */
1004	if (rq->current_nr_sectors == 0)
1005		cdrom_end_request(drive, 1);
1006
1007	/* If this condition does not hold, then the kluge i use to
1008	   represent the number of sectors to skip at the start of a transfer
1009	   will fail.  I think that this will never happen, but let's be
1010	   paranoid and check. */
1011	if (rq->current_nr_sectors < bio_cur_sectors(rq->bio) &&
1012	    (rq->sector & (sectors_per_frame - 1))) {
1013		printk(KERN_ERR "%s: cdrom_read_from_buffer: buffer botch (%ld)\n",
1014			drive->name, (long)rq->sector);
1015		cdrom_end_request(drive, 0);
1016		return -1;
1017	}
1018
1019	return 0;
1020}
1021
1022/*
1023 * Routine to send a read packet command to the drive.
1024 * This is usually called directly from cdrom_start_read.
1025 * However, for drq_interrupt devices, it is called from an interrupt
1026 * when the drive is ready to accept the command.
1027 */
1028static ide_startstop_t cdrom_start_read_continuation (ide_drive_t *drive)
1029{
1030	struct request *rq = HWGROUP(drive)->rq;
1031	unsigned short sectors_per_frame;
1032	int nskip;
1033
1034	sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS;
1035
1036	/* If the requested sector doesn't start on a cdrom block boundary,
1037	   we must adjust the start of the transfer so that it does,
1038	   and remember to skip the first few sectors.
1039	   If the CURRENT_NR_SECTORS field is larger than the size
1040	   of the buffer, it will mean that we're to skip a number
1041	   of sectors equal to the amount by which CURRENT_NR_SECTORS
1042	   is larger than the buffer size. */
1043	nskip = rq->sector & (sectors_per_frame - 1);
1044	if (nskip > 0) {
1045		/* Sanity check... */
1046		if (rq->current_nr_sectors != bio_cur_sectors(rq->bio) &&
1047			(rq->sector & (sectors_per_frame - 1))) {
1048			printk(KERN_ERR "%s: cdrom_start_read_continuation: buffer botch (%u)\n",
1049				drive->name, rq->current_nr_sectors);
1050			cdrom_end_request(drive, 0);
1051			return ide_stopped;
1052		}
1053		rq->current_nr_sectors += nskip;
1054	}
1055
1056	/* Set up the command */
1057	rq->timeout = ATAPI_WAIT_PC;
1058
1059	/* Send the command to the drive and return. */
1060	return cdrom_transfer_packet_command(drive, rq, &cdrom_read_intr);
1061}
1062
1063
1064#define IDECD_SEEK_THRESHOLD	(1000)			/* 1000 blocks */
1065#define IDECD_SEEK_TIMER	(5 * WAIT_MIN_SLEEP)	/* 100 ms */
1066#define IDECD_SEEK_TIMEOUT	(2 * WAIT_CMD)		/* 20 sec */
1067
1068static ide_startstop_t cdrom_seek_intr (ide_drive_t *drive)
1069{
1070	struct cdrom_info *info = drive->driver_data;
1071	int stat;
1072	static int retry = 10;
1073
1074	if (cdrom_decode_status(drive, 0, &stat))
1075		return ide_stopped;
1076	CDROM_CONFIG_FLAGS(drive)->seeking = 1;
1077
1078	if (retry && time_after(jiffies, info->start_seek + IDECD_SEEK_TIMER)) {
1079		if (--retry == 0) {
1080			/*
1081			 * this condition is far too common, to bother
1082			 * users about it
1083			 */
1084			/* printk("%s: disabled DSC seek overlap\n", drive->name);*/
1085			drive->dsc_overlap = 0;
1086		}
1087	}
1088	return ide_stopped;
1089}
1090
1091static ide_startstop_t cdrom_start_seek_continuation (ide_drive_t *drive)
1092{
1093	struct request *rq = HWGROUP(drive)->rq;
1094	sector_t frame = rq->sector;
1095
1096	sector_div(frame, queue_hardsect_size(drive->queue) >> SECTOR_BITS);
1097
1098	memset(rq->cmd, 0, sizeof(rq->cmd));
1099	rq->cmd[0] = GPCMD_SEEK;
1100	put_unaligned(cpu_to_be32(frame), (unsigned int *) &rq->cmd[2]);
1101
1102	rq->timeout = ATAPI_WAIT_PC;
1103	return cdrom_transfer_packet_command(drive, rq, &cdrom_seek_intr);
1104}
1105
1106static ide_startstop_t cdrom_start_seek (ide_drive_t *drive, unsigned int block)
1107{
1108	struct cdrom_info *info = drive->driver_data;
1109
1110	info->dma = 0;
1111	info->start_seek = jiffies;
1112	return cdrom_start_packet_command(drive, 0, cdrom_start_seek_continuation);
1113}
1114
1115/* Fix up a possibly partially-processed request so that we can
1116   start it over entirely, or even put it back on the request queue. */
1117static void restore_request (struct request *rq)
1118{
1119	if (rq->buffer != bio_data(rq->bio)) {
1120		sector_t n = (rq->buffer - (char *) bio_data(rq->bio)) / SECTOR_SIZE;
1121
1122		rq->buffer = bio_data(rq->bio);
1123		rq->nr_sectors += n;
1124		rq->sector -= n;
1125	}
1126	rq->hard_cur_sectors = rq->current_nr_sectors = bio_cur_sectors(rq->bio);
1127	rq->hard_nr_sectors = rq->nr_sectors;
1128	rq->hard_sector = rq->sector;
1129	rq->q->prep_rq_fn(rq->q, rq);
1130}
1131
1132/*
1133 * Start a read request from the CD-ROM.
1134 */
1135static ide_startstop_t cdrom_start_read (ide_drive_t *drive, unsigned int block)
1136{
1137	struct cdrom_info *info = drive->driver_data;
1138	struct request *rq = HWGROUP(drive)->rq;
1139	unsigned short sectors_per_frame;
1140
1141	sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS;
1142
1143	/* We may be retrying this request after an error.  Fix up
1144	   any weirdness which might be present in the request packet. */
1145	restore_request(rq);
1146
1147	/* Satisfy whatever we can of this request from our cached sector. */
1148	if (cdrom_read_from_buffer(drive))
1149		return ide_stopped;
1150
1151	/* Clear the local sector buffer. */
1152	info->nsectors_buffered = 0;
1153
1154	/* use dma, if possible. */
1155	info->dma = drive->using_dma;
1156	if ((rq->sector & (sectors_per_frame - 1)) ||
1157	    (rq->nr_sectors & (sectors_per_frame - 1)))
1158		info->dma = 0;
1159
1160	/* Start sending the read request to the drive. */
1161	return cdrom_start_packet_command(drive, 32768, cdrom_start_read_continuation);
1162}
1163
1164/****************************************************************************
1165 * Execute all other packet commands.
1166 */
1167
1168/* Interrupt routine for packet command completion. */
1169static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive)
1170{
1171	struct request *rq = HWGROUP(drive)->rq;
1172	xfer_func_t *xferfunc = NULL;
1173	int stat, ireason, len, thislen, write;
1174	u8 lowcyl = 0, highcyl = 0;
1175
1176	/* Check for errors. */
1177	if (cdrom_decode_status(drive, 0, &stat))
1178		return ide_stopped;
1179
1180	/* Read the interrupt reason and the transfer length. */
1181	ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3;
1182	lowcyl  = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1183	highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1184
1185	len = lowcyl + (256 * highcyl);
1186
1187	/* If DRQ is clear, the command has completed.
1188	   Complain if we still have data left to transfer. */
1189	if ((stat & DRQ_STAT) == 0) {
1190		/* Some of the trailing request sense fields are optional, and
1191		   some drives don't send them.  Sigh. */
1192		if (rq->cmd[0] == GPCMD_REQUEST_SENSE &&
1193		    rq->data_len > 0 &&
1194		    rq->data_len <= 5) {
1195			while (rq->data_len > 0) {
1196				*(unsigned char *)rq->data++ = 0;
1197				--rq->data_len;
1198			}
1199		}
1200
1201		if (rq->data_len == 0)
1202			cdrom_end_request(drive, 1);
1203		else {
1204			rq->cmd_flags |= REQ_FAILED;
1205			cdrom_end_request(drive, 0);
1206		}
1207		return ide_stopped;
1208	}
1209
1210	/* Figure out how much data to transfer. */
1211	thislen = rq->data_len;
1212	if (thislen > len)
1213		thislen = len;
1214
1215	if (ireason == 0) {
1216		write = 1;
1217		xferfunc = HWIF(drive)->atapi_output_bytes;
1218	} else if (ireason == 2) {
1219		write = 0;
1220		xferfunc = HWIF(drive)->atapi_input_bytes;
1221	}
1222
1223	if (xferfunc) {
1224		if (!rq->data) {
1225			printk(KERN_ERR "%s: confused, missing data\n",
1226					drive->name);
1227			blk_dump_rq_flags(rq, write ? "cdrom_pc_intr, write"
1228						    : "cdrom_pc_intr, read");
1229			goto pad;
1230		}
1231		/* Transfer the data. */
1232		xferfunc(drive, rq->data, thislen);
1233
1234		/* Keep count of how much data we've moved. */
1235		len -= thislen;
1236		rq->data += thislen;
1237		rq->data_len -= thislen;
1238
1239		if (write && blk_sense_request(rq))
1240			rq->sense_len += thislen;
1241	} else {
1242		printk (KERN_ERR "%s: cdrom_pc_intr: The drive "
1243			"appears confused (ireason = 0x%02x). "
1244			"Trying to recover by ending request.\n",
1245			drive->name, ireason);
1246		rq->cmd_flags |= REQ_FAILED;
1247		cdrom_end_request(drive, 0);
1248		return ide_stopped;
1249	}
1250pad:
1251	/*
1252	 * If we haven't moved enough data to satisfy the drive,
1253	 * add some padding.
1254	 */
1255	if (len > 0)
1256		ide_cd_pad_transfer(drive, xferfunc, len);
1257
1258	/* Now we wait for another interrupt. */
1259	ide_set_handler(drive, &cdrom_pc_intr, ATAPI_WAIT_PC, cdrom_timer_expiry);
1260	return ide_started;
1261}
1262
1263static ide_startstop_t cdrom_do_pc_continuation (ide_drive_t *drive)
1264{
1265	struct request *rq = HWGROUP(drive)->rq;
1266
1267	if (!rq->timeout)
1268		rq->timeout = ATAPI_WAIT_PC;
1269
1270	/* Send the command to the drive and return. */
1271	return cdrom_transfer_packet_command(drive, rq, &cdrom_pc_intr);
1272}
1273
1274
1275static ide_startstop_t cdrom_do_packet_command (ide_drive_t *drive)
1276{
1277	int len;
1278	struct request *rq = HWGROUP(drive)->rq;
1279	struct cdrom_info *info = drive->driver_data;
1280
1281	info->dma = 0;
1282	rq->cmd_flags &= ~REQ_FAILED;
1283	len = rq->data_len;
1284
1285	/* Start sending the command to the drive. */
1286	return cdrom_start_packet_command(drive, len, cdrom_do_pc_continuation);
1287}
1288
1289
1290static int cdrom_queue_packet_command(ide_drive_t *drive, struct request *rq)
1291{
1292	struct request_sense sense;
1293	int retries = 10;
1294	unsigned int flags = rq->cmd_flags;
1295
1296	if (rq->sense == NULL)
1297		rq->sense = &sense;
1298
1299	/* Start of retry loop. */
1300	do {
1301		int error;
1302		unsigned long time = jiffies;
1303		rq->cmd_flags = flags;
1304
1305		error = ide_do_drive_cmd(drive, rq, ide_wait);
1306		time = jiffies - time;
1307
1308		/* FIXME: we should probably abort/retry or something
1309		 * in case of failure */
1310		if (rq->cmd_flags & REQ_FAILED) {
1311			/* The request failed.  Retry if it was due to a unit
1312			   attention status
1313			   (usually means media was changed). */
1314			struct request_sense *reqbuf = rq->sense;
1315
1316			if (reqbuf->sense_key == UNIT_ATTENTION)
1317				cdrom_saw_media_change(drive);
1318			else if (reqbuf->sense_key == NOT_READY &&
1319				 reqbuf->asc == 4 && reqbuf->ascq != 4) {
1320				/* The drive is in the process of loading
1321				   a disk.  Retry, but wait a little to give
1322				   the drive time to complete the load. */
1323				ssleep(2);
1324			} else {
1325				/* Otherwise, don't retry. */
1326				retries = 0;
1327			}
1328			--retries;
1329		}
1330
1331		/* End of retry loop. */
1332	} while ((rq->cmd_flags & REQ_FAILED) && retries >= 0);
1333
1334	/* Return an error if the command failed. */
1335	return (rq->cmd_flags & REQ_FAILED) ? -EIO : 0;
1336}
1337
1338/*
1339 * Write handling
1340 */
1341static int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason)
1342{
1343	/* Two notes about IDE interrupt reason here - 0 means that
1344	 * the drive wants to receive data from us, 2 means that
1345	 * the drive is expecting to transfer data to us.
1346	 */
1347	if (ireason == 0)
1348		return 0;
1349	else if (ireason == 2) {
1350		ide_hwif_t *hwif = drive->hwif;
1351
1352		/* Whoops... The drive wants to send data. */
1353		printk(KERN_ERR "%s: %s: wrong transfer direction!\n",
1354				drive->name, __FUNCTION__);
1355
1356		ide_cd_pad_transfer(drive, hwif->atapi_input_bytes, len);
1357	} else {
1358		/* Drive wants a command packet, or invalid ireason... */
1359		printk(KERN_ERR "%s: %s: bad interrupt reason 0x%02x\n",
1360				drive->name, __FUNCTION__, ireason);
1361	}
1362
1363	cdrom_end_request(drive, 0);
1364	return 1;
1365}
1366
1367/*
1368 * Called from blk_end_request_callback() after the data of the request
1369 * is completed and before the request is completed.
1370 * By returning value '1', blk_end_request_callback() returns immediately
1371 * without completing the request.
1372 */
1373static int cdrom_newpc_intr_dummy_cb(struct request *rq)
1374{
1375	return 1;
1376}
1377
1378/*
1379 * best way to deal with dma that is not sector aligned right now... note
1380 * that in this path we are not using ->data or ->buffer at all. this irs
1381 * can replace cdrom_pc_intr, cdrom_read_intr, and cdrom_write_intr in the
1382 * future.
1383 */
1384static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
1385{
1386	struct cdrom_info *info = drive->driver_data;
1387	struct request *rq = HWGROUP(drive)->rq;
1388	int dma_error, dma, stat, ireason, len, thislen;
1389	u8 lowcyl, highcyl;
1390	xfer_func_t *xferfunc;
1391	unsigned long flags;
1392
1393	/* Check for errors. */
1394	dma_error = 0;
1395	dma = info->dma;
1396	if (dma) {
1397		info->dma = 0;
1398		dma_error = HWIF(drive)->ide_dma_end(drive);
1399		if (dma_error) {
1400			printk(KERN_ERR "%s: DMA %s error\n", drive->name,
1401					rq_data_dir(rq) ? "write" : "read");
1402			ide_dma_off(drive);
1403		}
1404	}
1405
1406	if (cdrom_decode_status(drive, 0, &stat))
1407		return ide_stopped;
1408
1409	/*
1410	 * using dma, transfer is complete now
1411	 */
1412	if (dma) {
1413		if (dma_error)
1414			return ide_error(drive, "dma error", stat);
1415
1416		spin_lock_irqsave(&ide_lock, flags);
1417		if (__blk_end_request(rq, 0, rq->data_len))
1418			BUG();
1419		HWGROUP(drive)->rq = NULL;
1420		spin_unlock_irqrestore(&ide_lock, flags);
1421
1422		return ide_stopped;
1423	}
1424
1425	/*
1426	 * ok we fall to pio :/
1427	 */
1428	ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3;
1429	lowcyl  = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1430	highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1431
1432	len = lowcyl + (256 * highcyl);
1433	thislen = rq->data_len;
1434	if (thislen > len)
1435		thislen = len;
1436
1437	/*
1438	 * If DRQ is clear, the command has completed.
1439	 */
1440	if ((stat & DRQ_STAT) == 0) {
1441		spin_lock_irqsave(&ide_lock, flags);
1442		if (__blk_end_request(rq, 0, rq->data_len))
1443			BUG();
1444		HWGROUP(drive)->rq = NULL;
1445		spin_unlock_irqrestore(&ide_lock, flags);
1446
1447		return ide_stopped;
1448	}
1449
1450	/*
1451	 * check which way to transfer data
1452	 */
1453	if (rq_data_dir(rq) == WRITE) {
1454		/*
1455		 * write to drive
1456		 */
1457		if (cdrom_write_check_ireason(drive, len, ireason))
1458			return ide_stopped;
1459
1460		xferfunc = HWIF(drive)->atapi_output_bytes;
1461	} else  {
1462		/*
1463		 * read from drive
1464		 */
1465		if (cdrom_read_check_ireason(drive, len, ireason))
1466			return ide_stopped;
1467
1468		xferfunc = HWIF(drive)->atapi_input_bytes;
1469	}
1470
1471	/*
1472	 * transfer data
1473	 */
1474	while (thislen > 0) {
1475		int blen = blen = rq->data_len;
1476		char *ptr = rq->data;
1477
1478		/*
1479		 * bio backed?
1480		 */
1481		if (rq->bio) {
1482			ptr = bio_data(rq->bio);
1483			blen = bio_iovec(rq->bio)->bv_len;
1484		}
1485
1486		if (!ptr) {
1487			printk(KERN_ERR "%s: confused, missing data\n", drive->name);
1488			break;
1489		}
1490
1491		if (blen > thislen)
1492			blen = thislen;
1493
1494		xferfunc(drive, ptr, blen);
1495
1496		thislen -= blen;
1497		len -= blen;
1498		rq->data_len -= blen;
1499
1500		if (rq->bio)
1501			/*
1502			 * The request can't be completed until DRQ is cleared.
1503			 * So complete the data, but don't complete the request
1504			 * using the dummy function for the callback feature
1505			 * of blk_end_request_callback().
1506			 */
1507			blk_end_request_callback(rq, 0, blen,
1508						 cdrom_newpc_intr_dummy_cb);
1509		else
1510			rq->data += blen;
1511	}
1512
1513	/*
1514	 * pad, if necessary
1515	 */
1516	if (len > 0)
1517		ide_cd_pad_transfer(drive, xferfunc, len);
1518
1519	BUG_ON(HWGROUP(drive)->handler != NULL);
1520
1521	ide_set_handler(drive, cdrom_newpc_intr, rq->timeout, NULL);
1522	return ide_started;
1523}
1524
1525static ide_startstop_t cdrom_write_intr(ide_drive_t *drive)
1526{
1527	int stat, ireason, len, sectors_to_transfer, uptodate;
1528	struct cdrom_info *info = drive->driver_data;
1529	int dma_error = 0, dma = info->dma;
1530	u8 lowcyl = 0, highcyl = 0;
1531
1532	struct request *rq = HWGROUP(drive)->rq;
1533
1534	/* Check for errors. */
1535	if (dma) {
1536		info->dma = 0;
1537		dma_error = HWIF(drive)->ide_dma_end(drive);
1538		if (dma_error) {
1539			printk(KERN_ERR "%s: DMA write error\n", drive->name);
1540			ide_dma_off(drive);
1541		}
1542	}
1543
1544	if (cdrom_decode_status(drive, 0, &stat))
1545		return ide_stopped;
1546
1547	/*
1548	 * using dma, transfer is complete now
1549	 */
1550	if (dma) {
1551		if (dma_error)
1552			return ide_error(drive, "dma error", stat);
1553
1554		ide_end_request(drive, 1, rq->nr_sectors);
1555		return ide_stopped;
1556	}
1557
1558	/* Read the interrupt reason and the transfer length. */
1559	ireason = HWIF(drive)->INB(IDE_IREASON_REG) & 0x3;
1560	lowcyl  = HWIF(drive)->INB(IDE_BCOUNTL_REG);
1561	highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);
1562
1563	len = lowcyl + (256 * highcyl);
1564
1565	/* If DRQ is clear, the command has completed. */
1566	if ((stat & DRQ_STAT) == 0) {
1567		/* If we're not done writing, complain.
1568		 * Otherwise, complete the command normally.
1569		 */
1570		uptodate = 1;
1571		if (rq->current_nr_sectors > 0) {
1572			printk(KERN_ERR "%s: %s: data underrun (%d blocks)\n",
1573					drive->name, __FUNCTION__,
1574					rq->current_nr_sectors);
1575			uptodate = 0;
1576		}
1577		cdrom_end_request(drive, uptodate);
1578		return ide_stopped;
1579	}
1580
1581	/* Check that the drive is expecting to do the same thing we are. */
1582	if (cdrom_write_check_ireason(drive, len, ireason))
1583		return ide_stopped;
1584
1585	sectors_to_transfer = len / SECTOR_SIZE;
1586
1587	/*
1588	 * now loop and write out the data
1589	 */
1590	while (sectors_to_transfer > 0) {
1591		int this_transfer;
1592
1593		if (!rq->current_nr_sectors) {
1594			printk(KERN_ERR "%s: %s: confused, missing data\n",
1595					drive->name, __FUNCTION__);
1596			break;
1597		}
1598
1599		/*
1600		 * Figure out how many sectors we can transfer
1601		 */
1602		this_transfer = min_t(int, sectors_to_transfer, rq->current_nr_sectors);
1603
1604		while (this_transfer > 0) {
1605			HWIF(drive)->atapi_output_bytes(drive, rq->buffer, SECTOR_SIZE);
1606			rq->buffer += SECTOR_SIZE;
1607			--rq->nr_sectors;
1608			--rq->current_nr_sectors;
1609			++rq->sector;
1610			--this_transfer;
1611			--sectors_to_transfer;
1612		}
1613
1614		/*
1615		 * current buffer complete, move on
1616		 */
1617		if (rq->current_nr_sectors == 0 && rq->nr_sectors)
1618			cdrom_end_request(drive, 1);
1619	}
1620
1621	/* re-arm handler */
1622	ide_set_handler(drive, &cdrom_write_intr, ATAPI_WAIT_PC, NULL);
1623	return ide_started;
1624}
1625
1626static ide_startstop_t cdrom_start_write_cont(ide_drive_t *drive)
1627{
1628	struct request *rq = HWGROUP(drive)->rq;
1629
1630#if 0	/* the immediate bit */
1631	rq->cmd[1] = 1 << 3;
1632#endif
1633	rq->timeout = ATAPI_WAIT_PC;
1634
1635	return cdrom_transfer_packet_command(drive, rq, cdrom_write_intr);
1636}
1637
1638static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq)
1639{
1640	struct cdrom_info *info = drive->driver_data;
1641	struct gendisk *g = info->disk;
1642	unsigned short sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS;
1643
1644	/*
1645	 * writes *must* be hardware frame aligned
1646	 */
1647	if ((rq->nr_sectors & (sectors_per_frame - 1)) ||
1648	    (rq->sector & (sectors_per_frame - 1))) {
1649		cdrom_end_request(drive, 0);
1650		return ide_stopped;
1651	}
1652
1653	/*
1654	 * disk has become write protected
1655	 */
1656	if (g->policy) {
1657		cdrom_end_request(drive, 0);
1658		return ide_stopped;
1659	}
1660
1661	info->nsectors_buffered = 0;
1662
1663	/* use dma, if possible. we don't need to check more, since we
1664	 * know that the transfer is always (at least!) frame aligned */
1665	info->dma = drive->using_dma ? 1 : 0;
1666
1667	info->devinfo.media_written = 1;
1668
1669	/* Start sending the write request to the drive. */
1670	return cdrom_start_packet_command(drive, 32768, cdrom_start_write_cont);
1671}
1672
1673static ide_startstop_t cdrom_do_newpc_cont(ide_drive_t *drive)
1674{
1675	struct request *rq = HWGROUP(drive)->rq;
1676
1677	if (!rq->timeout)
1678		rq->timeout = ATAPI_WAIT_PC;
1679
1680	return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr);
1681}
1682
1683static ide_startstop_t cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
1684{
1685	struct cdrom_info *info = drive->driver_data;
1686
1687	rq->cmd_flags |= REQ_QUIET;
1688
1689	info->dma = 0;
1690
1691	/*
1692	 * sg request
1693	 */
1694	if (rq->bio) {
1695		int mask = drive->queue->dma_alignment;
1696		unsigned long addr = (unsigned long) page_address(bio_page(rq->bio));
1697
1698		info->dma = drive->using_dma;
1699
1700		/*
1701		 * check if dma is safe
1702		 *
1703		 * NOTE! The "len" and "addr" checks should possibly have
1704		 * separate masks.
1705		 */
1706		if ((rq->data_len & 15) || (addr & mask))
1707			info->dma = 0;
1708	}
1709
1710	/* Start sending the command to the drive. */
1711	return cdrom_start_packet_command(drive, rq->data_len, cdrom_do_newpc_cont);
1712}
1713
1714/****************************************************************************
1715 * cdrom driver request routine.
1716 */
1717static ide_startstop_t
1718ide_do_rw_cdrom (ide_drive_t *drive, struct request *rq, sector_t block)
1719{
1720	ide_startstop_t action;
1721	struct cdrom_info *info = drive->driver_data;
1722
1723	if (blk_fs_request(rq)) {
1724		if (CDROM_CONFIG_FLAGS(drive)->seeking) {
1725			unsigned long elapsed = jiffies - info->start_seek;
1726			int stat = HWIF(drive)->INB(IDE_STATUS_REG);
1727
1728			if ((stat & SEEK_STAT) != SEEK_STAT) {
1729				if (elapsed < IDECD_SEEK_TIMEOUT) {
1730					ide_stall_queue(drive, IDECD_SEEK_TIMER);
1731					return ide_stopped;
1732				}
1733				printk (KERN_ERR "%s: DSC timeout\n", drive->name);
1734			}
1735			CDROM_CONFIG_FLAGS(drive)->seeking = 0;
1736		}
1737		if ((rq_data_dir(rq) == READ) && IDE_LARGE_SEEK(info->last_block, block, IDECD_SEEK_THRESHOLD) && drive->dsc_overlap) {
1738			action = cdrom_start_seek(drive, block);
1739		} else {
1740			if (rq_data_dir(rq) == READ)
1741				action = cdrom_start_read(drive, block);
1742			else
1743				action = cdrom_start_write(drive, rq);
1744		}
1745		info->last_block = block;
1746		return action;
1747	} else if (rq->cmd_type == REQ_TYPE_SENSE ||
1748		   rq->cmd_type == REQ_TYPE_ATA_PC) {
1749		return cdrom_do_packet_command(drive);
1750	} else if (blk_pc_request(rq)) {
1751		return cdrom_do_block_pc(drive, rq);
1752	} else if (blk_special_request(rq)) {
1753		/*
1754		 * right now this can only be a reset...
1755		 */
1756		cdrom_end_request(drive, 1);
1757		return ide_stopped;
1758	}
1759
1760	blk_dump_rq_flags(rq, "ide-cd bad flags");
1761	cdrom_end_request(drive, 0);
1762	return ide_stopped;
1763}
1764
1765
1766
1767/****************************************************************************
1768 * Ioctl handling.
1769 *
1770 * Routines which queue packet commands take as a final argument a pointer
1771 * to a request_sense struct.  If execution of the command results
1772 * in an error with a CHECK CONDITION status, this structure will be filled
1773 * with the results of the subsequent request sense command.  The pointer
1774 * can also be NULL, in which case no sense information is returned.
1775 */
1776
1777#if ! STANDARD_ATAPI
1778static inline
1779int bin2bcd (int x)
1780{
1781	return (x%10) | ((x/10) << 4);
1782}
1783
1784
1785static inline
1786int bcd2bin (int x)
1787{
1788	return (x >> 4) * 10 + (x & 0x0f);
1789}
1790
1791static
1792void msf_from_bcd (struct atapi_msf *msf)
1793{
1794	msf->minute = bcd2bin (msf->minute);
1795	msf->second = bcd2bin (msf->second);
1796	msf->frame  = bcd2bin (msf->frame);
1797}
1798
1799#endif /* not STANDARD_ATAPI */
1800
1801
1802static inline
1803void lba_to_msf (int lba, byte *m, byte *s, byte *f)
1804{
1805	lba += CD_MSF_OFFSET;
1806	lba &= 0xffffff;  /* negative lbas use only 24 bits */
1807	*m = lba / (CD_SECS * CD_FRAMES);
1808	lba %= (CD_SECS * CD_FRAMES);
1809	*s = lba / CD_FRAMES;
1810	*f = lba % CD_FRAMES;
1811}
1812
1813
1814static inline
1815int msf_to_lba (byte m, byte s, byte f)
1816{
1817	return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;
1818}
1819
1820static int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense)
1821{
1822	struct request req;
1823	struct cdrom_info *info = drive->driver_data;
1824	struct cdrom_device_info *cdi = &info->devinfo;
1825
1826	cdrom_prepare_request(drive, &req);
1827
1828	req.sense = sense;
1829	req.cmd[0] = GPCMD_TEST_UNIT_READY;
1830	req.cmd_flags |= REQ_QUIET;
1831
1832#if ! STANDARD_ATAPI
1833        /* the Sanyo 3 CD changer uses byte 7 of TEST_UNIT_READY to
1834           switch CDs instead of supporting the LOAD_UNLOAD opcode   */
1835
1836	req.cmd[7] = cdi->sanyo_slot % 3;
1837#endif /* not STANDARD_ATAPI */
1838
1839	return cdrom_queue_packet_command(drive, &req);
1840}
1841
1842
1843/* Lock the door if LOCKFLAG is nonzero; unlock it otherwise. */
1844static int
1845cdrom_lockdoor(ide_drive_t *drive, int lockflag, struct request_sense *sense)
1846{
1847	struct request_sense my_sense;
1848	struct request req;
1849	int stat;
1850
1851	if (sense == NULL)
1852		sense = &my_sense;
1853
1854	/* If the drive cannot lock the door, just pretend. */
1855	if (CDROM_CONFIG_FLAGS(drive)->no_doorlock) {
1856		stat = 0;
1857	} else {
1858		cdrom_prepare_request(drive, &req);
1859		req.sense = sense;
1860		req.cmd[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
1861		req.cmd[4] = lockflag ? 1 : 0;
1862		stat = cdrom_queue_packet_command(drive, &req);
1863	}
1864
1865	/* If we got an illegal field error, the drive
1866	   probably cannot lock the door. */
1867	if (stat != 0 &&
1868	    sense->sense_key == ILLEGAL_REQUEST &&
1869	    (sense->asc == 0x24 || sense->asc == 0x20)) {
1870		printk (KERN_ERR "%s: door locking not supported\n",
1871			drive->name);
1872		CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
1873		stat = 0;
1874	}
1875
1876	/* no medium, that's alright. */
1877	if (stat != 0 && sense->sense_key == NOT_READY && sense->asc == 0x3a)
1878		stat = 0;
1879
1880	if (stat == 0)
1881		CDROM_STATE_FLAGS(drive)->door_locked = lockflag;
1882
1883	return stat;
1884}
1885
1886
1887/* Eject the disk if EJECTFLAG is 0.
1888   If EJECTFLAG is 1, try to reload the disk. */
1889static int cdrom_eject(ide_drive_t *drive, int ejectflag,
1890		       struct request_sense *sense)
1891{
1892	struct request req;
1893	char loej = 0x02;
1894
1895	if (CDROM_CONFIG_FLAGS(drive)->no_eject && !ejectflag)
1896		return -EDRIVE_CANT_DO_THIS;
1897
1898	/* reload fails on some drives, if the tray is locked */
1899	if (CDROM_STATE_FLAGS(drive)->door_locked && ejectflag)
1900		return 0;
1901
1902	cdrom_prepare_request(drive, &req);
1903
1904	/* only tell drive to close tray if open, if it can do that */
1905	if (ejectflag && !CDROM_CONFIG_FLAGS(drive)->close_tray)
1906		loej = 0;
1907
1908	req.sense = sense;
1909	req.cmd[0] = GPCMD_START_STOP_UNIT;
1910	req.cmd[4] = loej | (ejectflag != 0);
1911	return cdrom_queue_packet_command(drive, &req);
1912}
1913
1914static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity,
1915			       unsigned long *sectors_per_frame,
1916			       struct request_sense *sense)
1917{
1918	struct {
1919		__u32 lba;
1920		__u32 blocklen;
1921	} capbuf;
1922
1923	int stat;
1924	struct request req;
1925
1926	cdrom_prepare_request(drive, &req);
1927
1928	req.sense = sense;
1929	req.cmd[0] = GPCMD_READ_CDVD_CAPACITY;
1930	req.data = (char *)&capbuf;
1931	req.data_len = sizeof(capbuf);
1932	req.cmd_flags |= REQ_QUIET;
1933
1934	stat = cdrom_queue_packet_command(drive, &req);
1935	if (stat == 0) {
1936		*capacity = 1 + be32_to_cpu(capbuf.lba);
1937		*sectors_per_frame =
1938			be32_to_cpu(capbuf.blocklen) >> SECTOR_BITS;
1939	}
1940
1941	return stat;
1942}
1943
1944static int cdrom_read_tocentry(ide_drive_t *drive, int trackno, int msf_flag,
1945				int format, char *buf, int buflen,
1946				struct request_sense *sense)
1947{
1948	struct request req;
1949
1950	cdrom_prepare_request(drive, &req);
1951
1952	req.sense = sense;
1953	req.data =  buf;
1954	req.data_len = buflen;
1955	req.cmd_flags |= REQ_QUIET;
1956	req.cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
1957	req.cmd[6] = trackno;
1958	req.cmd[7] = (buflen >> 8);
1959	req.cmd[8] = (buflen & 0xff);
1960	req.cmd[9] = (format << 6);
1961
1962	if (msf_flag)
1963		req.cmd[1] = 2;
1964
1965	return cdrom_queue_packet_command(drive, &req);
1966}
1967
1968
1969/* Try to read the entire TOC for the disk into our internal buffer. */
1970static int cdrom_read_toc(ide_drive_t *drive, struct request_sense *sense)
1971{
1972	int stat, ntracks, i;
1973	struct cdrom_info *info = drive->driver_data;
1974	struct cdrom_device_info *cdi = &info->devinfo;
1975	struct atapi_toc *toc = info->toc;
1976	struct {
1977		struct atapi_toc_header hdr;
1978		struct atapi_toc_entry  ent;
1979	} ms_tmp;
1980	long last_written;
1981	unsigned long sectors_per_frame = SECTORS_PER_FRAME;
1982
1983	if (toc == NULL) {
1984		/* Try to allocate space. */
1985		toc = kmalloc(sizeof(struct atapi_toc), GFP_KERNEL);
1986		if (toc == NULL) {
1987			printk (KERN_ERR "%s: No cdrom TOC buffer!\n", drive->name);
1988			return -ENOMEM;
1989		}
1990		info->toc = toc;
1991	}
1992
1993	/* Check to see if the existing data is still valid.
1994	   If it is, just return. */
1995	(void) cdrom_check_status(drive, sense);
1996
1997	if (CDROM_STATE_FLAGS(drive)->toc_valid)
1998		return 0;
1999
2000	/* Try to get the total cdrom capacity and sector size. */
2001	stat = cdrom_read_capacity(drive, &toc->capacity, &sectors_per_frame,
2002				   sense);
2003	if (stat)
2004		toc->capacity = 0x1fffff;
2005
2006	set_capacity(info->disk, toc->capacity * sectors_per_frame);
2007	/* Save a private copy of te TOC capacity for error handling */
2008	drive->probed_capacity = toc->capacity * sectors_per_frame;
2009
2010	blk_queue_hardsect_size(drive->queue,
2011				sectors_per_frame << SECTOR_BITS);
2012
2013	/* First read just the header, so we know how long the TOC is. */
2014	stat = cdrom_read_tocentry(drive, 0, 1, 0, (char *) &toc->hdr,
2015				    sizeof(struct atapi_toc_header), sense);
2016	if (stat)
2017		return stat;
2018
2019#if ! STANDARD_ATAPI
2020	if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd) {
2021		toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
2022		toc->hdr.last_track  = bcd2bin(toc->hdr.last_track);
2023	}
2024#endif  /* not STANDARD_ATAPI */
2025
2026	ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
2027	if (ntracks <= 0)
2028		return -EIO;
2029	if (ntracks > MAX_TRACKS)
2030		ntracks = MAX_TRACKS;
2031
2032	/* Now read the whole schmeer. */
2033	stat = cdrom_read_tocentry(drive, toc->hdr.first_track, 1, 0,
2034				  (char *)&toc->hdr,
2035				   sizeof(struct atapi_toc_header) +
2036				   (ntracks + 1) *
2037				   sizeof(struct atapi_toc_entry), sense);
2038
2039	if (stat && toc->hdr.first_track > 1) {
2040		/* Cds with CDI tracks only don't have any TOC entries,
2041		   despite of this the returned values are
2042		   first_track == last_track = number of CDI tracks + 1,
2043		   so that this case is indistinguishable from the same
2044		   layout plus an additional audio track.
2045		   If we get an error for the regular case, we assume
2046		   a CDI without additional audio tracks. In this case
2047		   the readable TOC is empty (CDI tracks are not included)
2048		   and only holds the Leadout entry. Heiko Eißfeldt */
2049		ntracks = 0;
2050		stat = cdrom_read_tocentry(drive, CDROM_LEADOUT, 1, 0,
2051					   (char *)&toc->hdr,
2052					   sizeof(struct atapi_toc_header) +
2053					   (ntracks + 1) *
2054					   sizeof(struct atapi_toc_entry),
2055					   sense);
2056		if (stat) {
2057			return stat;
2058		}
2059#if ! STANDARD_ATAPI
2060		if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd) {
2061			toc->hdr.first_track = bin2bcd(CDROM_LEADOUT);
2062			toc->hdr.last_track = bin2bcd(CDROM_LEADOUT);
2063		} else
2064#endif  /* not STANDARD_ATAPI */
2065		{
2066			toc->hdr.first_track = CDROM_LEADOUT;
2067			toc->hdr.last_track = CDROM_LEADOUT;
2068		}
2069	}
2070
2071	if (stat)
2072		return stat;
2073
2074	toc->hdr.toc_length = ntohs (toc->hdr.toc_length);
2075
2076#if ! STANDARD_ATAPI
2077	if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd) {
2078		toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
2079		toc->hdr.last_track  = bcd2bin(toc->hdr.last_track);
2080	}
2081#endif  /* not STANDARD_ATAPI */
2082
2083	for (i=0; i<=ntracks; i++) {
2084#if ! STANDARD_ATAPI
2085		if (CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd) {
2086			if (CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd)
2087				toc->ent[i].track = bcd2bin(toc->ent[i].track);
2088			msf_from_bcd(&toc->ent[i].addr.msf);
2089		}
2090#endif  /* not STANDARD_ATAPI */
2091		toc->ent[i].addr.lba = msf_to_lba (toc->ent[i].addr.msf.minute,
2092						   toc->ent[i].addr.msf.second,
2093						   toc->ent[i].addr.msf.frame);
2094	}
2095
2096	/* Read the multisession information. */
2097	if (toc->hdr.first_track != CDROM_LEADOUT) {
2098		/* Read the multisession information. */
2099		stat = cdrom_read_tocentry(drive, 0, 0, 1, (char *)&ms_tmp,
2100					   sizeof(ms_tmp), sense);
2101		if (stat)
2102			return stat;
2103
2104		toc->last_session_lba = be32_to_cpu(ms_tmp.ent.addr.lba);
2105	} else {
2106		ms_tmp.hdr.first_track = ms_tmp.hdr.last_track = CDROM_LEADOUT;
2107		toc->last_session_lba = msf_to_lba(0, 2, 0); /* 0m 2s 0f */
2108	}
2109
2110#if ! STANDARD_ATAPI
2111	if (CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd) {
2112		/* Re-read multisession information using MSF format */
2113		stat = cdrom_read_tocentry(drive, 0, 1, 1, (char *)&ms_tmp,
2114					   sizeof(ms_tmp), sense);
2115		if (stat)
2116			return stat;
2117
2118		msf_from_bcd (&ms_tmp.ent.addr.msf);
2119		toc->last_session_lba = msf_to_lba(ms_tmp.ent.addr.msf.minute,
2120					  	   ms_tmp.ent.addr.msf.second,
2121						   ms_tmp.ent.addr.msf.frame);
2122	}
2123#endif  /* not STANDARD_ATAPI */
2124
2125	toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track);
2126
2127	/* Now try to get the total cdrom capacity. */
2128	stat = cdrom_get_last_written(cdi, &last_written);
2129	if (!stat && (last_written > toc->capacity)) {
2130		toc->capacity = last_written;
2131		set_capacity(info->disk, toc->capacity * sectors_per_frame);
2132		drive->probed_capacity = toc->capacity * sectors_per_frame;
2133	}
2134
2135	/* Remember that we've read this stuff. */
2136	CDROM_STATE_FLAGS(drive)->toc_valid = 1;
2137
2138	return 0;
2139}
2140
2141
2142static int cdrom_read_subchannel(ide_drive_t *drive, int format, char *buf,
2143				 int buflen, struct request_sense *sense)
2144{
2145	struct request req;
2146
2147	cdrom_prepare_request(drive, &req);
2148
2149	req.sense = sense;
2150	req.data = buf;
2151	req.data_len = buflen;
2152	req.cmd[0] = GPCMD_READ_SUBCHANNEL;
2153	req.cmd[1] = 2;     /* MSF addressing */
2154	req.cmd[2] = 0x40;  /* request subQ data */
2155	req.cmd[3] = format;
2156	req.cmd[7] = (buflen >> 8);
2157	req.cmd[8] = (buflen & 0xff);
2158	return cdrom_queue_packet_command(drive, &req);
2159}
2160
2161/* ATAPI cdrom drives are free to select the speed you request or any slower
2162   rate :-( Requesting too fast a speed will _not_ produce an error. */
2163static int cdrom_select_speed(ide_drive_t *drive, int speed,
2164			      struct request_sense *sense)
2165{
2166	struct request req;
2167	cdrom_prepare_request(drive, &req);
2168
2169	req.sense = sense;
2170	if (speed == 0)
2171		speed = 0xffff; /* set to max */
2172	else
2173		speed *= 177;   /* Nx to kbytes/s */
2174
2175	req.cmd[0] = GPCMD_SET_SPEED;
2176	/* Read Drive speed in kbytes/second MSB */
2177	req.cmd[2] = (speed >> 8) & 0xff;
2178	/* Read Drive speed in kbytes/second LSB */
2179	req.cmd[3] = speed & 0xff;
2180	if (CDROM_CONFIG_FLAGS(drive)->cd_r ||
2181	    CDROM_CONFIG_FLAGS(drive)->cd_rw ||
2182	    CDROM_CONFIG_FLAGS(drive)->dvd_r) {
2183		/* Write Drive speed in kbytes/second MSB */
2184		req.cmd[4] = (speed >> 8) & 0xff;
2185		/* Write Drive speed in kbytes/second LSB */
2186		req.cmd[5] = speed & 0xff;
2187       }
2188
2189	return cdrom_queue_packet_command(drive, &req);
2190}
2191
2192static int cdrom_play_audio(ide_drive_t *drive, int lba_start, int lba_end)
2193{
2194	struct request_sense sense;
2195	struct request req;
2196
2197	cdrom_prepare_request(drive, &req);
2198
2199	req.sense = &sense;
2200	req.cmd[0] = GPCMD_PLAY_AUDIO_MSF;
2201	lba_to_msf(lba_start, &req.cmd[3], &req.cmd[4], &req.cmd[5]);
2202	lba_to_msf(lba_end-1, &req.cmd[6], &req.cmd[7], &req.cmd[8]);
2203
2204	return cdrom_queue_packet_command(drive, &req);
2205}
2206
2207static int cdrom_get_toc_entry(ide_drive_t *drive, int track,
2208				struct atapi_toc_entry **ent)
2209{
2210	struct cdrom_info *info = drive->driver_data;
2211	struct atapi_toc *toc = info->toc;
2212	int ntracks;
2213
2214	/*
2215	 * don't serve cached data, if the toc isn't valid
2216	 */
2217	if (!CDROM_STATE_FLAGS(drive)->toc_valid)
2218		return -EINVAL;
2219
2220	/* Check validity of requested track number. */
2221	ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
2222	if (toc->hdr.first_track == CDROM_LEADOUT) ntracks = 0;
2223	if (track == CDROM_LEADOUT)
2224		*ent = &toc->ent[ntracks];
2225	else if (track < toc->hdr.first_track ||
2226		 track > toc->hdr.last_track)
2227		return -EINVAL;
2228	else
2229		*ent = &toc->ent[track - toc->hdr.first_track];
2230
2231	return 0;
2232}
2233
2234/* the generic packet interface to cdrom.c */
2235static int ide_cdrom_packet(struct cdrom_device_info *cdi,
2236			    struct packet_command *cgc)
2237{
2238	struct request req;
2239	ide_drive_t *drive = cdi->handle;
2240
2241	if (cgc->timeout <= 0)
2242		cgc->timeout = ATAPI_WAIT_PC;
2243
2244	/* here we queue the commands from the uniform CD-ROM
2245	   layer. the packet must be complete, as we do not
2246	   touch it at all. */
2247	cdrom_prepare_request(drive, &req);
2248	memcpy(req.cmd, cgc->cmd, CDROM_PACKET_SIZE);
2249	if (cgc->sense)
2250		memset(cgc->sense, 0, sizeof(struct request_sense));
2251	req.data = cgc->buffer;
2252	req.data_len = cgc->buflen;
2253	req.timeout = cgc->timeout;
2254
2255	if (cgc->quiet)
2256		req.cmd_flags |= REQ_QUIET;
2257
2258	req.sense = cgc->sense;
2259	cgc->stat = cdrom_queue_packet_command(drive, &req);
2260	if (!cgc->stat)
2261		cgc->buflen -= req.data_len;
2262	return cgc->stat;
2263}
2264
2265static
2266int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi,
2267			   unsigned int cmd, void *arg)
2268
2269{
2270	ide_drive_t *drive = cdi->handle;
2271	struct cdrom_info *info = drive->driver_data;
2272	int stat;
2273
2274	switch (cmd) {
2275	/*
2276	 * emulate PLAY_AUDIO_TI command with PLAY_AUDIO_10, since
2277	 * atapi doesn't support it
2278	 */
2279	case CDROMPLAYTRKIND: {
2280		unsigned long lba_start, lba_end;
2281		struct cdrom_ti *ti = arg;
2282		struct atapi_toc_entry *first_toc, *last_toc;
2283
2284		stat = cdrom_get_toc_entry(drive, ti->cdti_trk0, &first_toc);
2285		if (stat)
2286			return stat;
2287
2288		stat = cdrom_get_toc_entry(drive, ti->cdti_trk1, &last_toc);
2289		if (stat)
2290			return stat;
2291
2292		if (ti->cdti_trk1 != CDROM_LEADOUT)
2293			++last_toc;
2294		lba_start = first_toc->addr.lba;
2295		lba_end   = last_toc->addr.lba;
2296
2297		if (lba_end <= lba_start)
2298			return -EINVAL;
2299
2300		return cdrom_play_audio(drive, lba_start, lba_end);
2301	}
2302
2303	case CDROMREADTOCHDR: {
2304		struct cdrom_tochdr *tochdr = arg;
2305		struct atapi_toc *toc;
2306
2307		/* Make sure our saved TOC is valid. */
2308		stat = cdrom_read_toc(drive, NULL);
2309		if (stat)
2310			return stat;
2311
2312		toc = info->toc;
2313		tochdr->cdth_trk0 = toc->hdr.first_track;
2314		tochdr->cdth_trk1 = toc->hdr.last_track;
2315
2316		return 0;
2317	}
2318
2319	case CDROMREADTOCENTRY: {
2320		struct cdrom_tocentry *tocentry = arg;
2321		struct atapi_toc_entry *toce;
2322
2323		stat = cdrom_get_toc_entry(drive, tocentry->cdte_track, &toce);
2324		if (stat)
2325			return stat;
2326
2327		tocentry->cdte_ctrl = toce->control;
2328		tocentry->cdte_adr  = toce->adr;
2329		if (tocentry->cdte_format == CDROM_MSF) {
2330			lba_to_msf (toce->addr.lba,
2331				   &tocentry->cdte_addr.msf.minute,
2332				   &tocentry->cdte_addr.msf.second,
2333				   &tocentry->cdte_addr.msf.frame);
2334		} else
2335			tocentry->cdte_addr.lba = toce->addr.lba;
2336
2337		return 0;
2338	}
2339
2340	default:
2341		return -EINVAL;
2342	}
2343}
2344
2345static
2346int ide_cdrom_reset (struct cdrom_device_info *cdi)
2347{
2348	ide_drive_t *drive = cdi->handle;
2349	struct request_sense sense;
2350	struct request req;
2351	int ret;
2352
2353	cdrom_prepare_request(drive, &req);
2354	req.cmd_type = REQ_TYPE_SPECIAL;
2355	req.cmd_flags = REQ_QUIET;
2356	ret = ide_do_drive_cmd(drive, &req, ide_wait);
2357
2358	/*
2359	 * A reset will unlock the door. If it was previously locked,
2360	 * lock it again.
2361	 */
2362	if (CDROM_STATE_FLAGS(drive)->door_locked)
2363		(void) cdrom_lockdoor(drive, 1, &sense);
2364
2365	return ret;
2366}
2367
2368
2369static
2370int ide_cdrom_tray_move (struct cdrom_device_info *cdi, int position)
2371{
2372	ide_drive_t *drive = cdi->handle;
2373	struct request_sense sense;
2374
2375	if (position) {
2376		int stat = cdrom_lockdoor(drive, 0, &sense);
2377		if (stat)
2378			return stat;
2379	}
2380
2381	return cdrom_eject(drive, !position, &sense);
2382}
2383
2384static
2385int ide_cdrom_lock_door (struct cdrom_device_info *cdi, int lock)
2386{
2387	ide_drive_t *drive = cdi->handle;
2388	return cdrom_lockdoor(drive, lock, NULL);
2389}
2390
2391static
2392int ide_cdrom_get_capabilities(ide_drive_t *drive, struct atapi_capabilities_page *cap)
2393{
2394	struct cdrom_info *info = drive->driver_data;
2395	struct cdrom_device_info *cdi = &info->devinfo;
2396	struct packet_command cgc;
2397	int stat, attempts = 3, size = sizeof(*cap);
2398
2399	/*
2400	 * ACER50 (and others?) require the full spec length mode sense
2401	 * page capabilities size, but older drives break.
2402	 */
2403	if (!(!strcmp(drive->id->model, "ATAPI CD ROM DRIVE 50X MAX") ||
2404	    !strcmp(drive->id->model, "WPI CDS-32X")))
2405		size -= sizeof(cap->pad);
2406
2407	init_cdrom_command(&cgc, cap, size, CGC_DATA_UNKNOWN);
2408	do { /* we seem to get stat=0x01,err=0x00 the first time (??) */
2409		stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
2410		if (!stat)
2411			break;
2412	} while (--attempts);
2413	return stat;
2414}
2415
2416static
2417void ide_cdrom_update_speed (ide_drive_t *drive, struct atapi_capabilities_page *cap)
2418{
2419	u16 curspeed, maxspeed;
2420
2421	/* The ACER/AOpen 24X cdrom has the speed fields byte-swapped */
2422	if (!drive->id->model[0] &&
2423	    !strncmp(drive->id->fw_rev, "241N", 4)) {
2424		curspeed = le16_to_cpu(cap->curspeed);
2425		maxspeed = le16_to_cpu(cap->maxspeed);
2426	} else {
2427		curspeed = be16_to_cpu(cap->curspeed);
2428		maxspeed = be16_to_cpu(cap->maxspeed);
2429	}
2430
2431	CDROM_STATE_FLAGS(drive)->current_speed = (curspeed + (176/2)) / 176;
2432	CDROM_CONFIG_FLAGS(drive)->max_speed = (maxspeed + (176/2)) / 176;
2433}
2434
2435static
2436int ide_cdrom_select_speed (struct cdrom_device_info *cdi, int speed)
2437{
2438	ide_drive_t *drive = cdi->handle;
2439	struct request_sense sense;
2440	struct atapi_capabilities_page cap;
2441	int stat;
2442
2443	if ((stat = cdrom_select_speed(drive, speed, &sense)) < 0)
2444		return stat;
2445
2446	if (!ide_cdrom_get_capabilities(drive, &cap)) {
2447		ide_cdrom_update_speed(drive, &cap);
2448		cdi->speed = CDROM_STATE_FLAGS(drive)->current_speed;
2449	}
2450        return 0;
2451}
2452
2453/*
2454 * add logic to try GET_EVENT command first to check for media and tray
2455 * status. this should be supported by newer cd-r/w and all DVD etc
2456 * drives
2457 */
2458static
2459int ide_cdrom_drive_status (struct cdrom_device_info *cdi, int slot_nr)
2460{
2461	ide_drive_t *drive = cdi->handle;
2462	struct media_event_desc med;
2463	struct request_sense sense;
2464	int stat;
2465
2466	if (slot_nr != CDSL_CURRENT)
2467		return -EINVAL;
2468
2469	stat = cdrom_check_status(drive, &sense);
2470	if (!stat || sense.sense_key == UNIT_ATTENTION)
2471		return CDS_DISC_OK;
2472
2473	if (!cdrom_get_media_event(cdi, &med)) {
2474		if (med.media_present)
2475			return CDS_DISC_OK;
2476		else if (med.door_open)
2477			return CDS_TRAY_OPEN;
2478		else
2479			return CDS_NO_DISC;
2480	}
2481
2482	if (sense.sense_key == NOT_READY && sense.asc == 0x04 && sense.ascq == 0x04)
2483		return CDS_DISC_OK;
2484
2485	/*
2486	 * If not using Mt Fuji extended media tray reports,
2487	 * just return TRAY_OPEN since ATAPI doesn't provide
2488	 * any other way to detect this...
2489	 */
2490	if (sense.sense_key == NOT_READY) {
2491		if (sense.asc == 0x3a && sense.ascq == 1)
2492			return CDS_NO_DISC;
2493		else
2494			return CDS_TRAY_OPEN;
2495	}
2496	return CDS_DRIVE_NOT_READY;
2497}
2498
2499static
2500int ide_cdrom_get_last_session (struct cdrom_device_info *cdi,
2501				struct cdrom_multisession *ms_info)
2502{
2503	struct atapi_toc *toc;
2504	ide_drive_t *drive = cdi->handle;
2505	struct cdrom_info *info = drive->driver_data;
2506	struct request_sense sense;
2507	int ret;
2508
2509	if (!CDROM_STATE_FLAGS(drive)->toc_valid || info->toc == NULL)
2510		if ((ret = cdrom_read_toc(drive, &sense)))
2511			return ret;
2512
2513	toc = info->toc;
2514	ms_info->addr.lba = toc->last_session_lba;
2515	ms_info->xa_flag = toc->xa_flag;
2516
2517	return 0;
2518}
2519
2520static
2521int ide_cdrom_get_mcn (struct cdrom_device_info *cdi,
2522		       struct cdrom_mcn *mcn_info)
2523{
2524	int stat;
2525	char mcnbuf[24];
2526	ide_drive_t *drive = cdi->handle;
2527
2528/* get MCN */
2529	if ((stat = cdrom_read_subchannel(drive, 2, mcnbuf, sizeof (mcnbuf), NULL)))
2530		return stat;
2531
2532	memcpy (mcn_info->medium_catalog_number, mcnbuf+9,
2533		sizeof (mcn_info->medium_catalog_number)-1);
2534	mcn_info->medium_catalog_number[sizeof (mcn_info->medium_catalog_number)-1]
2535		= '\0';
2536
2537	return 0;
2538}
2539
2540
2541
2542/****************************************************************************
2543 * Other driver requests (open, close, check media change).
2544 */
2545
2546static
2547int ide_cdrom_check_media_change_real (struct cdrom_device_info *cdi,
2548				       int slot_nr)
2549{
2550	ide_drive_t *drive = cdi->handle;
2551	int retval;
2552
2553	if (slot_nr == CDSL_CURRENT) {
2554		(void) cdrom_check_status(drive, NULL);
2555		retval = CDROM_STATE_FLAGS(drive)->media_changed;
2556		CDROM_STATE_FLAGS(drive)->media_changed = 0;
2557		return retval;
2558	} else {
2559		return -EINVAL;
2560	}
2561}
2562
2563
2564static
2565int ide_cdrom_open_real (struct cdrom_device_info *cdi, int purpose)
2566{
2567	return 0;
2568}
2569
2570/*
2571 * Close down the device.  Invalidate all cached blocks.
2572 */
2573
2574static
2575void ide_cdrom_release_real (struct cdrom_device_info *cdi)
2576{
2577	ide_drive_t *drive = cdi->handle;
2578
2579	if (!cdi->use_count)
2580		CDROM_STATE_FLAGS(drive)->toc_valid = 0;
2581}
2582
2583#define IDE_CD_CAPABILITIES \
2584	(CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK | CDC_SELECT_SPEED | \
2585	 CDC_SELECT_DISC | CDC_MULTI_SESSION | CDC_MCN | CDC_MEDIA_CHANGED | \
2586	 CDC_PLAY_AUDIO | CDC_RESET | CDC_DRIVE_STATUS | CDC_CD_R | \
2587	 CDC_CD_RW | CDC_DVD | CDC_DVD_R | CDC_DVD_RAM | CDC_GENERIC_PACKET | \
2588	 CDC_MO_DRIVE | CDC_MRW | CDC_MRW_W | CDC_RAM)
2589
2590static struct cdrom_device_ops ide_cdrom_dops = {
2591	.open			= ide_cdrom_open_real,
2592	.release		= ide_cdrom_release_real,
2593	.drive_status		= ide_cdrom_drive_status,
2594	.media_changed		= ide_cdrom_check_media_change_real,
2595	.tray_move		= ide_cdrom_tray_move,
2596	.lock_door		= ide_cdrom_lock_door,
2597	.select_speed		= ide_cdrom_select_speed,
2598	.get_last_session	= ide_cdrom_get_last_session,
2599	.get_mcn		= ide_cdrom_get_mcn,
2600	.reset			= ide_cdrom_reset,
2601	.audio_ioctl		= ide_cdrom_audio_ioctl,
2602	.capability		= IDE_CD_CAPABILITIES,
2603	.generic_packet		= ide_cdrom_packet,
2604};
2605
2606static int ide_cdrom_register (ide_drive_t *drive, int nslots)
2607{
2608	struct cdrom_info *info = drive->driver_data;
2609	struct cdrom_device_info *devinfo = &info->devinfo;
2610
2611	devinfo->ops = &ide_cdrom_dops;
2612	devinfo->mask = 0;
2613	devinfo->speed = CDROM_STATE_FLAGS(drive)->current_speed;
2614	devinfo->capacity = nslots;
2615	devinfo->handle = drive;
2616	strcpy(devinfo->name, drive->name);
2617
2618	/* set capability mask to match the probe. */
2619	if (!CDROM_CONFIG_FLAGS(drive)->cd_r)
2620		devinfo->mask |= CDC_CD_R;
2621	if (!CDROM_CONFIG_FLAGS(drive)->cd_rw)
2622		devinfo->mask |= CDC_CD_RW;
2623	if (!CDROM_CONFIG_FLAGS(drive)->dvd)
2624		devinfo->mask |= CDC_DVD;
2625	if (!CDROM_CONFIG_FLAGS(drive)->dvd_r)
2626		devinfo->mask |= CDC_DVD_R;
2627	if (!CDROM_CONFIG_FLAGS(drive)->dvd_ram)
2628		devinfo->mask |= CDC_DVD_RAM;
2629	if (!CDROM_CONFIG_FLAGS(drive)->is_changer)
2630		devinfo->mask |= CDC_SELECT_DISC;
2631	if (!CDROM_CONFIG_FLAGS(drive)->audio_play)
2632		devinfo->mask |= CDC_PLAY_AUDIO;
2633	if (!CDROM_CONFIG_FLAGS(drive)->close_tray)
2634		devinfo->mask |= CDC_CLOSE_TRAY;
2635	if (!CDROM_CONFIG_FLAGS(drive)->mo_drive)
2636		devinfo->mask |= CDC_MO_DRIVE;
2637	if (!CDROM_CONFIG_FLAGS(drive)->ram)
2638		devinfo->mask |= CDC_RAM;
2639
2640	if (CDROM_CONFIG_FLAGS(drive)->no_speed_select)
2641		devinfo->mask |= CDC_SELECT_SPEED;
2642
2643	devinfo->disk = info->disk;
2644	return register_cdrom(devinfo);
2645}
2646
2647static
2648int ide_cdrom_probe_capabilities (ide_drive_t *drive)
2649{
2650	struct cdrom_info *info = drive->driver_data;
2651	struct cdrom_device_info *cdi = &info->devinfo;
2652	struct atapi_capabilities_page cap;
2653	int nslots = 1;
2654
2655	if (drive->media == ide_optical) {
2656		CDROM_CONFIG_FLAGS(drive)->mo_drive = 1;
2657		CDROM_CONFIG_FLAGS(drive)->ram = 1;
2658		printk(KERN_ERR "%s: ATAPI magneto-optical drive\n", drive->name);
2659		return nslots;
2660	}
2661
2662	if (CDROM_CONFIG_FLAGS(drive)->nec260 ||
2663	    !strcmp(drive->id->model,"STINGRAY 8422 IDE 8X CD-ROM 7-27-95")) {
2664		CDROM_CONFIG_FLAGS(drive)->no_eject = 0;
2665		CDROM_CONFIG_FLAGS(drive)->audio_play = 1;
2666		return nslots;
2667	}
2668
2669	/*
2670	 * we have to cheat a little here. the packet will eventually
2671	 * be queued with ide_cdrom_packet(), which extracts the
2672	 * drive from cdi->handle. Since this device hasn't been
2673	 * registered with the Uniform layer yet, it can't do this.
2674	 * Same goes for cdi->ops.
2675	 */
2676	cdi->handle = drive;
2677	cdi->ops = &ide_cdrom_dops;
2678
2679	if (ide_cdrom_get_capabilities(drive, &cap))
2680		return 0;
2681
2682	if (cap.lock == 0)
2683		CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
2684	if (cap.eject)
2685		CDROM_CONFIG_FLAGS(drive)->no_eject = 0;
2686	if (cap.cd_r_write)
2687		CDROM_CONFIG_FLAGS(drive)->cd_r = 1;
2688	if (cap.cd_rw_write) {
2689		CDROM_CONFIG_FLAGS(drive)->cd_rw = 1;
2690		CDROM_CONFIG_FLAGS(drive)->ram = 1;
2691	}
2692	if (cap.dvd_ram_read || cap.dvd_r_read || cap.dvd_rom)
2693		CDROM_CONFIG_FLAGS(drive)->dvd = 1;
2694	if (cap.dvd_ram_write) {
2695		CDROM_CONFIG_FLAGS(drive)->dvd_ram = 1;
2696		CDROM_CONFIG_FLAGS(drive)->ram = 1;
2697	}
2698	if (cap.dvd_r_write)
2699		CDROM_CONFIG_FLAGS(drive)->dvd_r = 1;
2700	if (cap.audio_play)
2701		CDROM_CONFIG_FLAGS(drive)->audio_play = 1;
2702	if (cap.mechtype == mechtype_caddy || cap.mechtype == mechtype_popup)
2703		CDROM_CONFIG_FLAGS(drive)->close_tray = 0;
2704
2705	/* Some drives used by Apple don't advertise audio play
2706	 * but they do support reading TOC & audio datas
2707	 */
2708	if (strcmp(drive->id->model, "MATSHITADVD-ROM SR-8187") == 0 ||
2709	    strcmp(drive->id->model, "MATSHITADVD-ROM SR-8186") == 0 ||
2710	    strcmp(drive->id->model, "MATSHITADVD-ROM SR-8176") == 0 ||
2711	    strcmp(drive->id->model, "MATSHITADVD-ROM SR-8174") == 0)
2712		CDROM_CONFIG_FLAGS(drive)->audio_play = 1;
2713
2714#if ! STANDARD_ATAPI
2715	if (cdi->sanyo_slot > 0) {
2716		CDROM_CONFIG_FLAGS(drive)->is_changer = 1;
2717		nslots = 3;
2718	}
2719
2720	else
2721#endif /* not STANDARD_ATAPI */
2722	if (cap.mechtype == mechtype_individual_changer ||
2723	    cap.mechtype == mechtype_cartridge_changer) {
2724		nslots = cdrom_number_of_slots(cdi);
2725		if (nslots > 1)
2726			CDROM_CONFIG_FLAGS(drive)->is_changer = 1;
2727	}
2728
2729	ide_cdrom_update_speed(drive, &cap);
2730	/* don't print speed if the drive reported 0.
2731	 */
2732	printk(KERN_INFO "%s: ATAPI", drive->name);
2733	if (CDROM_CONFIG_FLAGS(drive)->max_speed)
2734		printk(" %dX", CDROM_CONFIG_FLAGS(drive)->max_speed);
2735	printk(" %s", CDROM_CONFIG_FLAGS(drive)->dvd ? "DVD-ROM" : "CD-ROM");
2736
2737	if (CDROM_CONFIG_FLAGS(drive)->dvd_r|CDROM_CONFIG_FLAGS(drive)->dvd_ram)
2738        	printk(" DVD%s%s",
2739        	(CDROM_CONFIG_FLAGS(drive)->dvd_r)? "-R" : "",
2740        	(CDROM_CONFIG_FLAGS(drive)->dvd_ram)? "-RAM" : "");
2741
2742        if (CDROM_CONFIG_FLAGS(drive)->cd_r|CDROM_CONFIG_FLAGS(drive)->cd_rw)
2743        	printk(" CD%s%s",
2744        	(CDROM_CONFIG_FLAGS(drive)->cd_r)? "-R" : "",
2745        	(CDROM_CONFIG_FLAGS(drive)->cd_rw)? "/RW" : "");
2746
2747        if (CDROM_CONFIG_FLAGS(drive)->is_changer)
2748        	printk(" changer w/%d slots", nslots);
2749        else
2750        	printk(" drive");
2751
2752	printk(KERN_CONT ", %dkB Cache\n", be16_to_cpu(cap.buffer_size));
2753
2754	return nslots;
2755}
2756
2757#ifdef CONFIG_IDE_PROC_FS
2758static void ide_cdrom_add_settings(ide_drive_t *drive)
2759{
2760	ide_add_setting(drive, "dsc_overlap", SETTING_RW, TYPE_BYTE, 0, 1, 1, 1, &drive->dsc_overlap, NULL);
2761}
2762#else
2763static inline void ide_cdrom_add_settings(ide_drive_t *drive) { ; }
2764#endif
2765
2766/*
2767 * standard prep_rq_fn that builds 10 byte cmds
2768 */
2769static int ide_cdrom_prep_fs(struct request_queue *q, struct request *rq)
2770{
2771	int hard_sect = queue_hardsect_size(q);
2772	long block = (long)rq->hard_sector / (hard_sect >> 9);
2773	unsigned long blocks = rq->hard_nr_sectors / (hard_sect >> 9);
2774
2775	memset(rq->cmd, 0, sizeof(rq->cmd));
2776
2777	if (rq_data_dir(rq) == READ)
2778		rq->cmd[0] = GPCMD_READ_10;
2779	else
2780		rq->cmd[0] = GPCMD_WRITE_10;
2781
2782	/*
2783	 * fill in lba
2784	 */
2785	rq->cmd[2] = (block >> 24) & 0xff;
2786	rq->cmd[3] = (block >> 16) & 0xff;
2787	rq->cmd[4] = (block >>  8) & 0xff;
2788	rq->cmd[5] = block & 0xff;
2789
2790	/*
2791	 * and transfer length
2792	 */
2793	rq->cmd[7] = (blocks >> 8) & 0xff;
2794	rq->cmd[8] = blocks & 0xff;
2795	rq->cmd_len = 10;
2796	return BLKPREP_OK;
2797}
2798
2799/*
2800 * Most of the SCSI commands are supported directly by ATAPI devices.
2801 * This transform handles the few exceptions.
2802 */
2803static int ide_cdrom_prep_pc(struct request *rq)
2804{
2805	u8 *c = rq->cmd;
2806
2807	/*
2808	 * Transform 6-byte read/write commands to the 10-byte version
2809	 */
2810	if (c[0] == READ_6 || c[0] == WRITE_6) {
2811		c[8] = c[4];
2812		c[5] = c[3];
2813		c[4] = c[2];
2814		c[3] = c[1] & 0x1f;
2815		c[2] = 0;
2816		c[1] &= 0xe0;
2817		c[0] += (READ_10 - READ_6);
2818		rq->cmd_len = 10;
2819		return BLKPREP_OK;
2820	}
2821
2822	/*
2823	 * it's silly to pretend we understand 6-byte sense commands, just
2824	 * reject with ILLEGAL_REQUEST and the caller should take the
2825	 * appropriate action
2826	 */
2827	if (c[0] == MODE_SENSE || c[0] == MODE_SELECT) {
2828		rq->errors = ILLEGAL_REQUEST;
2829		return BLKPREP_KILL;
2830	}
2831
2832	return BLKPREP_OK;
2833}
2834
2835static int ide_cdrom_prep_fn(struct request_queue *q, struct request *rq)
2836{
2837	if (blk_fs_request(rq))
2838		return ide_cdrom_prep_fs(q, rq);
2839	else if (blk_pc_request(rq))
2840		return ide_cdrom_prep_pc(rq);
2841
2842	return 0;
2843}
2844
2845static
2846int ide_cdrom_setup (ide_drive_t *drive)
2847{
2848	struct cdrom_info *info = drive->driver_data;
2849	struct cdrom_device_info *cdi = &info->devinfo;
2850	int nslots;
2851
2852	blk_queue_prep_rq(drive->queue, ide_cdrom_prep_fn);
2853	blk_queue_dma_alignment(drive->queue, 31);
2854	drive->queue->unplug_delay = (1 * HZ) / 1000;
2855	if (!drive->queue->unplug_delay)
2856		drive->queue->unplug_delay = 1;
2857
2858	drive->special.all	= 0;
2859
2860	CDROM_STATE_FLAGS(drive)->media_changed = 1;
2861
2862#if NO_DOOR_LOCKING
2863	CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;
2864#endif
2865	if ((drive->id->config & 0x0060) == 0x20)
2866		CDROM_CONFIG_FLAGS(drive)->drq_interrupt = 1;
2867	CDROM_CONFIG_FLAGS(drive)->no_eject = 1;
2868	CDROM_CONFIG_FLAGS(drive)->close_tray = 1;
2869
2870	/* limit transfer size per interrupt. */
2871	/* a testament to the nice quality of Samsung drives... */
2872	if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2430"))
2873		CDROM_CONFIG_FLAGS(drive)->limit_nframes = 1;
2874	else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2432"))
2875		CDROM_CONFIG_FLAGS(drive)->limit_nframes = 1;
2876	/* the 3231 model does not support the SET_CD_SPEED command */
2877	else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-3231"))
2878		CDROM_CONFIG_FLAGS(drive)->no_speed_select = 1;
2879
2880#if ! STANDARD_ATAPI
2881	if (strcmp (drive->id->model, "V003S0DS") == 0 &&
2882	    drive->id->fw_rev[4] == '1' &&
2883	    drive->id->fw_rev[6] <= '2') {
2884		/* Vertos 300.
2885		   Some versions of this drive like to talk BCD. */
2886		CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd = 1;
2887		CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd = 1;
2888	}
2889	else if (strcmp (drive->id->model, "V006E0DS") == 0 &&
2890	    drive->id->fw_rev[4] == '1' &&
2891	    drive->id->fw_rev[6] <= '2') {
2892		/* Vertos 600 ESD. */
2893		CDROM_CONFIG_FLAGS(drive)->toctracks_as_bcd = 1;
2894	}
2895	else if (strcmp(drive->id->model, "NEC CD-ROM DRIVE:260") == 0 &&
2896		 strncmp(drive->id->fw_rev, "1.01", 4) == 0) { /* FIXME */
2897		/* Old NEC260 (not R).
2898		   This drive was released before the 1.2 version
2899		   of the spec. */
2900		CDROM_CONFIG_FLAGS(drive)->tocaddr_as_bcd = 1;
2901		CDROM_CONFIG_FLAGS(drive)->nec260         = 1;
2902	}
2903	/*
2904	 * Sanyo 3 CD changer uses a non-standard command for CD changing
2905	 * (by default standard ATAPI support for CD changers is used).
2906	 */
2907        else if ((strcmp(drive->id->model, "CD-ROM CDR-C3 G") == 0) ||
2908                 (strcmp(drive->id->model, "CD-ROM CDR-C3G") == 0) ||
2909                 (strcmp(drive->id->model, "CD-ROM CDR_C36") == 0)) {
2910                 /* uses CD in slot 0 when value is set to 3 */
2911                 cdi->sanyo_slot = 3;
2912        }
2913#endif /* not STANDARD_ATAPI */
2914
2915	nslots = ide_cdrom_probe_capabilities (drive);
2916
2917	/*
2918	 * set correct block size
2919	 */
2920	blk_queue_hardsect_size(drive->queue, CD_FRAMESIZE);
2921
2922	if (drive->autotune == IDE_TUNE_DEFAULT ||
2923	    drive->autotune == IDE_TUNE_AUTO)
2924		drive->dsc_overlap = (drive->next != drive);
2925
2926	if (ide_cdrom_register(drive, nslots)) {
2927		printk (KERN_ERR "%s: ide_cdrom_setup failed to register device with the cdrom driver.\n", drive->name);
2928		info->devinfo.handle = NULL;
2929		return 1;
2930	}
2931	ide_cdrom_add_settings(drive);
2932	return 0;
2933}
2934
2935#ifdef CONFIG_IDE_PROC_FS
2936static
2937sector_t ide_cdrom_capacity (ide_drive_t *drive)
2938{
2939	unsigned long capacity, sectors_per_frame;
2940
2941	if (cdrom_read_capacity(drive, &capacity, &sectors_per_frame, NULL))
2942		return 0;
2943
2944	return capacity * sectors_per_frame;
2945}
2946#endif
2947
2948static void ide_cd_remove(ide_drive_t *drive)
2949{
2950	struct cdrom_info *info = drive->driver_data;
2951
2952	ide_proc_unregister_driver(drive, info->driver);
2953
2954	del_gendisk(info->disk);
2955
2956	ide_cd_put(info);
2957}
2958
2959static void ide_cd_release(struct kref *kref)
2960{
2961	struct cdrom_info *info = to_ide_cd(kref);
2962	struct cdrom_device_info *devinfo = &info->devinfo;
2963	ide_drive_t *drive = info->drive;
2964	struct gendisk *g = info->disk;
2965
2966	kfree(info->buffer);
2967	kfree(info->toc);
2968	if (devinfo->handle == drive && unregister_cdrom(devinfo))
2969		printk(KERN_ERR "%s: %s failed to unregister device from the cdrom "
2970				"driver.\n", __FUNCTION__, drive->name);
2971	drive->dsc_overlap = 0;
2972	drive->driver_data = NULL;
2973	blk_queue_prep_rq(drive->queue, NULL);
2974	g->private_data = NULL;
2975	put_disk(g);
2976	kfree(info);
2977}
2978
2979static int ide_cd_probe(ide_drive_t *);
2980
2981#ifdef CONFIG_IDE_PROC_FS
2982static int proc_idecd_read_capacity
2983	(char *page, char **start, off_t off, int count, int *eof, void *data)
2984{
2985	ide_drive_t *drive = data;
2986	int len;
2987
2988	len = sprintf(page,"%llu\n", (long long)ide_cdrom_capacity(drive));
2989	PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
2990}
2991
2992static ide_proc_entry_t idecd_proc[] = {
2993	{ "capacity", S_IFREG|S_IRUGO, proc_idecd_read_capacity, NULL },
2994	{ NULL, 0, NULL, NULL }
2995};
2996#endif
2997
2998static ide_driver_t ide_cdrom_driver = {
2999	.gen_driver = {
3000		.owner		= THIS_MODULE,
3001		.name		= "ide-cdrom",
3002		.bus		= &ide_bus_type,
3003	},
3004	.probe			= ide_cd_probe,
3005	.remove			= ide_cd_remove,
3006	.version		= IDECD_VERSION,
3007	.media			= ide_cdrom,
3008	.supports_dsc_overlap	= 1,
3009	.do_request		= ide_do_rw_cdrom,
3010	.end_request		= ide_end_request,
3011	.error			= __ide_error,
3012	.abort			= __ide_abort,
3013#ifdef CONFIG_IDE_PROC_FS
3014	.proc			= idecd_proc,
3015#endif
3016};
3017
3018static int idecd_open(struct inode * inode, struct file * file)
3019{
3020	struct gendisk *disk = inode->i_bdev->bd_disk;
3021	struct cdrom_info *info;
3022	int rc = -ENOMEM;
3023
3024	if (!(info = ide_cd_get(disk)))
3025		return -ENXIO;
3026
3027	if (!info->buffer)
3028		info->buffer = kmalloc(SECTOR_BUFFER_SIZE, GFP_KERNEL|__GFP_REPEAT);
3029
3030	if (info->buffer)
3031		rc = cdrom_open(&info->devinfo, inode, file);
3032
3033	if (rc < 0)
3034		ide_cd_put(info);
3035
3036	return rc;
3037}
3038
3039static int idecd_release(struct inode * inode, struct file * file)
3040{
3041	struct gendisk *disk = inode->i_bdev->bd_disk;
3042	struct cdrom_info *info = ide_cd_g(disk);
3043
3044	cdrom_release (&info->devinfo, file);
3045
3046	ide_cd_put(info);
3047
3048	return 0;
3049}
3050
3051static int idecd_set_spindown(struct cdrom_device_info *cdi, unsigned long arg)
3052{
3053	struct packet_command cgc;
3054	char buffer[16];
3055	int stat;
3056	char spindown;
3057
3058	if (copy_from_user(&spindown, (void __user *)arg, sizeof(char)))
3059		return -EFAULT;
3060
3061	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
3062
3063	stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0);
3064	if (stat)
3065		return stat;
3066
3067	buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f);
3068	return cdrom_mode_select(cdi, &cgc);
3069}
3070
3071static int idecd_get_spindown(struct cdrom_device_info *cdi, unsigned long arg)
3072{
3073	struct packet_command cgc;
3074	char buffer[16];
3075	int stat;
3076 	char spindown;
3077
3078	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);
3079
3080	stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0);
3081	if (stat)
3082		return stat;
3083
3084	spindown = buffer[11] & 0x0f;
3085	if (copy_to_user((void __user *)arg, &spindown, sizeof (char)))
3086		return -EFAULT;
3087	return 0;
3088}
3089
3090static int idecd_ioctl (struct inode *inode, struct file *file,
3091			unsigned int cmd, unsigned long arg)
3092{
3093	struct block_device *bdev = inode->i_bdev;
3094	struct cdrom_info *info = ide_cd_g(bdev->bd_disk);
3095	int err;
3096
3097	switch (cmd) {
3098 	case CDROMSETSPINDOWN:
3099		return idecd_set_spindown(&info->devinfo, arg);
3100 	case CDROMGETSPINDOWN:
3101		return idecd_get_spindown(&info->devinfo, arg);
3102	default:
3103		break;
3104 	}
3105
3106	err = generic_ide_ioctl(info->drive, file, bdev, cmd, arg);
3107	if (err == -EINVAL)
3108		err = cdrom_ioctl(file, &info->devinfo, inode, cmd, arg);
3109
3110	return err;
3111}
3112
3113static int idecd_media_changed(struct gendisk *disk)
3114{
3115	struct cdrom_info *info = ide_cd_g(disk);
3116	return cdrom_media_changed(&info->devinfo);
3117}
3118
3119static int idecd_revalidate_disk(struct gendisk *disk)
3120{
3121	struct cdrom_info *info = ide_cd_g(disk);
3122	struct request_sense sense;
3123	cdrom_read_toc(info->drive, &sense);
3124	return  0;
3125}
3126
3127static struct block_device_operations idecd_ops = {
3128	.owner		= THIS_MODULE,
3129	.open		= idecd_open,
3130	.release	= idecd_release,
3131	.ioctl		= idecd_ioctl,
3132	.media_changed	= idecd_media_changed,
3133	.revalidate_disk= idecd_revalidate_disk
3134};
3135
3136/* options */
3137static char *ignore = NULL;
3138
3139module_param(ignore, charp, 0400);
3140MODULE_DESCRIPTION("ATAPI CD-ROM Driver");
3141
3142static int ide_cd_probe(ide_drive_t *drive)
3143{
3144	struct cdrom_info *info;
3145	struct gendisk *g;
3146	struct request_sense sense;
3147
3148	if (!strstr("ide-cdrom", drive->driver_req))
3149		goto failed;
3150	if (!drive->present)
3151		goto failed;
3152	if (drive->media != ide_cdrom && drive->media != ide_optical)
3153		goto failed;
3154	/* skip drives that we were told to ignore */
3155	if (ignore != NULL) {
3156		if (strstr(ignore, drive->name)) {
3157			printk(KERN_INFO "ide-cd: ignoring drive %s\n", drive->name);
3158			goto failed;
3159		}
3160	}
3161	if (drive->scsi) {
3162		printk(KERN_INFO "ide-cd: passing drive %s to ide-scsi emulation.\n", drive->name);
3163		goto failed;
3164	}
3165	info = kzalloc(sizeof(struct cdrom_info), GFP_KERNEL);
3166	if (info == NULL) {
3167		printk(KERN_ERR "%s: Can't allocate a cdrom structure\n", drive->name);
3168		goto failed;
3169	}
3170
3171	g = alloc_disk(1 << PARTN_BITS);
3172	if (!g)
3173		goto out_free_cd;
3174
3175	ide_init_disk(g, drive);
3176
3177	ide_proc_register_driver(drive, &ide_cdrom_driver);
3178
3179	kref_init(&info->kref);
3180
3181	info->drive = drive;
3182	info->driver = &ide_cdrom_driver;
3183	info->disk = g;
3184
3185	g->private_data = &info->driver;
3186
3187	drive->driver_data = info;
3188
3189	g->minors = 1;
3190	g->driverfs_dev = &drive->gendev;
3191	g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE;
3192	if (ide_cdrom_setup(drive)) {
3193		ide_proc_unregister_driver(drive, &ide_cdrom_driver);
3194		ide_cd_release(&info->kref);
3195		goto failed;
3196	}
3197
3198	cdrom_read_toc(drive, &sense);
3199	g->fops = &idecd_ops;
3200	g->flags |= GENHD_FL_REMOVABLE;
3201	add_disk(g);
3202	return 0;
3203
3204out_free_cd:
3205	kfree(info);
3206failed:
3207	return -ENODEV;
3208}
3209
3210static void __exit ide_cdrom_exit(void)
3211{
3212	driver_unregister(&ide_cdrom_driver.gen_driver);
3213}
3214
3215static int __init ide_cdrom_init(void)
3216{
3217	return driver_register(&ide_cdrom_driver.gen_driver);
3218}
3219
3220MODULE_ALIAS("ide:*m-cdrom*");
3221module_init(ide_cdrom_init);
3222module_exit(ide_cdrom_exit);
3223MODULE_LICENSE("GPL");
3224