ide-cd.c 53.1 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2
 * ATAPI CD-ROM driver.
L
Linus Torvalds 已提交
3
 *
4 5 6 7
 * Copyright (C) 1994-1996   Scott Snyder <snyder@fnald0.fnal.gov>
 * Copyright (C) 1996-1998   Erik Andersen <andersee@debian.org>
 * Copyright (C) 1998-2000   Jens Axboe <axboe@suse.de>
 * Copyright (C) 2005, 2007  Bartlomiej Zolnierkiewicz
L
Linus Torvalds 已提交
8 9 10 11 12 13 14 15
 *
 * May be copied or modified under the terms of the GNU General Public
 * License.  See linux/COPYING for more information.
 *
 * See Documentation/cdrom/ide-cd for usage information.
 *
 * Suggestions are welcome. Patches that work are more welcome though. ;-)
 * For those wishing to work on this driver, please be sure you download
16 17
 * and comply with the latest Mt. Fuji (SFF8090 version 4) and ATAPI
 * (SFF-8020i rev 2.6) standards. These documents can be obtained by
L
Linus Torvalds 已提交
18 19 20 21
 * anonymous ftp from:
 * ftp://fission.dt.wdc.com/pub/standards/SFF_atapi/spec/SFF8020-r2.6/PS/8020r26.ps
 * ftp://ftp.avc-pioneer.com/Mtfuji4/Spec/Fuji4r10.pdf
 *
22 23 24 25
 * For historical changelog please see:
 *	Documentation/ide/ChangeLog.ide-cd.1994-2004
 */

26 27 28
#define DRV_NAME "ide-cd"
#define PFX DRV_NAME ": "

29
#define IDECD_VERSION "5.00"
L
Linus Torvalds 已提交
30 31 32 33 34 35 36 37 38 39 40 41

#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/timer.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/errno.h>
#include <linux/cdrom.h>
#include <linux/ide.h>
#include <linux/completion.h>
42
#include <linux/mutex.h>
43
#include <linux/bcd.h>
L
Linus Torvalds 已提交
44

B
Borislav Petkov 已提交
45 46
/* For SCSI -> ATAPI command conversion */
#include <scsi/scsi.h>
L
Linus Torvalds 已提交
47

B
Borislav Petkov 已提交
48 49
#include <linux/irq.h>
#include <linux/io.h>
L
Linus Torvalds 已提交
50
#include <asm/byteorder.h>
B
Borislav Petkov 已提交
51
#include <linux/uaccess.h>
L
Linus Torvalds 已提交
52 53 54 55
#include <asm/unaligned.h>

#include "ide-cd.h"

56
static DEFINE_MUTEX(idecd_ref_mutex);
L
Linus Torvalds 已提交
57

58
static void ide_cd_release(struct device *);
59

L
Linus Torvalds 已提交
60 61 62 63
static struct cdrom_info *ide_cd_get(struct gendisk *disk)
{
	struct cdrom_info *cd = NULL;

64
	mutex_lock(&idecd_ref_mutex);
B
Borislav Petkov 已提交
65
	cd = ide_drv_g(disk, cdrom_info);
66
	if (cd) {
67
		if (ide_device_get(cd->drive))
68
			cd = NULL;
69
		else
70
			get_device(&cd->dev);
71

72
	}
73
	mutex_unlock(&idecd_ref_mutex);
L
Linus Torvalds 已提交
74 75 76 77 78
	return cd;
}

static void ide_cd_put(struct cdrom_info *cd)
{
79 80
	ide_drive_t *drive = cd->drive;

81
	mutex_lock(&idecd_ref_mutex);
82
	put_device(&cd->dev);
83
	ide_device_put(drive);
84
	mutex_unlock(&idecd_ref_mutex);
L
Linus Torvalds 已提交
85 86
}

B
Borislav Petkov 已提交
87
/*
L
Linus Torvalds 已提交
88 89 90
 * Generic packet command support and error handling routines.
 */

B
Borislav Petkov 已提交
91
/* Mark that we've seen a media change and invalidate our internal buffers. */
92
static void cdrom_saw_media_change(ide_drive_t *drive)
L
Linus Torvalds 已提交
93
{
94
	drive->dev_flags |= IDE_DFLAG_MEDIA_CHANGED;
95
	drive->atapi_flags &= ~IDE_AFLAG_TOC_VALID;
L
Linus Torvalds 已提交
96 97 98 99 100 101 102
}

static int cdrom_log_sense(ide_drive_t *drive, struct request *rq,
			   struct request_sense *sense)
{
	int log = 0;

B
Borislav Petkov 已提交
103
	ide_debug_log(IDE_DBG_SENSE, "sense_key: 0x%x", sense->sense_key);
104

105
	if (!sense || !rq || (rq->cmd_flags & REQ_QUIET))
L
Linus Torvalds 已提交
106 107 108
		return 0;

	switch (sense->sense_key) {
109 110 111 112 113
	case NO_SENSE:
	case RECOVERED_ERROR:
		break;
	case NOT_READY:
		/*
B
Borislav Petkov 已提交
114 115
		 * don't care about tray state messages for e.g. capacity
		 * commands or in-progress or becoming ready
116 117
		 */
		if (sense->asc == 0x3a || sense->asc == 0x04)
L
Linus Torvalds 已提交
118
			break;
119 120 121 122
		log = 1;
		break;
	case ILLEGAL_REQUEST:
		/*
B
Borislav Petkov 已提交
123 124
		 * don't log START_STOP unit with LoEj set, since we cannot
		 * reliably check if drive can auto-close
125 126
		 */
		if (rq->cmd[0] == GPCMD_START_STOP_UNIT && sense->asc == 0x24)
L
Linus Torvalds 已提交
127
			break;
128 129 130 131
		log = 1;
		break;
	case UNIT_ATTENTION:
		/*
B
Borislav Petkov 已提交
132 133 134
		 * Make good and sure we've seen this potential media change.
		 * Some drives (i.e. Creative) fail to present the correct sense
		 * key in the error register.
135 136 137 138 139 140
		 */
		cdrom_saw_media_change(drive);
		break;
	default:
		log = 1;
		break;
L
Linus Torvalds 已提交
141 142 143 144
	}
	return log;
}

145
static void cdrom_analyze_sense_data(ide_drive_t *drive,
L
Linus Torvalds 已提交
146 147 148
			      struct request *failed_command,
			      struct request_sense *sense)
{
A
Alan Cox 已提交
149 150 151 152
	unsigned long sector;
	unsigned long bio_sectors;
	struct cdrom_info *info = drive->driver_data;

B
Borislav Petkov 已提交
153 154
	ide_debug_log(IDE_DBG_SENSE, "error_code: 0x%x, sense_key: 0x%x",
				     sense->error_code, sense->sense_key);
155 156

	if (failed_command)
B
Borislav Petkov 已提交
157 158
		ide_debug_log(IDE_DBG_SENSE, "failed cmd: 0x%x",
					     failed_command->cmd[0]);
159

L
Linus Torvalds 已提交
160 161 162 163
	if (!cdrom_log_sense(drive, failed_command, sense))
		return;

	/*
B
Borislav Petkov 已提交
164 165 166
	 * If a read toc is executed for a CD-R or CD-RW medium where the first
	 * toc has not been recorded yet, it will fail with 05/24/00 (which is a
	 * confusing error)
L
Linus Torvalds 已提交
167 168 169 170 171
	 */
	if (failed_command && failed_command->cmd[0] == GPCMD_READ_TOC_PMA_ATIP)
		if (sense->sense_key == 0x05 && sense->asc == 0x24)
			return;

B
Borislav Petkov 已提交
172 173
	/* current error */
	if (sense->error_code == 0x70) {
174
		switch (sense->sense_key) {
A
Alan Cox 已提交
175 176 177 178 179 180 181 182 183 184 185 186 187 188
		case MEDIUM_ERROR:
		case VOLUME_OVERFLOW:
		case ILLEGAL_REQUEST:
			if (!sense->valid)
				break;
			if (failed_command == NULL ||
					!blk_fs_request(failed_command))
				break;
			sector = (sense->information[0] << 24) |
				 (sense->information[1] << 16) |
				 (sense->information[2] <<  8) |
				 (sense->information[3]);

			if (drive->queue->hardsect_size == 2048)
B
Borislav Petkov 已提交
189 190
				/* device sector size is 2K */
				sector <<= 2;
191 192

			bio_sectors = max(bio_sectors(failed_command->bio), 4U);
193
			sector &= ~(bio_sectors - 1);
A
Alan Cox 已提交
194

195 196 197 198 199 200 201 202
			/*
			 * The SCSI specification allows for the value
			 * returned by READ CAPACITY to be up to 75 2K
			 * sectors past the last readable block.
			 * Therefore, if we hit a medium error within the
			 * last 75 2K sectors, we decrease the saved size
			 * value.
			 */
A
Alan Cox 已提交
203
			if (sector < get_capacity(info->disk) &&
204
			    drive->probed_capacity - sector < 4 * 75)
A
Alan Cox 已提交
205
				set_capacity(info->disk, sector);
206 207
		}
	}
L
Linus Torvalds 已提交
208

209
	ide_cd_log_error(drive->name, failed_command, sense);
L
Linus Torvalds 已提交
210 211 212 213 214 215
}

static void cdrom_queue_request_sense(ide_drive_t *drive, void *sense,
				      struct request *failed_command)
{
	struct cdrom_info *info		= drive->driver_data;
216
	struct request *rq		= &drive->request_sense_rq;
L
Linus Torvalds 已提交
217

B
Borislav Petkov 已提交
218
	ide_debug_log(IDE_DBG_SENSE, "enter");
219

L
Linus Torvalds 已提交
220 221 222 223
	if (sense == NULL)
		sense = &info->sense_data;

	/* stuff the sense request in front of our current request */
F
FUJITA Tomonori 已提交
224 225 226
	blk_rq_init(NULL, rq);
	rq->cmd_type = REQ_TYPE_ATA_PC;
	rq->rq_disk = info->disk;
L
Linus Torvalds 已提交
227 228 229

	rq->data = sense;
	rq->cmd[0] = GPCMD_REQUEST_SENSE;
230 231
	rq->cmd[4] = 18;
	rq->data_len = 18;
L
Linus Torvalds 已提交
232

233
	rq->cmd_type = REQ_TYPE_SENSE;
234
	rq->cmd_flags |= REQ_PREEMPT;
L
Linus Torvalds 已提交
235 236 237 238

	/* NOTE! Save the failed command in "rq->buffer" */
	rq->buffer = (void *) failed_command;

239
	if (failed_command)
B
Borislav Petkov 已提交
240 241
		ide_debug_log(IDE_DBG_SENSE, "failed_cmd: 0x%x",
					     failed_command->cmd[0]);
242

243 244 245
	drive->hwif->rq = NULL;

	elv_add_request(drive->queue, rq, ELEVATOR_INSERT_FRONT, 0);
L
Linus Torvalds 已提交
246 247
}

248
static void cdrom_end_request(ide_drive_t *drive, int uptodate)
L
Linus Torvalds 已提交
249
{
250
	struct request *rq = drive->hwif->rq;
L
Linus Torvalds 已提交
251 252
	int nsectors = rq->hard_cur_sectors;

B
Borislav Petkov 已提交
253 254
	ide_debug_log(IDE_DBG_FUNC, "cmd: 0x%x, uptodate: 0x%x, nsectors: %d",
				    rq->cmd[0], uptodate, nsectors);
255

256
	if (blk_sense_request(rq) && uptodate) {
L
Linus Torvalds 已提交
257
		/*
258 259
		 * For REQ_TYPE_SENSE, "rq->buffer" points to the original
		 * failed request
L
Linus Torvalds 已提交
260 261 262 263 264 265 266 267 268 269
		 */
		struct request *failed = (struct request *) rq->buffer;
		struct cdrom_info *info = drive->driver_data;
		void *sense = &info->sense_data;

		if (failed) {
			if (failed->sense) {
				sense = failed->sense;
				failed->sense_len = rq->sense_len;
			}
A
Alan Cox 已提交
270
			cdrom_analyze_sense_data(drive, failed, sense);
L
Linus Torvalds 已提交
271
			/*
B
Borislav Petkov 已提交
272
			 * now end the failed request
L
Linus Torvalds 已提交
273
			 */
A
Alan Cox 已提交
274
			if (blk_fs_request(failed)) {
275
				if (ide_end_rq(drive, failed, -EIO,
276
						failed->hard_nr_sectors << 9))
A
Alan Cox 已提交
277 278
					BUG();
			} else {
279 280
				if (blk_end_request(failed, -EIO,
						    failed->data_len))
281
					BUG();
A
Alan Cox 已提交
282 283 284
			}
		} else
			cdrom_analyze_sense_data(drive, NULL, sense);
L
Linus Torvalds 已提交
285 286 287 288 289 290 291 292 293 294
	}

	if (!rq->current_nr_sectors && blk_fs_request(rq))
		uptodate = 1;
	/* make sure it's fully ended */
	if (blk_pc_request(rq))
		nsectors = (rq->data_len + 511) >> 9;
	if (!nsectors)
		nsectors = 1;

B
Borislav Petkov 已提交
295 296
	ide_debug_log(IDE_DBG_FUNC, "uptodate: 0x%x, nsectors: %d",
				    uptodate, nsectors);
297

298 299 300
	if (blk_fs_request(rq) == 0 && uptodate <= 0 && rq->errors == 0)
		rq->errors = -EIO;

301
	ide_complete_rq(drive, uptodate ? 0 : -EIO, nsectors << 9);
L
Linus Torvalds 已提交
302 303
}

304
static void ide_dump_status_no_sense(ide_drive_t *drive, const char *msg, u8 st)
A
Alan Cox 已提交
305
{
306
	if (st & 0x80)
A
Alan Cox 已提交
307
		return;
308
	ide_dump_status(drive, msg, st);
A
Alan Cox 已提交
309 310
}

B
Borislav Petkov 已提交
311 312 313 314 315
/*
 * Returns:
 * 0: if the request should be continued.
 * 1: if the request was ended.
 */
L
Linus Torvalds 已提交
316 317
static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
{
318
	ide_hwif_t *hwif = drive->hwif;
319
	struct request *rq = hwif->rq;
L
Linus Torvalds 已提交
320
	int stat, err, sense_key;
321

B
Borislav Petkov 已提交
322
	/* check for errors */
323
	stat = hwif->tp_ops->read_status(hwif);
324

L
Linus Torvalds 已提交
325 326 327 328 329 330
	if (stat_ret)
		*stat_ret = stat;

	if (OK_STAT(stat, good_stat, BAD_R_STAT))
		return 0;

B
Borislav Petkov 已提交
331
	/* get the IDE error register */
332
	err = ide_read_error(drive);
L
Linus Torvalds 已提交
333 334 335
	sense_key = err >> 4;

	if (rq == NULL) {
336
		printk(KERN_ERR PFX "%s: missing rq in %s\n",
337
				drive->name, __func__);
L
Linus Torvalds 已提交
338 339 340
		return 1;
	}

B
Borislav Petkov 已提交
341 342 343 344
	ide_debug_log(IDE_DBG_RQ, "stat: 0x%x, good_stat: 0x%x, cmd[0]: 0x%x, "
				  "rq->cmd_type: 0x%x, err: 0x%x",
				  stat, good_stat, rq->cmd[0], rq->cmd_type,
				  err);
345

346
	if (blk_sense_request(rq)) {
B
Borislav Petkov 已提交
347 348 349 350 351
		/*
		 * We got an error trying to get sense info from the drive
		 * (probably while trying to recover from a former error).
		 * Just give up.
		 */
352
		rq->cmd_flags |= REQ_FAILED;
L
Linus Torvalds 已提交
353 354 355 356
		cdrom_end_request(drive, 0);
		ide_error(drive, "request sense failure", stat);
		return 1;

357
	} else if (blk_pc_request(rq) || rq->cmd_type == REQ_TYPE_ATA_PC) {
L
Linus Torvalds 已提交
358 359 360 361 362 363
		/* All other functions, except for READ. */

		/*
		 * if we have an error, pass back CHECK_CONDITION as the
		 * scsi status byte
		 */
364
		if (blk_pc_request(rq) && !rq->errors)
L
Linus Torvalds 已提交
365 366
			rq->errors = SAM_STAT_CHECK_CONDITION;

B
Borislav Petkov 已提交
367
		/* check for tray open */
L
Linus Torvalds 已提交
368
		if (sense_key == NOT_READY) {
369
			cdrom_saw_media_change(drive);
L
Linus Torvalds 已提交
370
		} else if (sense_key == UNIT_ATTENTION) {
B
Borislav Petkov 已提交
371
			/* check for media change */
372
			cdrom_saw_media_change(drive);
L
Linus Torvalds 已提交
373
			return 0;
374 375 376 377 378 379 380 381 382
		} else if (sense_key == ILLEGAL_REQUEST &&
			   rq->cmd[0] == GPCMD_START_STOP_UNIT) {
			/*
			 * Don't print error message for this condition--
			 * SFF8090i indicates that 5/24/00 is the correct
			 * response to a request to close the tray if the
			 * drive doesn't have that capability.
			 * cdrom_log_sense() knows this!
			 */
383
		} else if (!(rq->cmd_flags & REQ_QUIET)) {
B
Borislav Petkov 已提交
384
			/* otherwise, print an error */
L
Linus Torvalds 已提交
385 386
			ide_dump_status(drive, "packet command error", stat);
		}
387

388
		rq->cmd_flags |= REQ_FAILED;
L
Linus Torvalds 已提交
389 390 391 392 393 394

		/*
		 * instead of playing games with moving completions around,
		 * remove failed request completely and end it when the
		 * request sense has completed
		 */
395
		goto end_request;
L
Linus Torvalds 已提交
396 397 398 399

	} else if (blk_fs_request(rq)) {
		int do_end_request = 0;

B
Borislav Petkov 已提交
400
		/* handle errors from READ and WRITE requests */
L
Linus Torvalds 已提交
401 402 403 404 405

		if (blk_noretry_request(rq))
			do_end_request = 1;

		if (sense_key == NOT_READY) {
B
Borislav Petkov 已提交
406
			/* tray open */
L
Linus Torvalds 已提交
407
			if (rq_data_dir(rq) == READ) {
408
				cdrom_saw_media_change(drive);
L
Linus Torvalds 已提交
409

B
Borislav Petkov 已提交
410
				/* fail the request */
411 412
				printk(KERN_ERR PFX "%s: tray open\n",
						drive->name);
L
Linus Torvalds 已提交
413 414 415 416
				do_end_request = 1;
			} else {
				struct cdrom_info *info = drive->driver_data;

B
Borislav Petkov 已提交
417 418
				/*
				 * Allow the drive 5 seconds to recover, some
L
Linus Torvalds 已提交
419
				 * devices will return this error while flushing
B
Borislav Petkov 已提交
420 421
				 * data from cache.
				 */
L
Linus Torvalds 已提交
422
				if (!rq->errors)
423 424
					info->write_timeout = jiffies +
							ATAPI_WAIT_WRITE_BUSY;
L
Linus Torvalds 已提交
425 426 427 428
				rq->errors = 1;
				if (time_after(jiffies, info->write_timeout))
					do_end_request = 1;
				else {
429
					struct request_queue *q = drive->queue;
L
Linus Torvalds 已提交
430 431 432
					unsigned long flags;

					/*
B
Borislav Petkov 已提交
433 434
					 * take a breather relying on the unplug
					 * timer to kick us again
L
Linus Torvalds 已提交
435
					 */
436 437 438 439
					spin_lock_irqsave(q->queue_lock, flags);
					blk_plug_device(q);
					spin_unlock_irqrestore(q->queue_lock, flags);

L
Linus Torvalds 已提交
440 441 442 443
					return 1;
				}
			}
		} else if (sense_key == UNIT_ATTENTION) {
B
Borislav Petkov 已提交
444
			/* media change */
445
			cdrom_saw_media_change(drive);
L
Linus Torvalds 已提交
446

447
			/*
B
Borislav Petkov 已提交
448 449
			 * Arrange to retry the request but be sure to give up
			 * if we've retried too many times.
450
			 */
L
Linus Torvalds 已提交
451 452 453 454
			if (++rq->errors > ERROR_MAX)
				do_end_request = 1;
		} else if (sense_key == ILLEGAL_REQUEST ||
			   sense_key == DATA_PROTECT) {
455
			/*
B
Borislav Petkov 已提交
456 457
			 * No point in retrying after an illegal request or data
			 * protect error.
458 459
			 */
			ide_dump_status_no_sense(drive, "command error", stat);
L
Linus Torvalds 已提交
460 461
			do_end_request = 1;
		} else if (sense_key == MEDIUM_ERROR) {
462 463
			/*
			 * No point in re-trying a zillion times on a bad
B
Borislav Petkov 已提交
464
			 * sector. If we got here the error is not correctable.
465
			 */
466 467 468
			ide_dump_status_no_sense(drive,
						 "media error (bad sector)",
						 stat);
L
Linus Torvalds 已提交
469 470
			do_end_request = 1;
		} else if (sense_key == BLANK_CHECK) {
B
Borislav Petkov 已提交
471
			/* disk appears blank ?? */
472 473
			ide_dump_status_no_sense(drive, "media error (blank)",
						 stat);
L
Linus Torvalds 已提交
474
			do_end_request = 1;
475
		} else if ((err & ~ATA_ABORTED) != 0) {
B
Borislav Petkov 已提交
476
			/* go to the default handler for other errors */
L
Linus Torvalds 已提交
477 478 479
			ide_error(drive, "cdrom_decode_status", stat);
			return 1;
		} else if ((++rq->errors > ERROR_MAX)) {
B
Borislav Petkov 已提交
480
			/* we've racked up too many retries, abort */
L
Linus Torvalds 已提交
481 482 483
			do_end_request = 1;
		}

B
Borislav Petkov 已提交
484 485 486 487 488
		/*
		 * End a request through request sense analysis when we have
		 * sense data. We need this in order to perform end of media
		 * processing.
		 */
489 490
		if (do_end_request)
			goto end_request;
A
Alan Cox 已提交
491

492
		/*
B
Borislav Petkov 已提交
493 494
		 * If we got a CHECK_CONDITION status, queue
		 * a request sense command.
495
		 */
496
		if (stat & ATA_ERR)
497
			cdrom_queue_request_sense(drive, NULL, NULL);
L
Linus Torvalds 已提交
498
	} else {
499
		blk_dump_rq_flags(rq, PFX "bad rq");
L
Linus Torvalds 已提交
500 501 502
		cdrom_end_request(drive, 0);
	}

B
Borislav Petkov 已提交
503
	/* retry, or handle the next request */
L
Linus Torvalds 已提交
504
	return 1;
505 506

end_request:
507
	if (stat & ATA_ERR) {
508
		struct request_queue *q = drive->queue;
509 510
		unsigned long flags;

511
		spin_lock_irqsave(q->queue_lock, flags);
512
		blkdev_dequeue_request(rq);
513
		spin_unlock_irqrestore(q->queue_lock, flags);
514

515
		hwif->rq = NULL;
516

517 518 519 520 521
		cdrom_queue_request_sense(drive, rq->sense, rq);
	} else
		cdrom_end_request(drive, 0);

	return 1;
L
Linus Torvalds 已提交
522 523 524 525 526 527 528
}

/*
 * Check the contents of the interrupt reason register from the cdrom
 * and attempt to recover if there are problems.  Returns  0 if everything's
 * ok; nonzero if the request has been terminated.
 */
529 530
static int ide_cd_check_ireason(ide_drive_t *drive, struct request *rq,
				int len, int ireason, int rw)
L
Linus Torvalds 已提交
531
{
532 533
	ide_hwif_t *hwif = drive->hwif;

B
Borislav Petkov 已提交
534
	ide_debug_log(IDE_DBG_FUNC, "ireason: 0x%x, rw: 0x%x", ireason, rw);
535

536 537 538 539 540
	/*
	 * ireason == 0: the drive wants to receive data from us
	 * ireason == 2: the drive is expecting to transfer data to us
	 */
	if (ireason == (!rw << 1))
L
Linus Torvalds 已提交
541
		return 0;
542
	else if (ireason == (rw << 1)) {
543

B
Borislav Petkov 已提交
544
		/* whoops... */
545
		printk(KERN_ERR PFX "%s: %s: wrong transfer direction!\n",
546
				drive->name, __func__);
L
Linus Torvalds 已提交
547

548
		ide_pad_transfer(drive, rw, len);
549
	} else  if (rw == 0 && ireason == 1) {
B
Borislav Petkov 已提交
550 551 552
		/*
		 * Some drives (ASUS) seem to tell us that status info is
		 * available.  Just get it and ignore.
L
Linus Torvalds 已提交
553
		 */
554
		(void)hwif->tp_ops->read_status(hwif);
L
Linus Torvalds 已提交
555 556
		return 0;
	} else {
B
Borislav Petkov 已提交
557
		/* drive wants a command packet, or invalid ireason... */
558
		printk(KERN_ERR PFX "%s: %s: bad interrupt reason 0x%02x\n",
559
				drive->name, __func__, ireason);
L
Linus Torvalds 已提交
560 561
	}

562 563 564
	if (rq->cmd_type == REQ_TYPE_ATA_PC)
		rq->cmd_flags |= REQ_FAILED;

L
Linus Torvalds 已提交
565 566 567 568
	cdrom_end_request(drive, 0);
	return -1;
}

569 570 571 572 573 574
/*
 * Assume that the drive will always provide data in multiples of at least
 * SECTOR_SIZE, as it gets hairy to keep track of the transfers otherwise.
 */
static int ide_cd_check_transfer_size(ide_drive_t *drive, int len)
{
B
Borislav Petkov 已提交
575
	ide_debug_log(IDE_DBG_FUNC, "len: %d", len);
576

577 578 579
	if ((len % SECTOR_SIZE) == 0)
		return 0;

580 581
	printk(KERN_ERR PFX "%s: %s: Bad transfer size %d\n", drive->name,
			__func__, len);
582

583
	if (drive->atapi_flags & IDE_AFLAG_LIMIT_NFRAMES)
584 585
		printk(KERN_ERR PFX "This drive is not supported by this "
				"version of the driver\n");
586
	else {
587
		printk(KERN_ERR PFX "Trying to limit transfer sizes\n");
588
		drive->atapi_flags |= IDE_AFLAG_LIMIT_NFRAMES;
589 590 591 592 593
	}

	return 1;
}

594 595
static ide_startstop_t ide_cd_prepare_rw_request(ide_drive_t *drive,
						 struct request *rq)
L
Linus Torvalds 已提交
596
{
B
Borislav Petkov 已提交
597
	ide_debug_log(IDE_DBG_RQ, "rq->cmd_flags: 0x%x", rq->cmd_flags);
598

599 600 601 602
	if (rq_data_dir(rq) == READ) {
		unsigned short sectors_per_frame =
			queue_hardsect_size(drive->queue) >> SECTOR_BITS;
		int nskip = rq->sector & (sectors_per_frame - 1);
L
Linus Torvalds 已提交
603

604 605 606 607 608 609 610 611 612 613 614
		/*
		 * If the requested sector doesn't start on a frame boundary,
		 * we must adjust the start of the transfer so that it does,
		 * and remember to skip the first few sectors.
		 *
		 * If the rq->current_nr_sectors field is larger than the size
		 * of the buffer, it will mean that we're to skip a number of
		 * sectors equal to the amount by which rq->current_nr_sectors
		 * is larger than the buffer size.
		 */
		if (nskip > 0) {
B
Borislav Petkov 已提交
615
			/* sanity check... */
616 617
			if (rq->current_nr_sectors !=
			    bio_cur_sectors(rq->bio)) {
618
				printk(KERN_ERR PFX "%s: %s: buffer botch (%u)\n",
619
						drive->name, __func__,
620 621 622 623 624
						rq->current_nr_sectors);
				cdrom_end_request(drive, 0);
				return ide_stopped;
			}
			rq->current_nr_sectors += nskip;
L
Linus Torvalds 已提交
625 626
		}
	}
627

B
Borislav Petkov 已提交
628
	/* set up the command */
L
Linus Torvalds 已提交
629 630
	rq->timeout = ATAPI_WAIT_PC;

631 632 633
	return ide_started;
}

634
/*
B
Borislav Petkov 已提交
635 636
 * Fix up a possibly partially-processed request so that we can start it over
 * entirely, or even put it back on the request queue.
637
 */
638
static void ide_cd_restore_request(ide_drive_t *drive, struct request *rq)
L
Linus Torvalds 已提交
639
{
640

B
Borislav Petkov 已提交
641
	ide_debug_log(IDE_DBG_FUNC, "enter");
642

L
Linus Torvalds 已提交
643
	if (rq->buffer != bio_data(rq->bio)) {
644 645
		sector_t n =
			(rq->buffer - (char *)bio_data(rq->bio)) / SECTOR_SIZE;
L
Linus Torvalds 已提交
646 647 648 649 650

		rq->buffer = bio_data(rq->bio);
		rq->nr_sectors += n;
		rq->sector -= n;
	}
651 652
	rq->current_nr_sectors = bio_cur_sectors(rq->bio);
	rq->hard_cur_sectors = rq->current_nr_sectors;
L
Linus Torvalds 已提交
653 654 655 656 657
	rq->hard_nr_sectors = rq->nr_sectors;
	rq->hard_sector = rq->sector;
	rq->q->prep_rq_fn(rq->q, rq);
}

658
static void ide_cd_request_sense_fixup(ide_drive_t *drive, struct request *rq)
659
{
B
Borislav Petkov 已提交
660
	ide_debug_log(IDE_DBG_FUNC, "rq->cmd[0]: 0x%x", rq->cmd[0]);
661

662 663 664 665 666 667 668 669 670 671 672 673
	/*
	 * Some of the trailing request sense fields are optional,
	 * and some drives don't send them.  Sigh.
	 */
	if (rq->cmd[0] == GPCMD_REQUEST_SENSE &&
	    rq->data_len > 0 && rq->data_len <= 5)
		while (rq->data_len > 0) {
			*(u8 *)rq->data++ = 0;
			--rq->data_len;
		}
}

674 675 676 677
int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd,
		    int write, void *buffer, unsigned *bufflen,
		    struct request_sense *sense, int timeout,
		    unsigned int cmd_flags)
L
Linus Torvalds 已提交
678
{
679 680
	struct cdrom_info *info = drive->driver_data;
	struct request_sense local_sense;
L
Linus Torvalds 已提交
681
	int retries = 10;
682
	unsigned int flags = 0;
L
Linus Torvalds 已提交
683

684 685
	if (!sense)
		sense = &local_sense;
L
Linus Torvalds 已提交
686

B
Borislav Petkov 已提交
687 688 689
	ide_debug_log(IDE_DBG_PC, "cmd[0]: 0x%x, write: 0x%x, timeout: %d, "
				  "cmd_flags: 0x%x",
				  cmd[0], write, timeout, cmd_flags);
690

B
Borislav Petkov 已提交
691
	/* start of retry loop */
L
Linus Torvalds 已提交
692
	do {
693
		struct request *rq;
L
Linus Torvalds 已提交
694 695
		int error;

696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714
		rq = blk_get_request(drive->queue, write, __GFP_WAIT);

		memcpy(rq->cmd, cmd, BLK_MAX_CDB);
		rq->cmd_type = REQ_TYPE_ATA_PC;
		rq->sense = sense;
		rq->cmd_flags |= cmd_flags;
		rq->timeout = timeout;
		if (buffer) {
			rq->data = buffer;
			rq->data_len = *bufflen;
		}

		error = blk_execute_rq(drive->queue, info->disk, rq, 0);

		if (buffer)
			*bufflen = rq->data_len;

		flags = rq->cmd_flags;
		blk_put_request(rq);
L
Linus Torvalds 已提交
715

B
Borislav Petkov 已提交
716 717 718 719
		/*
		 * FIXME: we should probably abort/retry or something in case of
		 * failure.
		 */
720
		if (flags & REQ_FAILED) {
B
Borislav Petkov 已提交
721 722 723 724
			/*
			 * The request failed.  Retry if it was due to a unit
			 * attention status (usually means media was changed).
			 */
725
			struct request_sense *reqbuf = sense;
L
Linus Torvalds 已提交
726 727 728 729 730

			if (reqbuf->sense_key == UNIT_ATTENTION)
				cdrom_saw_media_change(drive);
			else if (reqbuf->sense_key == NOT_READY &&
				 reqbuf->asc == 4 && reqbuf->ascq != 4) {
B
Borislav Petkov 已提交
731 732 733 734 735
				/*
				 * The drive is in the process of loading
				 * a disk.  Retry, but wait a little to give
				 * the drive time to complete the load.
				 */
L
Linus Torvalds 已提交
736 737
				ssleep(2);
			} else {
B
Borislav Petkov 已提交
738
				/* otherwise, don't retry */
L
Linus Torvalds 已提交
739 740 741 742 743
				retries = 0;
			}
			--retries;
		}

B
Borislav Petkov 已提交
744
		/* end of retry loop */
745
	} while ((flags & REQ_FAILED) && retries >= 0);
L
Linus Torvalds 已提交
746

B
Borislav Petkov 已提交
747
	/* return an error if the command failed */
748
	return (flags & REQ_FAILED) ? -EIO : 0;
L
Linus Torvalds 已提交
749 750
}

751
/*
B
Borislav Petkov 已提交
752 753 754
 * Called from blk_end_request_callback() after the data of the request is
 * completed and before the request itself is completed. By returning value '1',
 * blk_end_request_callback() returns immediately without completing it.
755 756 757 758 759 760
 */
static int cdrom_newpc_intr_dummy_cb(struct request *rq)
{
	return 1;
}

L
Linus Torvalds 已提交
761 762
static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
{
763
	ide_hwif_t *hwif = drive->hwif;
764
	struct request *rq = hwif->rq;
L
Linus Torvalds 已提交
765
	xfer_func_t *xferfunc;
766
	ide_expiry_t *expiry = NULL;
767
	int dma_error = 0, dma, stat, thislen, uptodate = 0;
768 769
	int write = (rq_data_dir(rq) == WRITE) ? 1 : 0;
	unsigned int timeout;
770 771
	u16 len;
	u8 ireason;
L
Linus Torvalds 已提交
772

B
Borislav Petkov 已提交
773 774
	ide_debug_log(IDE_DBG_PC, "cmd[0]: 0x%x, write: 0x%x",
				  rq->cmd[0], write);
775

B
Borislav Petkov 已提交
776
	/* check for errors */
777
	dma = drive->dma;
L
Linus Torvalds 已提交
778
	if (dma) {
779
		drive->dma = 0;
780
		dma_error = hwif->dma_ops->dma_end(drive);
781
		if (dma_error) {
782
			printk(KERN_ERR PFX "%s: DMA %s error\n", drive->name,
783
					write ? "write" : "read");
784 785
			ide_dma_off(drive);
		}
L
Linus Torvalds 已提交
786 787 788 789 790
	}

	if (cdrom_decode_status(drive, 0, &stat))
		return ide_stopped;

B
Borislav Petkov 已提交
791
	/* using dma, transfer is complete now */
L
Linus Torvalds 已提交
792
	if (dma) {
793
		if (dma_error)
L
Linus Torvalds 已提交
794
			return ide_error(drive, "dma error", stat);
795
		if (blk_fs_request(rq)) {
796 797
			ide_complete_rq(drive, 0, rq->nr_sectors
				? (rq->nr_sectors << 9) : ide_rq_bytes(rq));
798
			return ide_stopped;
799
		} else if (rq->cmd_type == REQ_TYPE_ATA_PC && !rq->bio) {
800
			ide_complete_rq(drive, 0, 512);
801
			return ide_stopped;
802
		}
803
		goto end_request;
L
Linus Torvalds 已提交
804 805
	}

806
	ide_read_bcount_and_ireason(drive, &len, &ireason);
807 808

	thislen = blk_fs_request(rq) ? len : rq->data_len;
L
Linus Torvalds 已提交
809 810 811
	if (thislen > len)
		thislen = len;

B
Borislav Petkov 已提交
812 813
	ide_debug_log(IDE_DBG_PC, "DRQ: stat: 0x%x, thislen: %d",
				  stat, thislen);
814

B
Borislav Petkov 已提交
815
	/* If DRQ is clear, the command has completed. */
816
	if ((stat & ATA_DRQ) == 0) {
817 818 819 820 821 822 823
		if (blk_fs_request(rq)) {
			/*
			 * If we're not done reading/writing, complain.
			 * Otherwise, complete the command normally.
			 */
			uptodate = 1;
			if (rq->current_nr_sectors > 0) {
824
				printk(KERN_ERR PFX "%s: %s: data underrun "
825
						"(%d blocks)\n",
826
						drive->name, __func__,
827 828 829 830 831 832 833 834
						rq->current_nr_sectors);
				if (!write)
					rq->cmd_flags |= REQ_FAILED;
				uptodate = 0;
			}
			cdrom_end_request(drive, uptodate);
			return ide_stopped;
		} else if (!blk_pc_request(rq)) {
835
			ide_cd_request_sense_fixup(drive, rq);
B
Borislav Petkov 已提交
836
			/* complain if we still have data left to transfer */
837 838 839
			uptodate = rq->data_len ? 0 : 1;
		}
		goto end_request;
840
	}
L
Linus Torvalds 已提交
841

B
Borislav Petkov 已提交
842
	/* check which way to transfer data */
843 844
	if (ide_cd_check_ireason(drive, rq, len, ireason, write))
		return ide_stopped;
845

846 847
	if (blk_fs_request(rq)) {
		if (write == 0) {
848 849 850 851 852 853 854 855 856 857 858 859 860 861 862
			int nskip;

			if (ide_cd_check_transfer_size(drive, len)) {
				cdrom_end_request(drive, 0);
				return ide_stopped;
			}

			/*
			 * First, figure out if we need to bit-bucket
			 * any of the leading sectors.
			 */
			nskip = min_t(int, rq->current_nr_sectors
					   - bio_cur_sectors(rq->bio),
					   thislen >> 9);
			if (nskip > 0) {
863
				ide_pad_transfer(drive, write, nskip << 9);
864 865 866 867
				rq->current_nr_sectors -= nskip;
				thislen -= (nskip << 9);
			}
		}
868
	}
L
Linus Torvalds 已提交
869

870 871
	if (ireason == 0) {
		write = 1;
872
		xferfunc = hwif->tp_ops->output_data;
873
	} else {
874
		write = 0;
875
		xferfunc = hwif->tp_ops->input_data;
L
Linus Torvalds 已提交
876 877
	}

B
Borislav Petkov 已提交
878 879 880
	ide_debug_log(IDE_DBG_PC, "data transfer, rq->cmd_type: 0x%x, "
				  "ireason: 0x%x",
				  rq->cmd_type, ireason);
881

B
Borislav Petkov 已提交
882
	/* transfer data */
L
Linus Torvalds 已提交
883
	while (thislen > 0) {
884
		u8 *ptr = blk_fs_request(rq) ? NULL : rq->data;
885
		int blen = rq->data_len;
L
Linus Torvalds 已提交
886

B
Borislav Petkov 已提交
887
		/* bio backed? */
L
Linus Torvalds 已提交
888
		if (rq->bio) {
889 890 891 892 893 894 895
			if (blk_fs_request(rq)) {
				ptr = rq->buffer;
				blen = rq->current_nr_sectors << 9;
			} else {
				ptr = bio_data(rq->bio);
				blen = bio_iovec(rq->bio)->bv_len;
			}
L
Linus Torvalds 已提交
896 897 898
		}

		if (!ptr) {
899 900
			if (blk_fs_request(rq) && !write)
				/*
901
				 * If the buffers are full, pipe the rest into
B
Borislav Petkov 已提交
902 903
				 * oblivion.
				 */
904
				ide_pad_transfer(drive, 0, thislen);
905
			else {
906
				printk(KERN_ERR PFX "%s: confused, missing data\n",
907 908 909 910 911
						drive->name);
				blk_dump_rq_flags(rq, rq_data_dir(rq)
						  ? "cdrom_newpc_intr, write"
						  : "cdrom_newpc_intr, read");
			}
L
Linus Torvalds 已提交
912 913 914 915 916 917
			break;
		}

		if (blen > thislen)
			blen = thislen;

918
		xferfunc(drive, NULL, ptr, blen);
L
Linus Torvalds 已提交
919 920 921 922

		thislen -= blen;
		len -= blen;

923 924 925 926 927 928 929 930 931 932 933
		if (blk_fs_request(rq)) {
			rq->buffer += blen;
			rq->nr_sectors -= (blen >> 9);
			rq->current_nr_sectors -= (blen >> 9);
			rq->sector += (blen >> 9);

			if (rq->current_nr_sectors == 0 && rq->nr_sectors)
				cdrom_end_request(drive, 1);
		} else {
			rq->data_len -= blen;

934 935 936 937 938 939
			/*
			 * The request can't be completed until DRQ is cleared.
			 * So complete the data, but don't complete the request
			 * using the dummy function for the callback feature
			 * of blk_end_request_callback().
			 */
940 941
			if (rq->bio)
				blk_end_request_callback(rq, 0, blen,
942
						 cdrom_newpc_intr_dummy_cb);
943 944 945
			else
				rq->data += blen;
		}
A
Andreas Schwab 已提交
946 947
		if (!write && blk_sense_request(rq))
			rq->sense_len += blen;
L
Linus Torvalds 已提交
948 949
	}

B
Borislav Petkov 已提交
950
	/* pad, if necessary */
951
	if (!blk_fs_request(rq) && len > 0)
952
		ide_pad_transfer(drive, write, len);
L
Linus Torvalds 已提交
953

954 955 956 957
	if (blk_pc_request(rq)) {
		timeout = rq->timeout;
	} else {
		timeout = ATAPI_WAIT_PC;
958
		if (!blk_fs_request(rq))
959
			expiry = ide_cd_expiry;
960 961 962
	}

	ide_set_handler(drive, cdrom_newpc_intr, timeout, expiry);
L
Linus Torvalds 已提交
963
	return ide_started;
964 965 966

end_request:
	if (blk_pc_request(rq)) {
967 968 969 970
		unsigned int dlen = rq->data_len;

		if (dma)
			rq->data_len = 0;
971

972
		if (blk_end_request(rq, 0, dlen))
973
			BUG();
974

975
		hwif->rq = NULL;
976 977 978 979 980 981
	} else {
		if (!uptodate)
			rq->cmd_flags |= REQ_FAILED;
		cdrom_end_request(drive, uptodate);
	}
	return ide_stopped;
L
Linus Torvalds 已提交
982 983
}

984
static ide_startstop_t cdrom_start_rw(ide_drive_t *drive, struct request *rq)
L
Linus Torvalds 已提交
985
{
986 987 988 989
	struct cdrom_info *cd = drive->driver_data;
	int write = rq_data_dir(rq) == WRITE;
	unsigned short sectors_per_frame =
		queue_hardsect_size(drive->queue) >> SECTOR_BITS;
L
Linus Torvalds 已提交
990

B
Borislav Petkov 已提交
991 992 993
	ide_debug_log(IDE_DBG_RQ, "rq->cmd[0]: 0x%x, write: 0x%x, "
				  "secs_per_frame: %u",
				  rq->cmd[0], write, sectors_per_frame);
994

995
	if (write) {
B
Borislav Petkov 已提交
996
		/* disk has become write protected */
T
Tejun Heo 已提交
997
		if (get_disk_ro(cd->disk)) {
998 999 1000 1001 1002 1003 1004 1005
			cdrom_end_request(drive, 0);
			return ide_stopped;
		}
	} else {
		/*
		 * We may be retrying this request after an error.  Fix up any
		 * weirdness which might be present in the request packet.
		 */
1006
		ide_cd_restore_request(drive, rq);
L
Linus Torvalds 已提交
1007 1008
	}

B
Borislav Petkov 已提交
1009
	/* use DMA, if possible / writes *must* be hardware frame aligned */
1010 1011 1012 1013 1014 1015
	if ((rq->nr_sectors & (sectors_per_frame - 1)) ||
	    (rq->sector & (sectors_per_frame - 1))) {
		if (write) {
			cdrom_end_request(drive, 0);
			return ide_stopped;
		}
1016
		drive->dma = 0;
1017
	} else
1018
		drive->dma = !!(drive->dev_flags & IDE_DFLAG_USING_DMA);
L
Linus Torvalds 已提交
1019

1020 1021
	if (write)
		cd->devinfo.media_written = 1;
L
Linus Torvalds 已提交
1022

1023
	return ide_started;
L
Linus Torvalds 已提交
1024 1025
}

1026
static void cdrom_do_block_pc(ide_drive_t *drive, struct request *rq)
L
Linus Torvalds 已提交
1027 1028
{

B
Borislav Petkov 已提交
1029 1030
	ide_debug_log(IDE_DBG_PC, "rq->cmd[0]: 0x%x, rq->cmd_type: 0x%x",
				  rq->cmd[0], rq->cmd_type);
1031

1032 1033 1034 1035
	if (blk_pc_request(rq))
		rq->cmd_flags |= REQ_QUIET;
	else
		rq->cmd_flags &= ~REQ_FAILED;
L
Linus Torvalds 已提交
1036

1037
	drive->dma = 0;
L
Linus Torvalds 已提交
1038

B
Borislav Petkov 已提交
1039
	/* sg request */
1040 1041 1042
	if (rq->bio || ((rq->cmd_type == REQ_TYPE_ATA_PC) && rq->data_len)) {
		struct request_queue *q = drive->queue;
		unsigned int alignment;
1043
		char *buf;
L
Linus Torvalds 已提交
1044

1045
		if (rq->bio)
1046
			buf = bio_data(rq->bio);
1047
		else
1048
			buf = rq->data;
1049

1050
		drive->dma = !!(drive->dev_flags & IDE_DFLAG_USING_DMA);
L
Linus Torvalds 已提交
1051 1052 1053

		/*
		 * check if dma is safe
1054 1055 1056
		 *
		 * NOTE! The "len" and "addr" checks should possibly have
		 * separate masks.
L
Linus Torvalds 已提交
1057
		 */
1058
		alignment = queue_dma_alignment(q) | q->dma_pad_mask;
1059 1060
		if ((unsigned long)buf & alignment
		    || rq->data_len & q->dma_pad_mask
1061
		    || object_is_on_stack(buf))
1062
			drive->dma = 0;
L
Linus Torvalds 已提交
1063 1064 1065
	}
}

1066
static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq,
1067
					sector_t block)
L
Linus Torvalds 已提交
1068
{
B
Borislav Petkov 已提交
1069 1070 1071 1072 1073
	ide_debug_log(IDE_DBG_RQ, "cmd: 0x%x, block: %llu",
				  rq->cmd[0], (unsigned long long)block);

	if (drive->debug_mask & IDE_DBG_RQ)
		blk_dump_rq_flags(rq, "ide_cd_do_request");
1074

L
Linus Torvalds 已提交
1075
	if (blk_fs_request(rq)) {
1076 1077
		if (cdrom_start_rw(drive, rq) == ide_stopped)
			return ide_stopped;
1078

1079 1080
		if (ide_cd_prepare_rw_request(drive, rq) == ide_stopped)
			return ide_stopped;
1081
	} else if (blk_sense_request(rq) || blk_pc_request(rq) ||
1082
		   rq->cmd_type == REQ_TYPE_ATA_PC) {
1083 1084 1085
		if (!rq->timeout)
			rq->timeout = ATAPI_WAIT_PC;

1086
		cdrom_do_block_pc(drive, rq);
1087
	} else if (blk_special_request(rq)) {
B
Borislav Petkov 已提交
1088
		/* right now this can only be a reset... */
L
Linus Torvalds 已提交
1089 1090
		cdrom_end_request(drive, 1);
		return ide_stopped;
1091
	} else {
1092
		blk_dump_rq_flags(rq, DRV_NAME " bad flags");
1093 1094
		cdrom_end_request(drive, 0);
		return ide_stopped;
L
Linus Torvalds 已提交
1095
	}
1096

1097
	return ide_issue_pc(drive);
L
Linus Torvalds 已提交
1098 1099
}

B
Borislav Petkov 已提交
1100
/*
L
Linus Torvalds 已提交
1101 1102
 * Ioctl handling.
 *
B
Borislav Petkov 已提交
1103 1104 1105 1106 1107
 * Routines which queue packet commands take as a final argument a pointer to a
 * request_sense struct. If execution of the command results in an error with a
 * CHECK CONDITION status, this structure will be filled with the results of the
 * subsequent request sense command. The pointer can also be NULL, in which case
 * no sense information is returned.
L
Linus Torvalds 已提交
1108
 */
1109
static void msf_from_bcd(struct atapi_msf *msf)
L
Linus Torvalds 已提交
1110
{
A
Adrian Bunk 已提交
1111 1112 1113
	msf->minute = bcd2bin(msf->minute);
	msf->second = bcd2bin(msf->second);
	msf->frame  = bcd2bin(msf->frame);
L
Linus Torvalds 已提交
1114 1115
}

1116
int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense)
L
Linus Torvalds 已提交
1117 1118 1119
{
	struct cdrom_info *info = drive->driver_data;
	struct cdrom_device_info *cdi = &info->devinfo;
1120
	unsigned char cmd[BLK_MAX_CDB];
L
Linus Torvalds 已提交
1121

B
Borislav Petkov 已提交
1122
	ide_debug_log(IDE_DBG_FUNC, "enter");
1123

1124 1125
	memset(cmd, 0, BLK_MAX_CDB);
	cmd[0] = GPCMD_TEST_UNIT_READY;
L
Linus Torvalds 已提交
1126

1127
	/*
B
Borislav Petkov 已提交
1128 1129
	 * Sanyo 3 CD changer uses byte 7 of TEST_UNIT_READY to switch CDs
	 * instead of supporting the LOAD_UNLOAD opcode.
1130
	 */
1131
	cmd[7] = cdi->sanyo_slot % 3;
L
Linus Torvalds 已提交
1132

1133
	return ide_cd_queue_pc(drive, cmd, 0, NULL, NULL, sense, 0, REQ_QUIET);
L
Linus Torvalds 已提交
1134 1135 1136 1137 1138 1139 1140
}

static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity,
			       unsigned long *sectors_per_frame,
			       struct request_sense *sense)
{
	struct {
1141 1142
		__be32 lba;
		__be32 blocklen;
L
Linus Torvalds 已提交
1143 1144 1145
	} capbuf;

	int stat;
1146 1147
	unsigned char cmd[BLK_MAX_CDB];
	unsigned len = sizeof(capbuf);
1148
	u32 blocklen;
L
Linus Torvalds 已提交
1149

B
Borislav Petkov 已提交
1150
	ide_debug_log(IDE_DBG_FUNC, "enter");
1151

1152 1153
	memset(cmd, 0, BLK_MAX_CDB);
	cmd[0] = GPCMD_READ_CDVD_CAPACITY;
L
Linus Torvalds 已提交
1154

1155 1156
	stat = ide_cd_queue_pc(drive, cmd, 0, &capbuf, &len, sense, 0,
			       REQ_QUIET);
1157 1158 1159 1160 1161 1162
	if (stat)
		return stat;

	/*
	 * Sanity check the given block size
	 */
1163 1164 1165 1166 1167 1168
	blocklen = be32_to_cpu(capbuf.blocklen);
	switch (blocklen) {
	case 512:
	case 1024:
	case 2048:
	case 4096:
1169 1170
		break;
	default:
1171 1172 1173 1174
		printk(KERN_ERR PFX "%s: weird block size %u\n",
				drive->name, blocklen);
		printk(KERN_ERR PFX "%s: default to 2kb block size\n",
				drive->name);
1175
		blocklen = 2048;
1176
		break;
L
Linus Torvalds 已提交
1177 1178
	}

1179
	*capacity = 1 + be32_to_cpu(capbuf.lba);
1180
	*sectors_per_frame = blocklen >> SECTOR_BITS;
B
Borislav Petkov 已提交
1181

B
Borislav Petkov 已提交
1182 1183
	ide_debug_log(IDE_DBG_PROBE, "cap: %lu, sectors_per_frame: %lu",
				     *capacity, *sectors_per_frame);
B
Borislav Petkov 已提交
1184

1185
	return 0;
L
Linus Torvalds 已提交
1186 1187 1188 1189 1190 1191
}

static int cdrom_read_tocentry(ide_drive_t *drive, int trackno, int msf_flag,
				int format, char *buf, int buflen,
				struct request_sense *sense)
{
1192
	unsigned char cmd[BLK_MAX_CDB];
L
Linus Torvalds 已提交
1193

B
Borislav Petkov 已提交
1194
	ide_debug_log(IDE_DBG_FUNC, "enter");
1195

1196
	memset(cmd, 0, BLK_MAX_CDB);
L
Linus Torvalds 已提交
1197

1198 1199 1200 1201 1202
	cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
	cmd[6] = trackno;
	cmd[7] = (buflen >> 8);
	cmd[8] = (buflen & 0xff);
	cmd[9] = (format << 6);
L
Linus Torvalds 已提交
1203 1204

	if (msf_flag)
1205
		cmd[1] = 2;
L
Linus Torvalds 已提交
1206

1207
	return ide_cd_queue_pc(drive, cmd, 0, buf, &buflen, sense, 0, REQ_QUIET);
L
Linus Torvalds 已提交
1208 1209 1210
}

/* Try to read the entire TOC for the disk into our internal buffer. */
1211
int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense)
L
Linus Torvalds 已提交
1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223
{
	int stat, ntracks, i;
	struct cdrom_info *info = drive->driver_data;
	struct cdrom_device_info *cdi = &info->devinfo;
	struct atapi_toc *toc = info->toc;
	struct {
		struct atapi_toc_header hdr;
		struct atapi_toc_entry  ent;
	} ms_tmp;
	long last_written;
	unsigned long sectors_per_frame = SECTORS_PER_FRAME;

B
Borislav Petkov 已提交
1224
	ide_debug_log(IDE_DBG_FUNC, "enter");
1225

L
Linus Torvalds 已提交
1226
	if (toc == NULL) {
B
Borislav Petkov 已提交
1227
		/* try to allocate space */
J
Jesper Juhl 已提交
1228
		toc = kmalloc(sizeof(struct atapi_toc), GFP_KERNEL);
L
Linus Torvalds 已提交
1229
		if (toc == NULL) {
1230
			printk(KERN_ERR PFX "%s: No cdrom TOC buffer!\n",
1231
					drive->name);
L
Linus Torvalds 已提交
1232 1233
			return -ENOMEM;
		}
J
Jesper Juhl 已提交
1234
		info->toc = toc;
L
Linus Torvalds 已提交
1235 1236
	}

B
Borislav Petkov 已提交
1237 1238 1239 1240
	/*
	 * Check to see if the existing data is still valid. If it is,
	 * just return.
	 */
L
Linus Torvalds 已提交
1241 1242
	(void) cdrom_check_status(drive, sense);

1243
	if (drive->atapi_flags & IDE_AFLAG_TOC_VALID)
L
Linus Torvalds 已提交
1244 1245
		return 0;

B
Borislav Petkov 已提交
1246
	/* try to get the total cdrom capacity and sector size */
L
Linus Torvalds 已提交
1247 1248 1249 1250 1251 1252
	stat = cdrom_read_capacity(drive, &toc->capacity, &sectors_per_frame,
				   sense);
	if (stat)
		toc->capacity = 0x1fffff;

	set_capacity(info->disk, toc->capacity * sectors_per_frame);
B
Borislav Petkov 已提交
1253
	/* save a private copy of the TOC capacity for error handling */
A
Alan Cox 已提交
1254 1255
	drive->probed_capacity = toc->capacity * sectors_per_frame;

L
Linus Torvalds 已提交
1256 1257 1258
	blk_queue_hardsect_size(drive->queue,
				sectors_per_frame << SECTOR_BITS);

B
Borislav Petkov 已提交
1259
	/* first read just the header, so we know how long the TOC is */
L
Linus Torvalds 已提交
1260 1261
	stat = cdrom_read_tocentry(drive, 0, 1, 0, (char *) &toc->hdr,
				    sizeof(struct atapi_toc_header), sense);
J
Jesper Juhl 已提交
1262 1263
	if (stat)
		return stat;
L
Linus Torvalds 已提交
1264

1265
	if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) {
A
Adrian Bunk 已提交
1266 1267
		toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
		toc->hdr.last_track  = bcd2bin(toc->hdr.last_track);
L
Linus Torvalds 已提交
1268 1269 1270 1271 1272 1273 1274 1275
	}

	ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
	if (ntracks <= 0)
		return -EIO;
	if (ntracks > MAX_TRACKS)
		ntracks = MAX_TRACKS;

B
Borislav Petkov 已提交
1276
	/* now read the whole schmeer */
L
Linus Torvalds 已提交
1277 1278 1279 1280 1281 1282 1283
	stat = cdrom_read_tocentry(drive, toc->hdr.first_track, 1, 0,
				  (char *)&toc->hdr,
				   sizeof(struct atapi_toc_header) +
				   (ntracks + 1) *
				   sizeof(struct atapi_toc_entry), sense);

	if (stat && toc->hdr.first_track > 1) {
B
Borislav Petkov 已提交
1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295
		/*
		 * Cds with CDI tracks only don't have any TOC entries, despite
		 * of this the returned values are
		 * first_track == last_track = number of CDI tracks + 1,
		 * so that this case is indistinguishable from the same layout
		 * plus an additional audio track. If we get an error for the
		 * regular case, we assume a CDI without additional audio
		 * tracks. In this case the readable TOC is empty (CDI tracks
		 * are not included) and only holds the Leadout entry.
		 *
		 * Heiko Eißfeldt.
		 */
L
Linus Torvalds 已提交
1296 1297 1298 1299 1300 1301 1302
		ntracks = 0;
		stat = cdrom_read_tocentry(drive, CDROM_LEADOUT, 1, 0,
					   (char *)&toc->hdr,
					   sizeof(struct atapi_toc_header) +
					   (ntracks + 1) *
					   sizeof(struct atapi_toc_entry),
					   sense);
1303
		if (stat)
L
Linus Torvalds 已提交
1304
			return stat;
1305

1306
		if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) {
A
Adrian Bunk 已提交
1307 1308
			toc->hdr.first_track = (u8)bin2bcd(CDROM_LEADOUT);
			toc->hdr.last_track = (u8)bin2bcd(CDROM_LEADOUT);
1309
		} else {
L
Linus Torvalds 已提交
1310 1311 1312 1313 1314 1315 1316 1317
			toc->hdr.first_track = CDROM_LEADOUT;
			toc->hdr.last_track = CDROM_LEADOUT;
		}
	}

	if (stat)
		return stat;

1318
	toc->hdr.toc_length = be16_to_cpu(toc->hdr.toc_length);
L
Linus Torvalds 已提交
1319

1320
	if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) {
A
Adrian Bunk 已提交
1321 1322
		toc->hdr.first_track = bcd2bin(toc->hdr.first_track);
		toc->hdr.last_track  = bcd2bin(toc->hdr.last_track);
L
Linus Torvalds 已提交
1323 1324
	}

1325
	for (i = 0; i <= ntracks; i++) {
1326 1327
		if (drive->atapi_flags & IDE_AFLAG_TOCADDR_AS_BCD) {
			if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD)
A
Adrian Bunk 已提交
1328
				toc->ent[i].track = bcd2bin(toc->ent[i].track);
L
Linus Torvalds 已提交
1329 1330
			msf_from_bcd(&toc->ent[i].addr.msf);
		}
1331 1332 1333
		toc->ent[i].addr.lba = msf_to_lba(toc->ent[i].addr.msf.minute,
						  toc->ent[i].addr.msf.second,
						  toc->ent[i].addr.msf.frame);
L
Linus Torvalds 已提交
1334 1335 1336
	}

	if (toc->hdr.first_track != CDROM_LEADOUT) {
B
Borislav Petkov 已提交
1337
		/* read the multisession information */
L
Linus Torvalds 已提交
1338 1339
		stat = cdrom_read_tocentry(drive, 0, 0, 1, (char *)&ms_tmp,
					   sizeof(ms_tmp), sense);
J
Jesper Juhl 已提交
1340 1341
		if (stat)
			return stat;
L
Linus Torvalds 已提交
1342 1343 1344

		toc->last_session_lba = be32_to_cpu(ms_tmp.ent.addr.lba);
	} else {
1345 1346
		ms_tmp.hdr.last_track = CDROM_LEADOUT;
		ms_tmp.hdr.first_track = ms_tmp.hdr.last_track;
L
Linus Torvalds 已提交
1347 1348 1349
		toc->last_session_lba = msf_to_lba(0, 2, 0); /* 0m 2s 0f */
	}

1350
	if (drive->atapi_flags & IDE_AFLAG_TOCADDR_AS_BCD) {
B
Borislav Petkov 已提交
1351
		/* re-read multisession information using MSF format */
L
Linus Torvalds 已提交
1352 1353 1354 1355 1356
		stat = cdrom_read_tocentry(drive, 0, 1, 1, (char *)&ms_tmp,
					   sizeof(ms_tmp), sense);
		if (stat)
			return stat;

1357
		msf_from_bcd(&ms_tmp.ent.addr.msf);
L
Linus Torvalds 已提交
1358
		toc->last_session_lba = msf_to_lba(ms_tmp.ent.addr.msf.minute,
1359
						   ms_tmp.ent.addr.msf.second,
L
Linus Torvalds 已提交
1360 1361 1362 1363 1364
						   ms_tmp.ent.addr.msf.frame);
	}

	toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track);

B
Borislav Petkov 已提交
1365
	/* now try to get the total cdrom capacity */
L
Linus Torvalds 已提交
1366 1367 1368 1369
	stat = cdrom_get_last_written(cdi, &last_written);
	if (!stat && (last_written > toc->capacity)) {
		toc->capacity = last_written;
		set_capacity(info->disk, toc->capacity * sectors_per_frame);
A
Alan Cox 已提交
1370
		drive->probed_capacity = toc->capacity * sectors_per_frame;
L
Linus Torvalds 已提交
1371 1372 1373
	}

	/* Remember that we've read this stuff. */
1374
	drive->atapi_flags |= IDE_AFLAG_TOC_VALID;
L
Linus Torvalds 已提交
1375 1376 1377 1378

	return 0;
}

1379
int ide_cdrom_get_capabilities(ide_drive_t *drive, u8 *buf)
E
Eric Piel 已提交
1380 1381 1382 1383
{
	struct cdrom_info *info = drive->driver_data;
	struct cdrom_device_info *cdi = &info->devinfo;
	struct packet_command cgc;
1384
	int stat, attempts = 3, size = ATAPI_CAPABILITIES_PAGE_SIZE;
E
Eric Piel 已提交
1385

B
Borislav Petkov 已提交
1386
	ide_debug_log(IDE_DBG_FUNC, "enter");
1387

1388
	if ((drive->atapi_flags & IDE_AFLAG_FULL_CAPS_PAGE) == 0)
1389
		size -= ATAPI_CAPABILITIES_PAGE_PAD_SIZE;
E
Eric Piel 已提交
1390

1391
	init_cdrom_command(&cgc, buf, size, CGC_DATA_UNKNOWN);
B
Borislav Petkov 已提交
1392 1393
	do {
		/* we seem to get stat=0x01,err=0x00 the first time (??) */
E
Eric Piel 已提交
1394 1395 1396 1397 1398 1399 1400
		stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
		if (!stat)
			break;
	} while (--attempts);
	return stat;
}

1401
void ide_cdrom_update_speed(ide_drive_t *drive, u8 *buf)
E
Eric Piel 已提交
1402
{
1403
	struct cdrom_info *cd = drive->driver_data;
1404 1405
	u16 curspeed, maxspeed;

B
Borislav Petkov 已提交
1406
	ide_debug_log(IDE_DBG_FUNC, "enter");
1407

1408
	if (drive->atapi_flags & IDE_AFLAG_LE_SPEED_FIELDS) {
1409 1410
		curspeed = le16_to_cpup((__le16 *)&buf[8 + 14]);
		maxspeed = le16_to_cpup((__le16 *)&buf[8 + 8]);
E
Eric Piel 已提交
1411
	} else {
1412 1413
		curspeed = be16_to_cpup((__be16 *)&buf[8 + 14]);
		maxspeed = be16_to_cpup((__be16 *)&buf[8 + 8]);
E
Eric Piel 已提交
1414
	}
1415

B
Borislav Petkov 已提交
1416 1417
	ide_debug_log(IDE_DBG_PROBE, "curspeed: %u, maxspeed: %u",
				     curspeed, maxspeed);
B
Borislav Petkov 已提交
1418

1419 1420
	cd->current_speed = (curspeed + (176/2)) / 176;
	cd->max_speed = (maxspeed + (176/2)) / 176;
E
Eric Piel 已提交
1421 1422
}

1423 1424 1425 1426 1427 1428
#define IDE_CD_CAPABILITIES \
	(CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK | CDC_SELECT_SPEED | \
	 CDC_SELECT_DISC | CDC_MULTI_SESSION | CDC_MCN | CDC_MEDIA_CHANGED | \
	 CDC_PLAY_AUDIO | CDC_RESET | CDC_DRIVE_STATUS | CDC_CD_R | \
	 CDC_CD_RW | CDC_DVD | CDC_DVD_R | CDC_DVD_RAM | CDC_GENERIC_PACKET | \
	 CDC_MO_DRIVE | CDC_MRW | CDC_MRW_W | CDC_RAM)
L
Linus Torvalds 已提交
1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441

static struct cdrom_device_ops ide_cdrom_dops = {
	.open			= ide_cdrom_open_real,
	.release		= ide_cdrom_release_real,
	.drive_status		= ide_cdrom_drive_status,
	.media_changed		= ide_cdrom_check_media_change_real,
	.tray_move		= ide_cdrom_tray_move,
	.lock_door		= ide_cdrom_lock_door,
	.select_speed		= ide_cdrom_select_speed,
	.get_last_session	= ide_cdrom_get_last_session,
	.get_mcn		= ide_cdrom_get_mcn,
	.reset			= ide_cdrom_reset,
	.audio_ioctl		= ide_cdrom_audio_ioctl,
1442
	.capability		= IDE_CD_CAPABILITIES,
L
Linus Torvalds 已提交
1443 1444 1445
	.generic_packet		= ide_cdrom_packet,
};

1446
static int ide_cdrom_register(ide_drive_t *drive, int nslots)
L
Linus Torvalds 已提交
1447 1448 1449 1450
{
	struct cdrom_info *info = drive->driver_data;
	struct cdrom_device_info *devinfo = &info->devinfo;

B
Borislav Petkov 已提交
1451
	ide_debug_log(IDE_DBG_PROBE, "nslots: %d", nslots);
1452

L
Linus Torvalds 已提交
1453
	devinfo->ops = &ide_cdrom_dops;
1454
	devinfo->speed = info->current_speed;
L
Linus Torvalds 已提交
1455
	devinfo->capacity = nslots;
J
Jesper Juhl 已提交
1456
	devinfo->handle = drive;
L
Linus Torvalds 已提交
1457 1458
	strcpy(devinfo->name, drive->name);

1459
	if (drive->atapi_flags & IDE_AFLAG_NO_SPEED_SELECT)
1460 1461
		devinfo->mask |= CDC_SELECT_SPEED;

L
Linus Torvalds 已提交
1462 1463 1464 1465
	devinfo->disk = info->disk;
	return register_cdrom(devinfo);
}

1466
static int ide_cdrom_probe_capabilities(ide_drive_t *drive)
L
Linus Torvalds 已提交
1467
{
1468 1469
	struct cdrom_info *cd = drive->driver_data;
	struct cdrom_device_info *cdi = &cd->devinfo;
1470 1471
	u8 buf[ATAPI_CAPABILITIES_PAGE_SIZE];
	mechtype_t mechtype;
L
Linus Torvalds 已提交
1472 1473
	int nslots = 1;

B
Borislav Petkov 已提交
1474 1475
	ide_debug_log(IDE_DBG_PROBE, "media: 0x%x, atapi_flags: 0x%lx",
				     drive->media, drive->atapi_flags);
1476

1477 1478 1479 1480
	cdi->mask = (CDC_CD_R | CDC_CD_RW | CDC_DVD | CDC_DVD_R |
		     CDC_DVD_RAM | CDC_SELECT_DISC | CDC_PLAY_AUDIO |
		     CDC_MO_DRIVE | CDC_RAM);

L
Linus Torvalds 已提交
1481
	if (drive->media == ide_optical) {
1482
		cdi->mask &= ~(CDC_MO_DRIVE | CDC_RAM);
1483
		printk(KERN_ERR PFX "%s: ATAPI magneto-optical drive\n",
1484
				drive->name);
L
Linus Torvalds 已提交
1485 1486 1487
		return nslots;
	}

1488 1489
	if (drive->atapi_flags & IDE_AFLAG_PRE_ATAPI12) {
		drive->atapi_flags &= ~IDE_AFLAG_NO_EJECT;
1490
		cdi->mask &= ~CDC_PLAY_AUDIO;
L
Linus Torvalds 已提交
1491 1492 1493 1494
		return nslots;
	}

	/*
B
Borislav Petkov 已提交
1495 1496 1497 1498
	 * We have to cheat a little here. the packet will eventually be queued
	 * with ide_cdrom_packet(), which extracts the drive from cdi->handle.
	 * Since this device hasn't been registered with the Uniform layer yet,
	 * it can't do this. Same goes for cdi->ops.
L
Linus Torvalds 已提交
1499
	 */
J
Jesper Juhl 已提交
1500
	cdi->handle = drive;
L
Linus Torvalds 已提交
1501 1502
	cdi->ops = &ide_cdrom_dops;

1503
	if (ide_cdrom_get_capabilities(drive, buf))
L
Linus Torvalds 已提交
1504 1505
		return 0;

1506
	if ((buf[8 + 6] & 0x01) == 0)
1507
		drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING;
1508
	if (buf[8 + 6] & 0x08)
1509
		drive->atapi_flags &= ~IDE_AFLAG_NO_EJECT;
1510
	if (buf[8 + 3] & 0x01)
1511
		cdi->mask &= ~CDC_CD_R;
1512
	if (buf[8 + 3] & 0x02)
1513
		cdi->mask &= ~(CDC_CD_RW | CDC_RAM);
1514
	if (buf[8 + 2] & 0x38)
1515
		cdi->mask &= ~CDC_DVD;
1516
	if (buf[8 + 3] & 0x20)
1517
		cdi->mask &= ~(CDC_DVD_RAM | CDC_RAM);
1518
	if (buf[8 + 3] & 0x10)
1519
		cdi->mask &= ~CDC_DVD_R;
1520
	if ((buf[8 + 4] & 0x01) || (drive->atapi_flags & IDE_AFLAG_PLAY_AUDIO_OK))
1521
		cdi->mask &= ~CDC_PLAY_AUDIO;
1522 1523

	mechtype = buf[8 + 6] >> 5;
B
Borislav Petkov 已提交
1524 1525 1526
	if (mechtype == mechtype_caddy ||
	    mechtype == mechtype_popup ||
	    (drive->atapi_flags & IDE_AFLAG_NO_AUTOCLOSE))
1527
		cdi->mask |= CDC_CLOSE_TRAY;
L
Linus Torvalds 已提交
1528 1529

	if (cdi->sanyo_slot > 0) {
1530
		cdi->mask &= ~CDC_SELECT_DISC;
L
Linus Torvalds 已提交
1531
		nslots = 3;
1532 1533
	} else if (mechtype == mechtype_individual_changer ||
		   mechtype == mechtype_cartridge_changer) {
1534 1535
		nslots = cdrom_number_of_slots(cdi);
		if (nslots > 1)
1536
			cdi->mask &= ~CDC_SELECT_DISC;
L
Linus Torvalds 已提交
1537 1538
	}

1539
	ide_cdrom_update_speed(drive, buf);
1540

1541
	printk(KERN_INFO PFX "%s: ATAPI", drive->name);
1542 1543

	/* don't print speed if the drive reported 0 */
1544 1545
	if (cd->max_speed)
		printk(KERN_CONT " %dX", cd->max_speed);
1546

1547
	printk(KERN_CONT " %s", (cdi->mask & CDC_DVD) ? "CD-ROM" : "DVD-ROM");
L
Linus Torvalds 已提交
1548

1549 1550 1551
	if ((cdi->mask & CDC_DVD_R) == 0 || (cdi->mask & CDC_DVD_RAM) == 0)
		printk(KERN_CONT " DVD%s%s",
				 (cdi->mask & CDC_DVD_R) ? "" : "-R",
1552
				 (cdi->mask & CDC_DVD_RAM) ? "" : "/RAM");
L
Linus Torvalds 已提交
1553

1554 1555 1556 1557
	if ((cdi->mask & CDC_CD_R) == 0 || (cdi->mask & CDC_CD_RW) == 0)
		printk(KERN_CONT " CD%s%s",
				 (cdi->mask & CDC_CD_R) ? "" : "-R",
				 (cdi->mask & CDC_CD_RW) ? "" : "/RW");
L
Linus Torvalds 已提交
1558

1559 1560 1561 1562
	if ((cdi->mask & CDC_SELECT_DISC) == 0)
		printk(KERN_CONT " changer w/%d slots", nslots);
	else
		printk(KERN_CONT " drive");
L
Linus Torvalds 已提交
1563

1564 1565
	printk(KERN_CONT ", %dkB Cache\n",
			 be16_to_cpup((__be16 *)&buf[8 + 12]));
L
Linus Torvalds 已提交
1566 1567 1568 1569

	return nslots;
}

B
Borislav Petkov 已提交
1570
/* standard prep_rq_fn that builds 10 byte cmds */
1571
static int ide_cdrom_prep_fs(struct request_queue *q, struct request *rq)
L
Linus Torvalds 已提交
1572 1573 1574 1575 1576
{
	int hard_sect = queue_hardsect_size(q);
	long block = (long)rq->hard_sector / (hard_sect >> 9);
	unsigned long blocks = rq->hard_nr_sectors / (hard_sect >> 9);

1577
	memset(rq->cmd, 0, BLK_MAX_CDB);
L
Linus Torvalds 已提交
1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608

	if (rq_data_dir(rq) == READ)
		rq->cmd[0] = GPCMD_READ_10;
	else
		rq->cmd[0] = GPCMD_WRITE_10;

	/*
	 * fill in lba
	 */
	rq->cmd[2] = (block >> 24) & 0xff;
	rq->cmd[3] = (block >> 16) & 0xff;
	rq->cmd[4] = (block >>  8) & 0xff;
	rq->cmd[5] = block & 0xff;

	/*
	 * and transfer length
	 */
	rq->cmd[7] = (blocks >> 8) & 0xff;
	rq->cmd[8] = blocks & 0xff;
	rq->cmd_len = 10;
	return BLKPREP_OK;
}

/*
 * Most of the SCSI commands are supported directly by ATAPI devices.
 * This transform handles the few exceptions.
 */
static int ide_cdrom_prep_pc(struct request *rq)
{
	u8 *c = rq->cmd;

B
Borislav Petkov 已提交
1609
	/* transform 6-byte read/write commands to the 10-byte version */
L
Linus Torvalds 已提交
1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630
	if (c[0] == READ_6 || c[0] == WRITE_6) {
		c[8] = c[4];
		c[5] = c[3];
		c[4] = c[2];
		c[3] = c[1] & 0x1f;
		c[2] = 0;
		c[1] &= 0xe0;
		c[0] += (READ_10 - READ_6);
		rq->cmd_len = 10;
		return BLKPREP_OK;
	}

	/*
	 * it's silly to pretend we understand 6-byte sense commands, just
	 * reject with ILLEGAL_REQUEST and the caller should take the
	 * appropriate action
	 */
	if (c[0] == MODE_SENSE || c[0] == MODE_SELECT) {
		rq->errors = ILLEGAL_REQUEST;
		return BLKPREP_KILL;
	}
1631

L
Linus Torvalds 已提交
1632 1633 1634
	return BLKPREP_OK;
}

1635
static int ide_cdrom_prep_fn(struct request_queue *q, struct request *rq)
L
Linus Torvalds 已提交
1636
{
1637
	if (blk_fs_request(rq))
L
Linus Torvalds 已提交
1638
		return ide_cdrom_prep_fs(q, rq);
1639
	else if (blk_pc_request(rq))
L
Linus Torvalds 已提交
1640 1641 1642 1643 1644
		return ide_cdrom_prep_pc(rq);

	return 0;
}

1645 1646 1647 1648 1649 1650
struct cd_list_entry {
	const char	*id_model;
	const char	*id_firmware;
	unsigned int	cd_flags;
};

1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661
#ifdef CONFIG_IDE_PROC_FS
static sector_t ide_cdrom_capacity(ide_drive_t *drive)
{
	unsigned long capacity, sectors_per_frame;

	if (cdrom_read_capacity(drive, &capacity, &sectors_per_frame, NULL))
		return 0;

	return capacity * sectors_per_frame;
}

1662 1663
static int proc_idecd_read_capacity(char *page, char **start, off_t off,
					int count, int *eof, void *data)
1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676
{
	ide_drive_t *drive = data;
	int len;

	len = sprintf(page, "%llu\n", (long long)ide_cdrom_capacity(drive));
	PROC_IDE_READ_RETURN(page, start, off, count, eof, len);
}

static ide_proc_entry_t idecd_proc[] = {
	{ "capacity", S_IFREG|S_IRUGO, proc_idecd_read_capacity, NULL },
	{ NULL, 0, NULL, NULL }
};

1677 1678 1679 1680 1681 1682 1683
static ide_proc_entry_t *ide_cd_proc_entries(ide_drive_t *drive)
{
	return idecd_proc;
}

static const struct ide_proc_devset *ide_cd_proc_devsets(ide_drive_t *drive)
{
1684
	return NULL;
1685
}
1686 1687
#endif

1688 1689
static const struct cd_list_entry ide_cd_quirks_list[] = {
	/* Limit transfer size per interrupt. */
1690 1691
	{ "SAMSUNG CD-ROM SCR-2430", NULL,   IDE_AFLAG_LIMIT_NFRAMES	     },
	{ "SAMSUNG CD-ROM SCR-2432", NULL,   IDE_AFLAG_LIMIT_NFRAMES	     },
1692
	/* SCR-3231 doesn't support the SET_CD_SPEED command. */
1693
	{ "SAMSUNG CD-ROM SCR-3231", NULL,   IDE_AFLAG_NO_SPEED_SELECT	     },
1694
	/* Old NEC260 (not R) was released before ATAPI 1.2 spec. */
1695 1696
	{ "NEC CD-ROM DRIVE:260",    "1.01", IDE_AFLAG_TOCADDR_AS_BCD |
					     IDE_AFLAG_PRE_ATAPI12,	     },
1697
	/* Vertos 300, some versions of this drive like to talk BCD. */
1698
	{ "V003S0DS",		     NULL,   IDE_AFLAG_VERTOS_300_SSD,	     },
1699
	/* Vertos 600 ESD. */
1700
	{ "V006E0DS",		     NULL,   IDE_AFLAG_VERTOS_600_ESD,	     },
1701 1702 1703 1704
	/*
	 * Sanyo 3 CD changer uses a non-standard command for CD changing
	 * (by default standard ATAPI support for CD changers is used).
	 */
1705 1706 1707
	{ "CD-ROM CDR-C3 G",	     NULL,   IDE_AFLAG_SANYO_3CD	     },
	{ "CD-ROM CDR-C3G",	     NULL,   IDE_AFLAG_SANYO_3CD	     },
	{ "CD-ROM CDR_C36",	     NULL,   IDE_AFLAG_SANYO_3CD	     },
1708
	/* Stingray 8X CD-ROM. */
1709
	{ "STINGRAY 8422 IDE 8X CD-ROM 7-27-95", NULL, IDE_AFLAG_PRE_ATAPI12 },
1710 1711 1712 1713
	/*
	 * ACER 50X CD-ROM and WPI 32X CD-ROM require the full spec length
	 * mode sense page capabilities size, but older drives break.
	 */
1714 1715
	{ "ATAPI CD ROM DRIVE 50X MAX",	NULL,	IDE_AFLAG_FULL_CAPS_PAGE     },
	{ "WPI CDS-32X",		NULL,	IDE_AFLAG_FULL_CAPS_PAGE     },
1716
	/* ACER/AOpen 24X CD-ROM has the speed fields byte-swapped. */
1717
	{ "",			     "241N", IDE_AFLAG_LE_SPEED_FIELDS       },
1718 1719 1720 1721
	/*
	 * Some drives used by Apple don't advertise audio play
	 * but they do support reading TOC & audio datas.
	 */
1722 1723 1724 1725 1726
	{ "MATSHITADVD-ROM SR-8187", NULL,   IDE_AFLAG_PLAY_AUDIO_OK	     },
	{ "MATSHITADVD-ROM SR-8186", NULL,   IDE_AFLAG_PLAY_AUDIO_OK	     },
	{ "MATSHITADVD-ROM SR-8176", NULL,   IDE_AFLAG_PLAY_AUDIO_OK	     },
	{ "MATSHITADVD-ROM SR-8174", NULL,   IDE_AFLAG_PLAY_AUDIO_OK	     },
	{ "Optiarc DVD RW AD-5200A", NULL,   IDE_AFLAG_PLAY_AUDIO_OK	     },
1727
	{ "Optiarc DVD RW AD-7200A", NULL,   IDE_AFLAG_PLAY_AUDIO_OK	     },
B
Borislav Petkov 已提交
1728
	{ "Optiarc DVD RW AD-7543A", NULL,   IDE_AFLAG_NO_AUTOCLOSE	     },
1729
	{ "TEAC CD-ROM CD-224E",     NULL,   IDE_AFLAG_NO_AUTOCLOSE	     },
1730 1731 1732
	{ NULL, NULL, 0 }
};

1733
static unsigned int ide_cd_flags(u16 *id)
1734 1735 1736 1737
{
	const struct cd_list_entry *cle = ide_cd_quirks_list;

	while (cle->id_model) {
1738
		if (strcmp(cle->id_model, (char *)&id[ATA_ID_PROD]) == 0 &&
1739
		    (cle->id_firmware == NULL ||
1740
		     strstr((char *)&id[ATA_ID_FW_REV], cle->id_firmware)))
1741 1742 1743 1744 1745 1746 1747
			return cle->cd_flags;
		cle++;
	}

	return 0;
}

1748
static int ide_cdrom_setup(ide_drive_t *drive)
L
Linus Torvalds 已提交
1749
{
1750 1751
	struct cdrom_info *cd = drive->driver_data;
	struct cdrom_device_info *cdi = &cd->devinfo;
1752 1753
	u16 *id = drive->id;
	char *fw_rev = (char *)&id[ATA_ID_FW_REV];
L
Linus Torvalds 已提交
1754 1755
	int nslots;

B
Borislav Petkov 已提交
1756
	ide_debug_log(IDE_DBG_PROBE, "enter");
1757

L
Linus Torvalds 已提交
1758 1759
	blk_queue_prep_rq(drive->queue, ide_cdrom_prep_fn);
	blk_queue_dma_alignment(drive->queue, 31);
1760
	blk_queue_update_dma_pad(drive->queue, 15);
L
Linus Torvalds 已提交
1761 1762 1763 1764
	drive->queue->unplug_delay = (1 * HZ) / 1000;
	if (!drive->queue->unplug_delay)
		drive->queue->unplug_delay = 1;

1765 1766
	drive->dev_flags |= IDE_DFLAG_MEDIA_CHANGED;
	drive->atapi_flags = IDE_AFLAG_NO_EJECT | ide_cd_flags(id);
L
Linus Torvalds 已提交
1767

1768
	if ((drive->atapi_flags & IDE_AFLAG_VERTOS_300_SSD) &&
1769
	    fw_rev[4] == '1' && fw_rev[6] <= '2')
1770 1771 1772
		drive->atapi_flags |= (IDE_AFLAG_TOCTRACKS_AS_BCD |
				     IDE_AFLAG_TOCADDR_AS_BCD);
	else if ((drive->atapi_flags & IDE_AFLAG_VERTOS_600_ESD) &&
1773
		 fw_rev[4] == '1' && fw_rev[6] <= '2')
1774 1775
		drive->atapi_flags |= IDE_AFLAG_TOCTRACKS_AS_BCD;
	else if (drive->atapi_flags & IDE_AFLAG_SANYO_3CD)
B
Borislav Petkov 已提交
1776 1777
		/* 3 => use CD in slot 0 */
		cdi->sanyo_slot = 3;
L
Linus Torvalds 已提交
1778

1779
	nslots = ide_cdrom_probe_capabilities(drive);
L
Linus Torvalds 已提交
1780

B
Borislav Petkov 已提交
1781
	/* set correct block size */
L
Linus Torvalds 已提交
1782 1783 1784
	blk_queue_hardsect_size(drive->queue, CD_FRAMESIZE);

	if (ide_cdrom_register(drive, nslots)) {
1785
		printk(KERN_ERR PFX "%s: %s failed to register device with the"
1786
				" cdrom driver.\n", drive->name, __func__);
1787
		cd->devinfo.handle = NULL;
L
Linus Torvalds 已提交
1788 1789
		return 1;
	}
1790 1791

	ide_proc_register_driver(drive, cd->driver);
L
Linus Torvalds 已提交
1792 1793 1794
	return 0;
}

1795
static void ide_cd_remove(ide_drive_t *drive)
L
Linus Torvalds 已提交
1796 1797 1798
{
	struct cdrom_info *info = drive->driver_data;

B
Borislav Petkov 已提交
1799
	ide_debug_log(IDE_DBG_FUNC, "enter");
1800

1801
	ide_proc_unregister_driver(drive, info->driver);
1802
	device_del(&info->dev);
L
Linus Torvalds 已提交
1803 1804
	del_gendisk(info->disk);

1805 1806 1807
	mutex_lock(&idecd_ref_mutex);
	put_device(&info->dev);
	mutex_unlock(&idecd_ref_mutex);
L
Linus Torvalds 已提交
1808 1809
}

1810
static void ide_cd_release(struct device *dev)
L
Linus Torvalds 已提交
1811
{
1812
	struct cdrom_info *info = to_ide_drv(dev, cdrom_info);
L
Linus Torvalds 已提交
1813 1814 1815 1816
	struct cdrom_device_info *devinfo = &info->devinfo;
	ide_drive_t *drive = info->drive;
	struct gendisk *g = info->disk;

B
Borislav Petkov 已提交
1817
	ide_debug_log(IDE_DBG_FUNC, "enter");
1818

1819
	kfree(info->toc);
1820 1821
	if (devinfo->handle == drive)
		unregister_cdrom(devinfo);
L
Linus Torvalds 已提交
1822 1823 1824 1825 1826 1827 1828
	drive->driver_data = NULL;
	blk_queue_prep_rq(drive->queue, NULL);
	g->private_data = NULL;
	put_disk(g);
	kfree(info);
}

1829
static int ide_cd_probe(ide_drive_t *);
L
Linus Torvalds 已提交
1830

1831
static struct ide_driver ide_cdrom_driver = {
1832
	.gen_driver = {
1833
		.owner		= THIS_MODULE,
1834 1835 1836
		.name		= "ide-cdrom",
		.bus		= &ide_bus_type,
	},
1837 1838
	.probe			= ide_cd_probe,
	.remove			= ide_cd_remove,
L
Linus Torvalds 已提交
1839
	.version		= IDECD_VERSION,
1840
	.do_request		= ide_cd_do_request,
1841
#ifdef CONFIG_IDE_PROC_FS
1842 1843
	.proc_entries		= ide_cd_proc_entries,
	.proc_devsets		= ide_cd_proc_devsets,
1844
#endif
L
Linus Torvalds 已提交
1845 1846
};

A
Al Viro 已提交
1847
static int idecd_open(struct block_device *bdev, fmode_t mode)
L
Linus Torvalds 已提交
1848
{
A
Al Viro 已提交
1849
	struct cdrom_info *info = ide_cd_get(bdev->bd_disk);
L
Linus Torvalds 已提交
1850 1851
	int rc = -ENOMEM;

1852
	if (!info)
L
Linus Torvalds 已提交
1853 1854
		return -ENXIO;

A
Al Viro 已提交
1855
	rc = cdrom_open(&info->devinfo, bdev, mode);
L
Linus Torvalds 已提交
1856 1857 1858 1859 1860 1861 1862

	if (rc < 0)
		ide_cd_put(info);

	return rc;
}

A
Al Viro 已提交
1863
static int idecd_release(struct gendisk *disk, fmode_t mode)
L
Linus Torvalds 已提交
1864
{
B
Borislav Petkov 已提交
1865
	struct cdrom_info *info = ide_drv_g(disk, cdrom_info);
L
Linus Torvalds 已提交
1866

A
Al Viro 已提交
1867
	cdrom_release(&info->devinfo, mode);
L
Linus Torvalds 已提交
1868 1869 1870 1871 1872 1873

	ide_cd_put(info);

	return 0;
}

1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898
static int idecd_set_spindown(struct cdrom_device_info *cdi, unsigned long arg)
{
	struct packet_command cgc;
	char buffer[16];
	int stat;
	char spindown;

	if (copy_from_user(&spindown, (void __user *)arg, sizeof(char)))
		return -EFAULT;

	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);

	stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0);
	if (stat)
		return stat;

	buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f);
	return cdrom_mode_select(cdi, &cgc);
}

static int idecd_get_spindown(struct cdrom_device_info *cdi, unsigned long arg)
{
	struct packet_command cgc;
	char buffer[16];
	int stat;
1899
	char spindown;
1900 1901 1902 1903 1904 1905 1906 1907

	init_cdrom_command(&cgc, buffer, sizeof(buffer), CGC_DATA_UNKNOWN);

	stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0);
	if (stat)
		return stat;

	spindown = buffer[11] & 0x0f;
1908
	if (copy_to_user((void __user *)arg, &spindown, sizeof(char)))
1909 1910 1911 1912
		return -EFAULT;
	return 0;
}

A
Al Viro 已提交
1913
static int idecd_ioctl(struct block_device *bdev, fmode_t mode,
L
Linus Torvalds 已提交
1914 1915
			unsigned int cmd, unsigned long arg)
{
B
Borislav Petkov 已提交
1916
	struct cdrom_info *info = ide_drv_g(bdev->bd_disk, cdrom_info);
L
Linus Torvalds 已提交
1917 1918
	int err;

1919
	switch (cmd) {
1920
	case CDROMSETSPINDOWN:
1921
		return idecd_set_spindown(&info->devinfo, arg);
1922
	case CDROMGETSPINDOWN:
1923 1924 1925
		return idecd_get_spindown(&info->devinfo, arg);
	default:
		break;
1926
	}
1927

1928
	err = generic_ide_ioctl(info->drive, bdev, cmd, arg);
L
Linus Torvalds 已提交
1929
	if (err == -EINVAL)
A
Al Viro 已提交
1930
		err = cdrom_ioctl(&info->devinfo, bdev, mode, cmd, arg);
L
Linus Torvalds 已提交
1931 1932 1933 1934 1935 1936

	return err;
}

static int idecd_media_changed(struct gendisk *disk)
{
B
Borislav Petkov 已提交
1937
	struct cdrom_info *info = ide_drv_g(disk, cdrom_info);
L
Linus Torvalds 已提交
1938 1939 1940 1941 1942
	return cdrom_media_changed(&info->devinfo);
}

static int idecd_revalidate_disk(struct gendisk *disk)
{
B
Borislav Petkov 已提交
1943
	struct cdrom_info *info = ide_drv_g(disk, cdrom_info);
L
Linus Torvalds 已提交
1944
	struct request_sense sense;
1945 1946 1947

	ide_cd_read_toc(info->drive, &sense);

L
Linus Torvalds 已提交
1948 1949 1950 1951
	return  0;
}

static struct block_device_operations idecd_ops = {
1952
	.owner			= THIS_MODULE,
A
Al Viro 已提交
1953 1954 1955
	.open			= idecd_open,
	.release		= idecd_release,
	.locked_ioctl		= idecd_ioctl,
1956 1957
	.media_changed		= idecd_media_changed,
	.revalidate_disk	= idecd_revalidate_disk
L
Linus Torvalds 已提交
1958 1959
};

B
Borislav Petkov 已提交
1960
/* module options */
1961
static char *ignore;
L
Linus Torvalds 已提交
1962
module_param(ignore, charp, 0400);
1963 1964 1965 1966

static unsigned long debug_mask;
module_param(debug_mask, ulong, 0644);

L
Linus Torvalds 已提交
1967 1968
MODULE_DESCRIPTION("ATAPI CD-ROM Driver");

1969
static int ide_cd_probe(ide_drive_t *drive)
L
Linus Torvalds 已提交
1970 1971 1972 1973 1974
{
	struct cdrom_info *info;
	struct gendisk *g;
	struct request_sense sense;

B
Borislav Petkov 已提交
1975 1976
	ide_debug_log(IDE_DBG_PROBE, "driver_req: %s, media: 0x%x",
				     drive->driver_req, drive->media);
1977

L
Linus Torvalds 已提交
1978 1979
	if (!strstr("ide-cdrom", drive->driver_req))
		goto failed;
1980

L
Linus Torvalds 已提交
1981 1982
	if (drive->media != ide_cdrom && drive->media != ide_optical)
		goto failed;
1983

L
Linus Torvalds 已提交
1984 1985 1986
	/* skip drives that we were told to ignore */
	if (ignore != NULL) {
		if (strstr(ignore, drive->name)) {
1987
			printk(KERN_INFO PFX "ignoring drive %s\n",
1988
					 drive->name);
L
Linus Torvalds 已提交
1989 1990 1991
			goto failed;
		}
	}
1992 1993

	drive->debug_mask = debug_mask;
1994
	drive->irq_handler = cdrom_newpc_intr;
1995

1996
	info = kzalloc(sizeof(struct cdrom_info), GFP_KERNEL);
L
Linus Torvalds 已提交
1997
	if (info == NULL) {
1998
		printk(KERN_ERR PFX "%s: Can't allocate a cdrom structure\n",
1999
				drive->name);
L
Linus Torvalds 已提交
2000 2001 2002 2003 2004 2005 2006 2007 2008
		goto failed;
	}

	g = alloc_disk(1 << PARTN_BITS);
	if (!g)
		goto out_free_cd;

	ide_init_disk(g, drive);

2009 2010 2011 2012 2013 2014
	info->dev.parent = &drive->gendev;
	info->dev.release = ide_cd_release;
	dev_set_name(&info->dev, dev_name(&drive->gendev));

	if (device_register(&info->dev))
		goto out_free_disk;
L
Linus Torvalds 已提交
2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027

	info->drive = drive;
	info->driver = &ide_cdrom_driver;
	info->disk = g;

	g->private_data = &info->driver;

	drive->driver_data = info;

	g->minors = 1;
	g->driverfs_dev = &drive->gendev;
	g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE;
	if (ide_cdrom_setup(drive)) {
2028
		put_device(&info->dev);
L
Linus Torvalds 已提交
2029 2030 2031
		goto failed;
	}

2032
	ide_cd_read_toc(drive, &sense);
L
Linus Torvalds 已提交
2033 2034 2035 2036 2037
	g->fops = &idecd_ops;
	g->flags |= GENHD_FL_REMOVABLE;
	add_disk(g);
	return 0;

2038 2039
out_free_disk:
	put_disk(g);
L
Linus Torvalds 已提交
2040 2041 2042
out_free_cd:
	kfree(info);
failed:
2043
	return -ENODEV;
L
Linus Torvalds 已提交
2044 2045 2046 2047
}

static void __exit ide_cdrom_exit(void)
{
2048
	driver_unregister(&ide_cdrom_driver.gen_driver);
L
Linus Torvalds 已提交
2049
}
2050 2051

static int __init ide_cdrom_init(void)
L
Linus Torvalds 已提交
2052
{
2053
	printk(KERN_INFO DRV_NAME " driver " IDECD_VERSION "\n");
2054
	return driver_register(&ide_cdrom_driver.gen_driver);
L
Linus Torvalds 已提交
2055 2056
}

2057
MODULE_ALIAS("ide:*m-cdrom*");
2058
MODULE_ALIAS("ide-cd");
L
Linus Torvalds 已提交
2059 2060 2061
module_init(ide_cdrom_init);
module_exit(ide_cdrom_exit);
MODULE_LICENSE("GPL");