dvd-2.2.13-5.diff
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:291k
- diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/drivers/block/ide-cd.c linux/drivers/block/ide-cd.c
- --- linux-2.2.13/drivers/block/ide-cd.c Fri Nov 5 15:15:33 1999
- +++ linux/drivers/block/ide-cd.c Sun Nov 7 15:15:59 1999
- @@ -2,7 +2,7 @@
- * linux/drivers/block/ide-cd.c
- * Copyright (C) 1994, 1995, 1996 scott snyder <snyder@fnald0.fnal.gov>
- * Copyright (C) 1996-1998 Erik Andersen <andersee@debian.org>
- - * Copyright (C) 1998, 1999 Jens Axboe
- + * Copyright (C) 1998, 1999 Jens Axboe <axboe@image.dk>
- *
- * May be copied or modified under the terms of the GNU General Public
- * License. See linux/COPYING for more information.
- @@ -12,29 +12,20 @@
- *
- * Suggestions are welcome. Patches that work are more welcome though. ;-)
- * For those wishing to work on this driver, please be sure you download
- - * and comply with the latest ATAPI standard. This document can be
- - * obtained by anonymous ftp from:
- - * ftp://fission.dt.wdc.com/pub/standards/SFF_atapi/spec/SFF8020-r2.6/PS/8020r26.ps
- + * and comply with the latest Mt. Fuji (SFF8090 version 4) and ATAPI
- + * (SFF-8020i rev 2.6) standards. These documents can be obtained by
- + * anonymous ftp from:
- + * ftp://fission.dt.wdc.com/pub/standards/SFF/specs/INF-8020.PDF
- + * ftp://ftp.avc-pioneer.com/Mtfuji4/Spec/Fuji4r01.pdf
- *
- - * Drives that deviate from the ATAPI standard will be accomodated as much
- + * Drives that deviate from these standards will be accomodated as much
- * as possible via compile time or command-line options. Since I only have
- * a few drives, you generally need to send me patches...
- *
- * ----------------------------------
- * TO DO LIST:
- - * -Implement Microsoft Media Status Notification per the spec at
- - * http://www.microsoft.com/hwdev/respec/storspec.htm
- - * This will allow us to get automagically notified when the media changes
- - * on ATAPI drives (something the stock ATAPI spec is lacking). Looks
- - * very cool. I discovered its existance the other day at work...
- - * -Query the drive to find what features are available before trying to
- - * use them (like trying to close the tray in drives that can't).
- * -Make it so that Pioneer CD DR-A24X and friends don't get screwed up on
- * boot
- - * -Integrate DVD-ROM support in driver. Thanks to Merete Gots鎑-Petersen
- - * of Pioneer Denmark for providing me with a drive for testing.
- - * -Implement Features and Profiles.
- - *
- *
- * ----------------------------------
- * 1.00 Oct 31, 1994 -- Initial version.
- @@ -243,20 +234,49 @@
- * Useful when using ide-cd in conjunction with
- * ide-scsi. TODO: non-modular way of doing the
- * same.
- - *
- - * 4.54 Sep 09, 1999 - Fixed start/stop error on some drives if the
- - * drive was locked.
- - * - Fixed read_toc header, size given was too large.
- - * - Fixed possible leaks in ioctl.
- - * - CDROMREADTOCENTRY now honors the cdte_format
- - * field, instead of forcing CDROM_LBA.
- - * - Mask out things the drive can't do instead of
- - * just telling people what the driver can do.
- + *
- + * 4.54 Aug 5, 1999 - Support for MMC2 class commands through the generic
- + * packet interface to cdrom.c.
- + * - Unified audio ioctl support, most of it.
- + * - cleaned up various deprecated verify_area().
- + * - Added ide_cdrom_packet() as the interface for
- + * the Uniform generic_packet().
- + * - bunch of other stuff, will fill in logs later.
- + * - report 1 slot for non-changers, like the other
- + * cd-rom drivers. don't report select disc for
- + * non-changers as well.
- + * - mask out audio playing, if the device can't do it.
- + *
- + * 4.55 Sep 1, 1999 - Eliminated the rest of the audio ioctls, except
- + * for CDROMREADTOC[ENTRY|HEADER]. Some of the drivers
- + * use this independently of the actual audio handling.
- + * They will disappear later when I get the time to
- + * do it cleanly.
- + * - Minimize the TOC reading - only do it when we
- + * know a media change has occured.
- + * - Moved all the CDROMREADx ioctls to the Uniform layer.
- + * - Heiko Eissfeldt <heiko@colossus.escape.de> supplied
- + * some fixes for CDI.
- + * - CD-ROM leaving door locked fix from Andries
- + * Brouwer <Andries.Brouwer@cwi.nl>
- + * - Erik Andersen <andersen@xmission.com> unified
- + * commands across the various drivers and how
- + * sense errors are handled.
- + *
- + * 4.56 Sep 12, 1999 - Removed changer support - it is now in the
- + * Uniform layer.
- + * - Added partition based multisession handling.
- + * - Mode sense and mode select moved to the
- + * Uniform layer.
- + * - Fixed a problem with WPI CDS-32X drive - it
- + * failed the capabilities
- + *
- *
- *************************************************************************/
- +
- +#define IDECD_VERSION "4.56"
-
- -#define IDECD_VERSION "4.54"
- -
- +#include <linux/config.h>
- #include <linux/module.h>
- #include <linux/types.h>
- #include <linux/kernel.h>
- @@ -266,6 +286,7 @@
- #include <linux/interrupt.h>
- #include <linux/errno.h>
- #include <linux/cdrom.h>
- +
- #include <asm/irq.h>
- #include <asm/io.h>
- #include <asm/byteorder.h>
- @@ -310,17 +331,18 @@
- uses this command to poll the drive, and we don't want
- to fill the syslog with useless errors. */
- if (failed_command &&
- - failed_command->c[0] == SCMD_READ_SUBCHANNEL)
- + failed_command->c[0] == GPCMD_READ_SUBCHANNEL)
- return;
- }
- +
- if (reqbuf->error_code == 0x70 && reqbuf->sense_key == 0x02
- - && ((reqbuf->asc == 0x3a && reqbuf->ascq == 0x00) ||
- - (reqbuf->asc == 0x04 && reqbuf->ascq == 0x01)))
- + && ((reqbuf->asc == 0x3a && reqbuf->ascq == 0x00) ||
- + (reqbuf->asc == 0x04 && reqbuf->ascq == 0x01)))
- {
- /*
- * Suppress the following errors:
- - * "Medium not present", and "in progress of becoming ready",
- - * to keep the noise level down to a dull roar.
- + * "Medium not present", "in progress of becoming ready",
- + * and "writing" to keep the noise level down to a dull roar.
- */
- return;
- }
- @@ -352,15 +374,16 @@
- s = buf;
- } else {
- int lo=0, mid, hi=ARY_LEN (sense_data_texts);
- - unsigned short key = (reqbuf->asc << 8);
- + unsigned long key = (reqbuf->sense_key << 16);
- + key |= (reqbuf->asc << 8);
- if ( ! (reqbuf->ascq >= 0x80 && reqbuf->ascq <= 0xdd) )
- key |= reqbuf->ascq;
- -
- s = NULL;
-
- while (hi > lo) {
- mid = (lo + hi) / 2;
- - if (sense_data_texts[mid].asc_ascq == key) {
- + if (sense_data_texts[mid].asc_ascq == key ||
- + sense_data_texts[mid].asc_ascq == (0xff0000|key)) {
- s = sense_data_texts[mid].text;
- break;
- }
- @@ -404,6 +427,19 @@
- printk (""n");
- }
-
- + /* The SKSV bit specifies validity of the sense_key_specific
- + * in the next two commands. It is bit 7 of the first byte.
- + * In the case of NOT_READY, if SKSV is set the drive can
- + * give us nice ETA readings.
- + */
- + if (reqbuf->sense_key == NOT_READY &&
- + (reqbuf->sense_key_specific[0] & 0x80)) {
- + int progress = (reqbuf->sense_key_specific[1] << 8 |
- + reqbuf->sense_key_specific[2]) * 100;
- + printk(" Command is %02d%% completen", progress / 0xffff);
- +
- + }
- +
- if (reqbuf->sense_key == ILLEGAL_REQUEST &&
- (reqbuf->sense_key_specific[0] & 0x80) != 0) {
- printk (" Error in %s byte %d",
- @@ -439,21 +475,6 @@
- #endif /* not VERBOSE_IDE_CD_ERRORS */
- }
-
- -
- -/* Fix up a possibly partially-processed request so that we can
- - start it over entirely, or even put it back on the request queue. */
- -static void restore_request (struct request *rq)
- -{
- - if (rq->buffer != rq->bh->b_data) {
- - int n = (rq->buffer - rq->bh->b_data) / SECTOR_SIZE;
- - rq->buffer = rq->bh->b_data;
- - rq->nr_sectors += n;
- - rq->sector -= n;
- - }
- - rq->current_nr_sectors = rq->bh->b_size >> SECTOR_BITS;
- -}
- -
- -
- static void cdrom_queue_request_sense (ide_drive_t *drive,
- struct semaphore *sem,
- struct atapi_request_sense *reqbuf,
- @@ -481,7 +502,7 @@
- len = sizeof (*reqbuf) / 4;
- len *= 4;
-
- - pc->c[0] = REQUEST_SENSE;
- + pc->c[0] = GPCMD_REQUEST_SENSE;
- pc->c[4] = (unsigned char) len;
- pc->buffer = (char *)reqbuf;
- pc->buflen = len;
- @@ -506,13 +527,12 @@
- struct packet_command *pc = (struct packet_command *)
- rq->buffer;
- cdrom_analyze_sense_data (drive,
- - (struct atapi_request_sense *)
- - (pc->buffer - pc->c[4]),
- - (struct packet_command *)
- - pc->sense_data);
- + (struct atapi_request_sense *) (pc->buffer - pc->c[4]),
- + (struct packet_command *) pc->sense_data);
- }
- if (rq->cmd == READ && !rq->current_nr_sectors)
- uptodate = 1;
- +
- ide_end_request (uptodate, HWGROUP(drive));
- }
-
- @@ -523,8 +543,9 @@
- int *stat_ret)
- {
- struct request *rq = HWGROUP(drive)->rq;
- - int stat, err, sense_key, cmd;
- -
- + int stat, cmd, err, sense_key;
- + struct packet_command *pc = (struct packet_command *) rq->buffer;
- +
- /* Check for errors. */
- stat = GET_STAT();
- *stat_ret = stat;
- @@ -532,8 +553,8 @@
- if (OK_STAT (stat, good_stat, BAD_R_STAT))
- return 0;
-
- - /* Got an error. */
- - err = IN_BYTE (IDE_ERROR_REG);
- + /* Get the IDE error register. */
- + err = GET_ERR();
- sense_key = err >> 4;
-
- if (rq == NULL)
- @@ -547,8 +568,6 @@
- from the drive (probably while trying
- to recover from a former error). Just give up. */
-
- - struct packet_command *pc = (struct packet_command *)
- - rq->buffer;
- pc->stat = 1;
- cdrom_end_request (1, drive);
- ide_error (drive, "request sense failure", stat);
- @@ -557,23 +576,11 @@
- } else if (cmd == PACKET_COMMAND) {
- /* All other functions, except for READ. */
-
- - struct packet_command *pc = (struct packet_command *)
- - rq->buffer;
- struct semaphore *sem = NULL;
-
- /* Check for tray open. */
- if (sense_key == NOT_READY) {
- cdrom_saw_media_change (drive);
- -#if 0 /* let the upper layers do the complaining */
- - /* Print an error message to the syslog.
- - Exception: don't print anything if this
- - is a read subchannel command. This is
- - because workman constantly polls the drive
- - with this command, and we don't want
- - to uselessly fill up the syslog. */
- - if (pc->c[0] != SCMD_READ_SUBCHANNEL)
- - printk ("%s: tray open or drive not readyn", drive->name);
- -#endif
- } else if (sense_key == UNIT_ATTENTION) {
- /* Check for media change. */
- cdrom_saw_media_change (drive);
- @@ -652,6 +659,20 @@
- return 1;
- }
-
- +static int cdrom_timer_expiry(ide_drive_t *drive)
- +{
- + struct request *rq = HWGROUP(drive)->rq;
- + struct packet_command *pc = (struct packet_command *) rq->buffer;
- + unsigned long wait = 0;
- +
- + /* blank and format can take an extremly long time to
- + * complete, if the IMMED bit was not set.
- + */
- + if (pc->c[0] == GPCMD_BLANK || pc->c[0] == GPCMD_FORMAT_UNIT)
- + wait = 60*60*HZ;
- +
- + return wait;
- +}
-
- /* Set up the device registers for transferring a packet command on DEV,
- expecting to later transfer XFERLEN bytes. HANDLER is the routine
- @@ -666,7 +687,7 @@
- struct cdrom_info *info = drive->driver_data;
-
- /* Wait for the controller to be idle. */
- - if (ide_wait_stat (drive, 0, BUSY_STAT, WAIT_READY)) return 1;
- + if (ide_wait_stat(drive, 0, BUSY_STAT, WAIT_READY)) return 1;
-
- if (info->dma)
- info->dma = !HWIF(drive)->dmaproc(ide_dma_read, drive);
- @@ -678,13 +699,14 @@
-
- OUT_BYTE (xferlen & 0xff, IDE_LCYL_REG);
- OUT_BYTE (xferlen >> 8 , IDE_HCYL_REG);
- - OUT_BYTE (drive->ctl, IDE_CONTROL_REG);
- + if (IDE_CONTROL_REG)
- + OUT_BYTE (drive->ctl, IDE_CONTROL_REG);
-
- if (info->dma)
- (void) (HWIF(drive)->dmaproc(ide_dma_begin, drive));
-
- if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) {
- - ide_set_handler (drive, handler, WAIT_CMD);
- + ide_set_handler (drive, handler, WAIT_CMD, cdrom_timer_expiry);
- OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG); /* packet command */
- } else {
- OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG); /* packet command */
- @@ -701,7 +723,7 @@
- HANDLER is the interrupt handler to call when the command completes
- or there's data ready. */
- static int cdrom_transfer_packet_command (ide_drive_t *drive,
- - char *cmd_buf, int cmd_len,
- + unsigned char *cmd_buf, int cmd_len,
- ide_handler_t *handler)
- {
- if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) {
- @@ -719,7 +741,7 @@
- }
-
- /* Arm the interrupt handler. */
- - ide_set_handler (drive, handler, WAIT_CMD);
- + ide_set_handler (drive, handler, WAIT_CMD, cdrom_timer_expiry);
-
- /* Send the command to the device. */
- atapi_output_bytes (drive, cmd_buf, cmd_len);
- @@ -752,25 +774,16 @@
-
- char *dest;
-
- - /* If we don't yet have a sector buffer, try to allocate one.
- - If we can't get one atomically, it's not fatal -- we'll just throw
- - the data away rather than caching it. */
- - if (info->sector_buffer == NULL) {
- - info->sector_buffer = (char *) kmalloc (SECTOR_BUFFER_SIZE,
- - GFP_ATOMIC);
- -
- - /* If we couldn't get a buffer,
- - don't try to buffer anything... */
- - if (info->sector_buffer == NULL)
- + /* If we couldn't get a buffer, don't try to buffer anything... */
- + if (info->buffer == NULL)
- sectors_to_buffer = 0;
- - }
-
- /* If this is the first sector in the buffer, remember its number. */
- if (info->nsectors_buffered == 0)
- info->sector_buffered = sector;
-
- /* Read the data into the buffer. */
- - dest = info->sector_buffer + info->nsectors_buffered * SECTOR_SIZE;
- + dest = info->buffer + info->nsectors_buffered * SECTOR_SIZE;
- while (sectors_to_buffer > 0) {
- atapi_input_bytes (drive, dest, SECTOR_SIZE);
- --sectors_to_buffer;
- @@ -787,7 +800,6 @@
- }
- }
-
- -
- /*
- * Check the contents of the interrupt reason register from the cdrom
- * and attempt to recover if there are problems. Returns 0 if everything's
- @@ -812,6 +824,12 @@
- atapi_output_bytes (drive, &dum, sizeof (dum));
- len -= sizeof (dum);
- }
- + } else if (ireason == 1) {
- + /* Some drives (ASUS) seem to tell us that status
- + * info is available. just get it and ignore.
- + */
- + GET_STAT();
- + return 0;
- } else {
- /* Drive wants a command packet, or invalid ireason... */
- printk ("%s: cdrom_read_intr: bad interrupt reason %dn",
- @@ -822,7 +840,6 @@
- return -1;
- }
-
- -
- /*
- * Interrupt routine. Called when a read request has completed.
- */
- @@ -846,13 +863,14 @@
- return;
-
- if (dma) {
- - if (!dma_error) {
- - for (i = rq->nr_sectors; i > 0;) {
- - i -= rq->current_nr_sectors;
- - ide_end_request(1, HWGROUP(drive));
- - }
- - } else
- + if (dma_error) {
- ide_error (drive, "dma error", stat);
- + return;
- + }
- + for (i = rq->nr_sectors; i > 0;) {
- + i -= rq->current_nr_sectors;
- + ide_end_request(1, HWGROUP(drive));
- + }
- return;
- }
-
- @@ -897,8 +915,7 @@
-
- /* First, figure out if we need to bit-bucket
- any of the leading sectors. */
- - nskip = MIN ((int)(rq->current_nr_sectors -
- - (rq->bh->b_size >> SECTOR_BITS)),
- + nskip = MIN ((int)(rq->current_nr_sectors - (rq->bh->b_size >> SECTOR_BITS)),
- sectors_to_transfer);
-
- while (nskip > 0) {
- @@ -924,8 +941,7 @@
- /* If the buffers are full, cache the rest of the data in our
- internal buffer. */
- if (rq->current_nr_sectors == 0) {
- - cdrom_buffer_sectors (drive,
- - rq->sector, sectors_to_transfer);
- + cdrom_buffer_sectors(drive, rq->sector, sectors_to_transfer);
- sectors_to_transfer = 0;
- } else {
- /* Transfer data to the buffers.
- @@ -937,8 +953,7 @@
- /* Read this_transfer sectors
- into the current buffer. */
- while (this_transfer > 0) {
- - atapi_input_bytes (drive,
- - rq->buffer, SECTOR_SIZE);
- + atapi_input_bytes(drive, rq->buffer, SECTOR_SIZE);
- rq->buffer += SECTOR_SIZE;
- --rq->nr_sectors;
- --rq->current_nr_sectors;
- @@ -951,10 +966,9 @@
-
- /* Done moving data!
- Wait for another interrupt. */
- - ide_set_handler (drive, &cdrom_read_intr, WAIT_CMD);
- + ide_set_handler(drive, &cdrom_read_intr, WAIT_CMD, NULL);
- }
-
- -
- /*
- * Try to satisfy some of the current read request from our cached data.
- * Returns nonzero if the request has been completed, zero otherwise.
- @@ -965,7 +979,7 @@
- struct request *rq = HWGROUP(drive)->rq;
-
- /* Can't do anything if there's no buffer. */
- - if (info->sector_buffer == NULL) return 0;
- + if (info->buffer == NULL) return 0;
-
- /* Loop while this request needs data and the next block is present
- in our cache. */
- @@ -976,7 +990,7 @@
- cdrom_end_request (1, drive);
-
- memcpy (rq->buffer,
- - info->sector_buffer +
- + info->buffer +
- (rq->sector - info->sector_buffered) * SECTOR_SIZE,
- SECTOR_SIZE);
- rq->buffer += SECTOR_SIZE;
- @@ -1011,8 +1025,6 @@
- return 0;
- }
-
- -
- -
- /*
- * Routine to send a read packet command to the drive.
- * This is usually called directly from cdrom_start_read.
- @@ -1041,14 +1053,13 @@
- nskip = (sector % SECTORS_PER_FRAME);
- if (nskip > 0) {
- /* Sanity check... */
- - if (rq->current_nr_sectors !=
- - (rq->bh->b_size >> SECTOR_BITS)) {
- - printk ("%s: cdrom_start_read_continuation: buffer botch (%ld)n",
- + if (rq->current_nr_sectors != (rq->bh->b_size >> SECTOR_BITS) &&
- + (rq->sector % CD_FRAMESIZE != 0)) {
- + printk ("%s: cdrom_start_read_continuation: buffer botch (%lu)n",
- drive->name, rq->current_nr_sectors);
- cdrom_end_request (0, drive);
- return;
- }
- -
- sector -= nskip;
- nsect += nskip;
- rq->current_nr_sectors += nskip;
- @@ -1066,7 +1077,7 @@
-
- /* Set up the command */
- memset (&pc.c, 0, sizeof (pc.c));
- - pc.c[0] = READ_10;
- + pc.c[0] = GPCMD_READ_10;
- pc.c[7] = (nframes >> 8);
- pc.c[8] = (nframes & 0xff);
- put_unaligned(htonl (frame), (unsigned int *) &pc.c[2]);
- @@ -1076,9 +1087,10 @@
- &cdrom_read_intr);
- }
-
- +
- #define IDECD_SEEK_THRESHOLD (1000) /* 1000 blocks */
- -#define IDECD_SEEK_TIMER (2 * WAIT_MIN_SLEEP) /* 40 ms */
- -#define IDECD_SEEK_TIMEOUT WAIT_CMD /* 10 sec */
- +#define IDECD_SEEK_TIMER (5 * WAIT_MIN_SLEEP) /* 100 ms */
- +#define IDECD_SEEK_TIMEOUT WAIT_CMD /* 10 sec */
-
- static void cdrom_seek_intr (ide_drive_t *drive)
- {
- @@ -1092,7 +1104,7 @@
-
- if (retry && jiffies - info->start_seek > IDECD_SEEK_TIMER) {
- if (--retry == 0) {
- - printk ("%s: disabled DSC seek overlapn", drive->name);
- + printk("%s: disabled DSC seek overlapn", drive->name);
- drive->dsc_overlap = 0;
- }
- }
- @@ -1111,8 +1123,8 @@
- frame = sector / SECTORS_PER_FRAME;
-
- memset (&pc.c, 0, sizeof (pc.c));
- - pc.c[0] = SEEK;
- - put_unaligned(htonl (frame), (unsigned int *) &pc.c[2]);
- + pc.c[0] = GPCMD_SEEK;
- + put_unaligned(cpu_to_be32(frame), (unsigned int *) &pc.c[2]);
- (void) cdrom_transfer_packet_command (drive, pc.c, sizeof (pc.c), &cdrom_seek_intr);
- }
-
- @@ -1125,6 +1137,19 @@
- cdrom_start_packet_command (drive, 0, cdrom_start_seek_continuation);
- }
-
- +/* Fix up a possibly partially-processed request so that we can
- + start it over entirely, or even put it back on the request queue. */
- +static void restore_request (struct request *rq)
- +{
- + if (rq->buffer != rq->bh->b_data) {
- + int n = (rq->buffer - rq->bh->b_data) / SECTOR_SIZE;
- + rq->buffer = rq->bh->b_data;
- + rq->nr_sectors += n;
- + rq->sector -= n;
- + }
- + rq->current_nr_sectors = rq->bh->b_size >> SECTOR_BITS;
- +}
- +
- /*
- * Start a read request from the CD-ROM.
- */
- @@ -1147,25 +1172,22 @@
- restore_request (rq);
-
- /* Satisfy whatever we can of this request from our cached sector. */
- - if (cdrom_read_from_buffer (drive))
- + if (cdrom_read_from_buffer(drive))
- return;
-
- - /* Clear the local sector buffer. */
- info->nsectors_buffered = 0;
-
- - if (drive->using_dma && (rq->sector % SECTORS_PER_FRAME == 0) && (rq->nr_sectors % SECTORS_PER_FRAME == 0))
- + /* use dma, if possible. */
- + if (drive->using_dma && (rq->sector % SECTORS_PER_FRAME == 0) &&
- + (rq->nr_sectors % SECTORS_PER_FRAME == 0))
- info->dma = 1;
- else
- info->dma = 0;
-
- /* Start sending the read request to the drive. */
- - cdrom_start_packet_command (drive, 32768,
- - cdrom_start_read_continuation);
- + cdrom_start_packet_command(drive, 32768, cdrom_start_read_continuation);
- }
-
- -
- -
- -
- /****************************************************************************
- * Execute all other packet commands.
- */
- @@ -1175,8 +1197,6 @@
- cdrom_lockdoor (ide_drive_t *drive, int lockflag,
- struct atapi_request_sense *reqbuf);
-
- -
- -
- /* Interrupt routine for packet command completion. */
- static void cdrom_pc_intr (ide_drive_t *drive)
- {
- @@ -1197,7 +1217,7 @@
- if ((stat & DRQ_STAT) == 0) {
- /* Some of the trailing request sense fields are optional, and
- some drives don't send them. Sigh. */
- - if (pc->c[0] == REQUEST_SENSE &&
- + if (pc->c[0] == GPCMD_REQUEST_SENSE &&
- pc->buflen > 0 &&
- pc->buflen <= 5) {
- while (pc->buflen > 0) {
- @@ -1224,20 +1244,10 @@
-
- /* Figure out how much data to transfer. */
- thislen = pc->buflen;
- - if (thislen < 0) thislen = -thislen;
- if (thislen > len) thislen = len;
-
- /* The drive wants to be written to. */
- if ((ireason & 3) == 0) {
- - /* Check that we want to write. */
- - if (pc->buflen > 0) {
- - printk ("%s: cdrom_pc_intr: Drive wants "
- - "to transfer data the wrong way!n",
- - drive->name);
- - pc->stat = 1;
- - thislen = 0;
- - }
- -
- /* Transfer the data. */
- atapi_output_bytes (drive, pc->buffer, thislen);
-
- @@ -1251,19 +1261,11 @@
-
- /* Keep count of how much data we've moved. */
- pc->buffer += thislen;
- - pc->buflen += thislen;
- + pc->buflen -= thislen;
- }
-
- /* Same drill for reading. */
- else if ((ireason & 3) == 2) {
- - /* Check that we want to read. */
- - if (pc->buflen < 0) {
- - printk ("%s: cdrom_pc_intr: Drive wants to "
- - "transfer data the wrong way!n",
- - drive->name);
- - pc->stat = 1;
- - thislen = 0;
- - }
-
- /* Transfer the data. */
- atapi_input_bytes (drive, pc->buffer, thislen);
- @@ -1287,7 +1289,7 @@
- }
-
- /* Now we wait for another interrupt. */
- - ide_set_handler (drive, &cdrom_pc_intr, WAIT_CMD);
- + ide_set_handler (drive, &cdrom_pc_intr, WAIT_CMD, cdrom_timer_expiry);
- }
-
-
- @@ -1310,11 +1312,8 @@
- struct cdrom_info *info = drive->driver_data;
-
- info->dma = 0;
- -
- - len = pc->buflen;
- - if (len < 0) len = -len;
- -
- pc->stat = 0;
- + len = pc->buflen;
-
- /* Start sending the command to the drive. */
- cdrom_start_packet_command (drive, len, cdrom_do_pc_continuation);
- @@ -1362,67 +1361,60 @@
- if (reqbuf->sense_key == UNIT_ATTENTION)
- cdrom_saw_media_change (drive);
- else if (reqbuf->sense_key == NOT_READY &&
- - reqbuf->asc == 4) {
- + reqbuf->asc == 4 && reqbuf->ascq != 4) {
- /* The drive is in the process of loading
- a disk. Retry, but wait a little to give
- the drive time to complete the load. */
- cdrom_sleep (HZ);
- - } else
- + } else {
- /* Otherwise, don't retry. */
- retries = 0;
- -
- + }
- --retries;
- }
-
- /* End of retry loop. */
- } while (pc->stat != 0 && retries >= 0);
-
- -
- /* Return an error if the command failed. */
- if (pc->stat != 0)
- return -EIO;
- else {
- /* The command succeeded. If it was anything other than
- a request sense, eject, or door lock command,
- - and we think that the door is presently, lock it again.
- - (The door was probably unlocked via an explicit
- + and we think that the door is presently unlocked, lock it
- + again. (The door was probably unlocked via an explicit
- CDROMEJECT ioctl.) */
- - if (CDROM_STATE_FLAGS (drive)->door_locked == 0 && drive->usage &&
- - (pc->c[0] != REQUEST_SENSE &&
- - pc->c[0] != ALLOW_MEDIUM_REMOVAL &&
- - pc->c[0] != START_STOP)) {
- + if (CDROM_STATE_FLAGS (drive)->door_locked == 0 &&
- + (pc->c[0] != GPCMD_TEST_UNIT_READY &&
- + pc->c[0] != GPCMD_REQUEST_SENSE &&
- + pc->c[0] != GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL &&
- + pc->c[0] != GPCMD_START_STOP_UNIT &&
- + pc->c[0] != GPCMD_MODE_SENSE_10 &&
- + pc->c[0] != GPCMD_MODE_SELECT_10)) {
- (void) cdrom_lockdoor (drive, 1, NULL);
- }
- return 0;
- }
- }
-
- -
- /****************************************************************************
- * cdrom driver request routine.
- */
- static
- void ide_do_rw_cdrom (ide_drive_t *drive, struct request *rq, unsigned long block)
- {
- - if (rq -> cmd == PACKET_COMMAND || rq -> cmd == REQUEST_SENSE_COMMAND)
- - cdrom_do_packet_command (drive);
- - else if (rq -> cmd == RESET_DRIVE_COMMAND) {
- - cdrom_end_request (1, drive);
- - ide_do_reset (drive);
- - return;
- - } else if (rq -> cmd != READ) {
- - printk ("ide-cd: bad cmd %dn", rq -> cmd);
- - cdrom_end_request (0, drive);
- - } else {
- - struct cdrom_info *info = drive->driver_data;
- + struct cdrom_info *info = drive->driver_data;
-
- + switch (rq->cmd) {
- + case READ: {
- if (CDROM_CONFIG_FLAGS(drive)->seeking) {
- unsigned long elpased = jiffies - info->start_seek;
- int stat = GET_STAT();
-
- if ((stat & SEEK_STAT) != SEEK_STAT) {
- if (elpased < IDECD_SEEK_TIMEOUT) {
- - ide_stall_queue (drive, IDECD_SEEK_TIMER);
- + ide_stall_queue(drive, IDECD_SEEK_TIMER);
- return;
- }
- printk ("%s: DSC timeoutn", drive->name);
- @@ -1434,6 +1426,26 @@
- else
- cdrom_start_read (drive, block);
- info->last_block = block;
- + break;
- + }
- +
- + case PACKET_COMMAND:
- + case REQUEST_SENSE_COMMAND: {
- + cdrom_do_packet_command(drive);
- + break;
- + }
- +
- + case RESET_DRIVE_COMMAND: {
- + cdrom_end_request(1, drive);
- + ide_do_reset(drive);
- + break;
- + }
- +
- + default: {
- + printk("ide-cd: bad cmd %dn", rq -> cmd);
- + cdrom_end_request(0, drive);
- + break;
- + }
- }
- }
-
- @@ -1498,17 +1510,19 @@
- struct atapi_request_sense *reqbuf)
- {
- struct packet_command pc;
- + struct cdrom_info *info = drive->driver_data;
- + struct cdrom_device_info *cdi = &info->devinfo;
-
- memset (&pc, 0, sizeof (pc));
-
- pc.sense_data = reqbuf;
- - pc.c[0] = TEST_UNIT_READY;
- + pc.c[0] = GPCMD_TEST_UNIT_READY;
-
- #if ! STANDARD_ATAPI
- /* the Sanyo 3 CD changer uses byte 7 of TEST_UNIT_READY to
- switch CDs instead of supporting the LOAD_UNLOAD opcode */
-
- - pc.c[7] = CDROM_STATE_FLAGS (drive)->sanyo_slot % 3;
- + pc.c[7] = cdi->sanyo_slot % 3;
- #endif /* not STANDARD_ATAPI */
-
- return cdrom_queue_packet_command (drive, &pc);
- @@ -1523,7 +1537,7 @@
- struct atapi_request_sense my_reqbuf;
- int stat;
- struct packet_command pc;
- -
- +
- if (reqbuf == NULL)
- reqbuf = &my_reqbuf;
-
- @@ -1534,7 +1548,7 @@
- memset (&pc, 0, sizeof (pc));
- pc.sense_data = reqbuf;
-
- - pc.c[0] = ALLOW_MEDIUM_REMOVAL;
- + pc.c[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
- pc.c[4] = (lockflag != 0);
- stat = cdrom_queue_packet_command (drive, &pc);
- }
- @@ -1569,9 +1583,9 @@
- {
- struct packet_command pc;
-
- - if (CDROM_CONFIG_FLAGS (drive)->no_eject==1 && ejectflag==0)
- + if (CDROM_CONFIG_FLAGS (drive)->no_eject && !ejectflag)
- return -EDRIVE_CANT_DO_THIS;
- -
- +
- /* reload fails on some drives, if the tray is locked */
- if (CDROM_STATE_FLAGS (drive)->door_locked && ejectflag)
- return 0;
- @@ -1579,39 +1593,8 @@
- memset (&pc, 0, sizeof (pc));
- pc.sense_data = reqbuf;
-
- - pc.c[0] = START_STOP;
- - pc.c[4] = 2 + (ejectflag != 0);
- - return cdrom_queue_packet_command (drive, &pc);
- -}
- -
- -
- -static int
- -cdrom_pause (ide_drive_t *drive, int pauseflag,
- - struct atapi_request_sense *reqbuf)
- -{
- - struct packet_command pc;
- -
- - memset (&pc, 0, sizeof (pc));
- - pc.sense_data = reqbuf;
- -
- - pc.c[0] = SCMD_PAUSE_RESUME;
- - pc.c[8] = !pauseflag;
- - return cdrom_queue_packet_command (drive, &pc);
- -}
- -
- -
- -static int
- -cdrom_startstop (ide_drive_t *drive, int startflag,
- - struct atapi_request_sense *reqbuf)
- -{
- - struct packet_command pc;
- -
- - memset (&pc, 0, sizeof (pc));
- - pc.sense_data = reqbuf;
- -
- - pc.c[0] = START_STOP;
- - pc.c[1] = 1;
- - pc.c[4] = startflag;
- + pc.c[0] = GPCMD_START_STOP_UNIT;
- + pc.c[4] = 0x02 + (ejectflag != 0);
- return cdrom_queue_packet_command (drive, &pc);
- }
-
- @@ -1620,8 +1603,8 @@
- struct atapi_request_sense *reqbuf)
- {
- struct {
- - unsigned lba;
- - unsigned blocklen;
- + __u32 lba;
- + __u32 blocklen;
- } capbuf;
-
- int stat;
- @@ -1630,13 +1613,13 @@
- memset (&pc, 0, sizeof (pc));
- pc.sense_data = reqbuf;
-
- - pc.c[0] = READ_CAPACITY;
- + pc.c[0] = GPCMD_READ_CDVD_CAPACITY;
- pc.buffer = (char *)&capbuf;
- pc.buflen = sizeof (capbuf);
-
- stat = cdrom_queue_packet_command (drive, &pc);
- if (stat == 0)
- - *capacity = ntohl (capbuf.lba);
- + *capacity = be32_to_cpu(capbuf.lba);
-
- return stat;
- }
- @@ -1654,7 +1637,7 @@
-
- pc.buffer = buf;
- pc.buflen = buflen;
- - pc.c[0] = SCMD_READ_TOC;
- + pc.c[0] = GPCMD_READ_TOC_PMA_ATIP;
- pc.c[6] = trackno;
- pc.c[7] = (buflen >> 8);
- pc.c[8] = (buflen & 0xff);
- @@ -1666,12 +1649,12 @@
-
- /* Try to read the entire TOC for the disk into our internal buffer. */
- static int
- -cdrom_read_toc (ide_drive_t *drive,
- - struct atapi_request_sense *reqbuf)
- +cdrom_read_toc (ide_drive_t *drive, struct atapi_request_sense *reqbuf)
- {
- int stat, ntracks, i;
- struct cdrom_info *info = drive->driver_data;
- struct atapi_toc *toc = info->toc;
- + int minor = drive->select.b.unit << PARTN_BITS;
- struct {
- struct atapi_toc_header hdr;
- struct atapi_toc_entry ent;
- @@ -1681,11 +1664,11 @@
- /* Try to allocate space. */
- toc = (struct atapi_toc *) kmalloc (sizeof (struct atapi_toc),
- GFP_KERNEL);
- + info->toc = toc;
- if (toc == NULL) {
- printk ("%s: No cdrom TOC buffer!n", drive->name);
- return -ENOMEM;
- }
- - info->toc = toc;
- }
-
- /* Check to see if the existing data is still valid.
- @@ -1697,8 +1680,7 @@
-
- /* First read just the header, so we know how long the TOC is. */
- stat = cdrom_read_tocentry (drive, 0, 1, 0, (char *)&toc->hdr,
- - sizeof (struct atapi_toc_header),
- - reqbuf);
- + sizeof (struct atapi_toc_header), reqbuf);
- if (stat) return stat;
-
- #if ! STANDARD_ATAPI
- @@ -1713,12 +1695,46 @@
- if (ntracks > MAX_TRACKS) ntracks = MAX_TRACKS;
-
- /* Now read the whole schmeer. */
- - stat = cdrom_read_tocentry (drive, 0, 1, 0, (char *)&toc->hdr,
- + 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),
- - reqbuf);
- + (ntracks + 1) *
- + sizeof (struct atapi_toc_entry), reqbuf);
- +
- + if (stat && toc->hdr.first_track > 1) {
- + /* 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遞eldt */
- + 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),
- + reqbuf);
- + if (stat) {
- + return stat;
- + }
- +#if ! STANDARD_ATAPI
- + if (CDROM_CONFIG_FLAGS (drive)->toctracks_as_bcd) {
- + toc->hdr.first_track = bin2bcd(CDROM_LEADOUT);
- + toc->hdr.last_track = bin2bcd(CDROM_LEADOUT);
- + } else
- +#endif /* not STANDARD_ATAPI */
- + {
- + toc->hdr.first_track = CDROM_LEADOUT;
- + toc->hdr.last_track = CDROM_LEADOUT;
- + }
- + } else if (stat) {
- + return stat;
- + }
- if (stat) return stat;
- +
- toc->hdr.toc_length = ntohs (toc->hdr.toc_length);
-
- #if ! STANDARD_ATAPI
- @@ -1742,10 +1758,18 @@
- }
-
- /* Read the multisession information. */
- - stat = cdrom_read_tocentry (drive, 0, 1, 1,
- - (char *)&ms_tmp, sizeof (ms_tmp),
- - reqbuf);
- - if (stat) return stat;
- + if (toc->hdr.first_track != CDROM_LEADOUT) {
- + /* Read the multisession information. */
- + stat = cdrom_read_tocentry (drive, 0, 1, 1,
- + (char *)&ms_tmp, sizeof (ms_tmp),
- + reqbuf);
- + if (stat) return stat;
- + } else {
- + ms_tmp.ent.addr.msf.minute = 0;
- + ms_tmp.ent.addr.msf.second = 2;
- + ms_tmp.ent.addr.msf.frame = 0;
- + ms_tmp.hdr.first_track = ms_tmp.hdr.last_track = CDROM_LEADOUT;
- + }
-
- #if ! STANDARD_ATAPI
- if (CDROM_CONFIG_FLAGS (drive)->tocaddr_as_bcd)
- @@ -1759,16 +1783,40 @@
- toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track);
-
- /* Now try to get the total cdrom capacity. */
- +#if 0
- + stat = cdrom_get_last_written(MKDEV(HWIF(drive)->major, minor),
- + (long *)&toc->capacity);
- + if (stat)
- +#endif
- stat = cdrom_read_capacity (drive, &toc->capacity, reqbuf);
- if (stat) toc->capacity = 0x1fffff;
-
- - HWIF(drive)->gd->sizes[drive->select.b.unit << PARTN_BITS]
- - = (toc->capacity * SECTORS_PER_FRAME) >> (BLOCK_SIZE_BITS - 9);
- + /* for general /dev/cdrom like mounting, one big disc */
- drive->part[0].nr_sects = toc->capacity * SECTORS_PER_FRAME;
- + HWIF(drive)->gd->sizes[minor] = (toc->capacity * SECTORS_PER_FRAME) >>
- + (BLOCK_SIZE_BITS - 9);
-
- /* Remember that we've read this stuff. */
- CDROM_STATE_FLAGS (drive)->toc_valid = 1;
-
- + /* should be "if multisession", but it does no harm. */
- + if (ntracks == 1)
- + return 0;
- +
- + /* setup each minor to respond to a session */
- + minor++;
- + i = toc->hdr.first_track;
- + while ((i <= ntracks) && ((minor & CD_PART_MASK) < CD_PART_MAX)) {
- + drive->part[minor & PARTN_MASK].start_sect = 0;
- + drive->part[minor & PARTN_MASK].nr_sects =
- + (toc->ent[i].addr.lba *
- + SECTORS_PER_FRAME) << (BLOCK_SIZE_BITS - 9);
- + HWIF(drive)->gd->sizes[minor] = (toc->ent[i].addr.lba *
- + SECTORS_PER_FRAME) >> (BLOCK_SIZE_BITS - 9);
- + i++;
- + minor++;
- + }
- +
- return 0;
- }
-
- @@ -1785,7 +1833,7 @@
-
- pc.buffer = buf;
- pc.buflen = buflen;
- - pc.c[0] = SCMD_READ_SUBCHANNEL;
- + pc.c[0] = GPCMD_READ_SUBCHANNEL;
- pc.c[1] = 2; /* MSF addressing */
- pc.c[2] = 0x40; /* request subQ data */
- pc.c[3] = format;
- @@ -1794,46 +1842,6 @@
- return cdrom_queue_packet_command (drive, &pc);
- }
-
- -
- -/* modeflag: 0 = current, 1 = changeable mask, 2 = default, 3 = saved */
- -static int
- -cdrom_mode_sense (ide_drive_t *drive, int pageno, int modeflag,
- - char *buf, int buflen,
- - struct atapi_request_sense *reqbuf)
- -{
- - struct packet_command pc;
- -
- - memset (&pc, 0, sizeof (pc));
- - pc.sense_data = reqbuf;
- -
- - pc.buffer = buf;
- - pc.buflen = buflen;
- - pc.c[0] = MODE_SENSE_10;
- - pc.c[2] = pageno | (modeflag << 6);
- - pc.c[7] = (buflen >> 8);
- - pc.c[8] = (buflen & 0xff);
- - return cdrom_queue_packet_command (drive, &pc);
- -}
- -
- -static int
- -cdrom_mode_select (ide_drive_t *drive, int pageno, char *buf, int buflen,
- - struct atapi_request_sense *reqbuf)
- -{
- - struct packet_command pc;
- -
- - memset (&pc, 0, sizeof (pc));
- - pc.sense_data = reqbuf;
- -
- - pc.buffer = buf;
- - pc.buflen = - buflen;
- - pc.c[0] = MODE_SELECT_10;
- - pc.c[1] = 0x10;
- - pc.c[2] = pageno;
- - pc.c[7] = (buflen >> 8);
- - pc.c[8] = (buflen & 0xff);
- - return cdrom_queue_packet_command (drive, &pc);
- -}
- -
- /* ATAPI cdrom drives are free to select the speed you request or any slower
- rate :-( Requesting too fast a speed will _not_ produce an error. */
- static int
- @@ -1849,7 +1857,7 @@
- else
- speed *= 177; /* Nx to kbytes/s */
-
- - pc.c[0] = SET_CD_SPEED;
- + pc.c[0] = GPCMD_SET_SPEED;
- /* Read Drive speed in kbytes/second MSB */
- pc.c[2] = (speed >> 8) & 0xff;
- /* Read Drive speed in kbytes/second LSB */
- @@ -1865,67 +1873,6 @@
- return cdrom_queue_packet_command (drive, &pc);
- }
-
- -static int
- -cdrom_play_lba_range_1 (ide_drive_t *drive, int lba_start, int lba_end,
- - struct atapi_request_sense *reqbuf)
- -{
- - struct packet_command pc;
- -
- - memset (&pc, 0, sizeof (pc));
- - pc.sense_data = reqbuf;
- -
- - pc.c[0] = SCMD_PLAYAUDIO_MSF;
- - lba_to_msf (lba_start, &pc.c[3], &pc.c[4], &pc.c[5]);
- - lba_to_msf (lba_end-1, &pc.c[6], &pc.c[7], &pc.c[8]);
- -
- -#if ! STANDARD_ATAPI
- - if (CDROM_CONFIG_FLAGS (drive)->playmsf_as_bcd) {
- - pc.c[3] = bin2bcd (pc.c[3]);
- - pc.c[4] = bin2bcd (pc.c[4]);
- - pc.c[5] = bin2bcd (pc.c[5]);
- - pc.c[6] = bin2bcd (pc.c[6]);
- - pc.c[7] = bin2bcd (pc.c[7]);
- - pc.c[8] = bin2bcd (pc.c[8]);
- - }
- -#endif /* not STANDARD_ATAPI */
- -
- - return cdrom_queue_packet_command (drive, &pc);
- -}
- -
- -
- -/* Play audio starting at LBA LBA_START and finishing with the
- - LBA before LBA_END. */
- -static int
- -cdrom_play_lba_range (ide_drive_t *drive, int lba_start, int lba_end,
- - struct atapi_request_sense *reqbuf)
- -{
- - int i, stat = 0;
- - struct atapi_request_sense my_reqbuf;
- -
- - if (reqbuf == NULL)
- - reqbuf = &my_reqbuf;
- -
- - /* Some drives, will, for certain audio cds,
- - give an error if you ask them to play the entire cd using the
- - values which are returned in the TOC. The play will succeed,
- - however, if the ending address is adjusted downwards
- - by a few frames. */
- - for (i=0; i<75; i++) {
- - stat = cdrom_play_lba_range_1 (drive, lba_start, lba_end,
- - reqbuf);
- -
- - if (stat == 0 ||
- - !(reqbuf->sense_key == ILLEGAL_REQUEST &&
- - reqbuf->asc == 0x24))
- - return stat;
- -
- - --lba_end;
- - if (lba_end <= lba_start) break;
- - }
- -
- - return stat;
- -}
- -
-
- static
- int cdrom_get_toc_entry (ide_drive_t *drive, int track,
- @@ -1933,17 +1880,12 @@
- struct atapi_request_sense *reqbuf)
- {
- struct cdrom_info *info = drive->driver_data;
- - int stat, ntracks;
- - struct atapi_toc *toc;
- -
- - /* Make sure our saved TOC is valid. */
- - stat = cdrom_read_toc (drive, reqbuf);
- - if (stat) return stat;
- -
- - toc = info->toc;
- + struct atapi_toc *toc = info->toc;
- + int ntracks;
-
- /* Check validity of requested track number. */
- ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
- + if (toc->hdr.first_track == CDROM_LEADOUT) ntracks = 0;
- if (track == CDROM_LEADOUT)
- *ent = &toc->ent[ntracks];
- else if (track < toc->hdr.first_track ||
- @@ -1956,377 +1898,72 @@
- }
-
-
- -static int
- -cdrom_read_block (ide_drive_t *drive, int format, int lba, int nblocks,
- - char *buf, int buflen,
- - struct atapi_request_sense *reqbuf)
- -{
- - struct packet_command pc;
- - struct atapi_request_sense my_reqbuf;
- -
- - if (reqbuf == NULL)
- - reqbuf = &my_reqbuf;
- -
- - memset (&pc, 0, sizeof (pc));
- - pc.sense_data = reqbuf;
-
- - pc.buffer = buf;
- - pc.buflen = buflen;
-
- -#if ! STANDARD_ATAPI
- - if (CDROM_CONFIG_FLAGS (drive)->nec260)
- - pc.c[0] = 0xd4;
- - else
- -#endif /* not STANDARD_ATAPI */
- - pc.c[0] = READ_CD;
-
- - pc.c[1] = (format << 2);
- - put_unaligned(htonl(lba), (unsigned int *) &pc.c[2]);
- - pc.c[8] = (nblocks & 0xff);
- - pc.c[7] = ((nblocks>>8) & 0xff);
- - pc.c[6] = ((nblocks>>16) & 0xff);
- - if (format <= 1)
- - pc.c[9] = 0xf8; /* returns 2352 for any format */
- - else
- - pc.c[9] = 0x10;
- +/* the generic packet interface to cdrom.c */
- +static int ide_cdrom_packet(struct cdrom_device_info *cdi,
- + struct cdrom_generic_command *cgc)
- +{
- + struct packet_command pc;
- + ide_drive_t *drive = (ide_drive_t*) cdi->handle;
-
- - return cdrom_queue_packet_command (drive, &pc);
- + /* here we queue the commands from the uniform CD-ROM
- + layer. the packet must be complete, as we do not
- + touch it at all. */
- + memset(&pc, 0, sizeof(pc));
- + memcpy(pc.c, cgc->cmd, CDROM_PACKET_SIZE);
- + pc.buffer = cgc->buffer;
- + pc.buflen = cgc->buflen;
- + return cgc->stat = cdrom_queue_packet_command(drive, &pc);
- }
-
- -
- -/* If SLOT<0, unload the current slot. Otherwise, try to load SLOT. */
- -static int
- -cdrom_load_unload (ide_drive_t *drive, int slot,
- - struct atapi_request_sense *reqbuf)
- +static
- +int ide_cdrom_dev_ioctl (struct cdrom_device_info *cdi,
- + unsigned int cmd, unsigned long arg)
- {
- -#if ! STANDARD_ATAPI
- - /* if the drive is a Sanyo 3 CD changer then TEST_UNIT_READY
- - (used in the cdrom_check_status function) is used to
- - switch CDs instead of LOAD_UNLOAD */
- -
- - if (CDROM_STATE_FLAGS (drive)->sanyo_slot > 0) {
- -
- - if ((slot == 1) || (slot == 2))
- - CDROM_STATE_FLAGS (drive)->sanyo_slot = slot;
- - else if (slot >= 0)
- - CDROM_STATE_FLAGS (drive)->sanyo_slot = 3;
- - else
- - return 0;
- -
- - return cdrom_check_status (drive, reqbuf);
- + struct cdrom_generic_command cgc;
- + char buffer[16];
- + int stat;
-
- - }
- - else
- -#endif /*not STANDARD_ATAPI */
- - {
- + init_cdrom_command(&cgc, buffer, sizeof(buffer));
-
- - /* ATAPI Rev. 2.2+ standard for requesting switching of
- - CDs in a multiplatter device */
- + /* These will be moved into the Uniform layer shortly... */
- + switch (cmd) {
- + case CDROMSETSPINDOWN: {
- + char spindown;
- +
- + if (copy_from_user(&spindown, (void *) arg, sizeof(char)))
- + return -EFAULT;
- +
- + if ((stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0)))
- + return stat;
-
- - struct packet_command pc;
- + buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f);
-
- - memset (&pc, 0, sizeof (pc));
- - pc.sense_data = reqbuf;
- -
- - pc.c[0] = LOAD_UNLOAD;
- - pc.c[4] = 2 + (slot >= 0);
- - pc.c[8] = slot;
- - return cdrom_queue_packet_command (drive, &pc);
- -
- - }
- -}
- -
- -
- -/* This gets the mechanism status per ATAPI draft spec 2.6 */
- -static int
- -cdrom_read_mech_status (ide_drive_t *drive, char *buf, int buflen,
- - struct atapi_request_sense *reqbuf)
- -{
- - struct packet_command pc;
- -
- - memset (&pc, 0, sizeof (pc));
- - pc.sense_data = reqbuf;
- -
- - pc.buffer = buf;
- - pc.buflen = buflen;
- - pc.c[0] = MECHANISM_STATUS;
- - pc.c[8] = (buflen >> 8);
- - pc.c[9] = (buflen & 0xff);
- - return cdrom_queue_packet_command (drive, &pc);
- -}
- -
- -
- -/* Read the drive mechanism status and slot table into our internal buffer.
- - If the buffer does not yet exist, allocate it. */
- -static int
- -cdrom_read_changer_info (ide_drive_t *drive)
- -{
- - int nslots;
- - struct cdrom_info *info = drive->driver_data;
- -
- - if (info->changer_info)
- - nslots = info->changer_info->hdr.nslots;
- -
- - else {
- - struct atapi_mechstat_header mechbuf;
- - int stat;
- -
- - stat = cdrom_read_mech_status (drive,
- - (char *)&mechbuf,
- - sizeof (mechbuf),
- - NULL);
- - if (stat)
- - return stat;
- -
- - nslots = mechbuf.nslots;
- - info->changer_info =
- - (struct atapi_changer_info *)
- - kmalloc (sizeof (struct atapi_changer_info) +
- - nslots * sizeof (struct atapi_slot),
- - GFP_KERNEL);
- -
- - if (info->changer_info == NULL)
- - return -ENOMEM;
- - }
- -
- - return cdrom_read_mech_status
- - (drive,
- - (char *)&info->changer_info->hdr,
- - sizeof (struct atapi_mechstat_header) +
- - nslots * sizeof (struct atapi_slot),
- - NULL);
- -}
- -
- -
- -static
- -int ide_cdrom_dev_ioctl (struct cdrom_device_info *cdi,
- - unsigned int cmd, unsigned long arg)
- -
- -{
- - ide_drive_t *drive = (ide_drive_t*) cdi->handle;
- - struct cdrom_info *info = drive->driver_data;
- -
- -
- - switch (cmd) {
- - case CDROMREADRAW:
- - case CDROMREADMODE1:
- - case CDROMREADMODE2: {
- - struct cdrom_msf msf;
- - int blocksize, format, stat, lba;
- - struct atapi_toc *toc;
- - char *buf;
- -
- - if (cmd == CDROMREADMODE1) {
- - blocksize = CD_FRAMESIZE;
- - format = 2;
- - } else { /* for RAW and MODE2. */
- - blocksize = CD_FRAMESIZE_RAW;
- - format = 0;
- - }
- -
- - copy_from_user_ret(&msf, (void *)arg, sizeof (msf), -EFAULT);
- -
- - lba = msf_to_lba(msf.cdmsf_min0,
- - msf.cdmsf_sec0,
- - msf.cdmsf_frame0);
- -
- - /* Make sure the TOC is up to date. */
- - if (cmd != CDROMREADRAW) {
- - stat = cdrom_read_toc (drive, NULL);
- - if (stat)
- - return stat;
- -
- - toc = info->toc;
- -
- - if (lba < 0 || lba >= toc->capacity)
- - return -EINVAL;
- - }
- -
- - buf = (char *) kmalloc (blocksize, GFP_KERNEL);
- - if (buf == NULL)
- - return -ENOMEM;
- -
- - stat = cdrom_read_block (drive, format, lba, 1, buf,
- - blocksize, NULL);
- -
- - if (stat == 0) {
- - if (cmd == CDROMREADMODE2) {
- - /* For Mode2, skip the Sync, Header, and Subheader */
- - if (copy_to_user((char *)arg, buf+16, CD_FRAMESIZE_RAW0))
- - stat = -EFAULT;
- - } else {
- - if (copy_to_user((char *)arg, buf, blocksize))
- - stat = -EFAULT;
- - }
- - }
- -
- - kfree (buf);
- - return stat;
- - }
- -
- - /* Read 2352 byte blocks from audio tracks. */
- - case CDROMREADAUDIO: {
- - int stat, lba;
- - struct atapi_toc *toc;
- - struct cdrom_read_audio ra;
- - char *buf;
- -
- - /* Make sure the TOC is up to date. */
- - stat = cdrom_read_toc (drive, NULL);
- - if (stat) return stat;
- -
- - toc = info->toc;
- -
- - stat = verify_area (VERIFY_READ, (char *)arg, sizeof (ra));
- - if (stat) return stat;
- -
- - copy_from_user (&ra, (void *)arg, sizeof (ra));
- -
- - if (ra.nframes < 0 || ra.nframes > toc->capacity)
- - return -EINVAL;
- - else if (ra.nframes == 0)
- - return 0;
- -
- - stat = verify_area (VERIFY_WRITE, (char *)ra.buf,
- - ra.nframes * CD_FRAMESIZE_RAW);
- - if (stat) return stat;
- -
- - if (ra.addr_format == CDROM_MSF)
- - lba = msf_to_lba (ra.addr.msf.minute,
- - ra.addr.msf.second,
- - ra.addr.msf.frame);
- - else if (ra.addr_format == CDROM_LBA)
- - lba = ra.addr.lba;
- - else
- - return -EINVAL;
- -
- - if (lba < 0 || lba >= toc->capacity)
- - return -EINVAL;
- -
- - buf = (char *) kmalloc (CDROM_NBLOCKS_BUFFER*CD_FRAMESIZE_RAW,
- - GFP_KERNEL);
- - if (buf == NULL)
- - return -ENOMEM;
- -
- - while (ra.nframes > 0) {
- - int this_nblocks = ra.nframes;
- - if (this_nblocks > CDROM_NBLOCKS_BUFFER)
- - this_nblocks = CDROM_NBLOCKS_BUFFER;
- - stat = cdrom_read_block
- - (drive, 1, lba, this_nblocks,
- - buf, this_nblocks * CD_FRAMESIZE_RAW, NULL);
- - if (stat) break;
- -
- - copy_to_user (ra.buf, buf,
- - this_nblocks * CD_FRAMESIZE_RAW);
- - ra.buf += this_nblocks * CD_FRAMESIZE_RAW;
- - ra.nframes -= this_nblocks;
- - lba += this_nblocks;
- - }
- -
- - kfree (buf);
- - return stat;
- - }
- -
- - case CDROMSETSPINDOWN: {
- - char spindown;
- - char buffer[16];
- - int stat;
- -
- - stat = verify_area (VERIFY_READ, (void *) arg,
- - sizeof (char));
- - if (stat) return stat;
- -
- - copy_from_user (&spindown, (void *) arg, sizeof(char));
- -
- - stat = cdrom_mode_sense (drive, PAGE_CDROM, 0, buffer,
- - sizeof (buffer), NULL);
- - if (stat) return stat;
- -
- - buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f);
- -
- - return cdrom_mode_select (drive, PAGE_CDROM, buffer,
- - sizeof (buffer), NULL);
- + return cdrom_mode_select(cdi, &cgc);
- }
-
- case CDROMGETSPINDOWN: {
- char spindown;
- - char buffer[16];
- - int stat;
-
- - stat = verify_area (VERIFY_WRITE, (void *) arg,
- - sizeof (char));
- - if (stat) return stat;
- -
- - stat = cdrom_mode_sense (drive, PAGE_CDROM, 0, buffer,
- - sizeof (buffer), NULL);
- - if (stat) return stat;
- + if ((stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0)))
- + return stat;
-
- spindown = buffer[11] & 0x0f;
-
- - copy_to_user ((void *) arg, &spindown, sizeof (char));
- + if (copy_to_user((void *) arg, &spindown, sizeof (char)))
- + return -EFAULT;
-
- return 0;
- }
-
- -#ifdef ALLOW_TEST_PACKETS
- - case 0x1234: {
- - int stat;
- - struct packet_command pc;
- - int len, lena;
- -
- - memset (&pc, 0, sizeof (pc));
- -
- - stat = verify_area (VERIFY_READ, (void *) arg, sizeof (pc.c));
- - if (stat) return stat;
- - copy_from_user (&pc.c, (void *) arg, sizeof (pc.c));
- - arg += sizeof (pc.c);
- -
- - stat = verify_area (VERIFY_READ, (void *) arg, sizeof (len));
- - if (stat) return stat;
- - copy_from_user (&len, (void *) arg , sizeof (len));
- - arg += sizeof (len);
- -
- - lena = len;
- - if (lena < 0) lena = -lena;
- -
- - {
- - char buf[lena];
- - if (len > 0) {
- - stat = verify_area (VERIFY_WRITE,
- - (void *) arg, len);
- - if (stat) return stat;
- - }
- - else if (len < 0) {
- - stat = verify_area (VERIFY_READ,
- - (void *) arg, -len);
- - if (stat) return stat;
- - copy_from_user (buf, (void*)arg, -len);
- - }
- -
- - if (len != 0) {
- - pc.buflen = len;
- - pc.buffer = buf;
- - }
- -
- - stat = cdrom_queue_packet_command (drive, &pc);
- -
- - if (len > 0)
- - copy_to_user ((void *)arg, buf, len);
- - }
- -
- - return stat;
- - }
- -#endif
- -
- default:
- return -EINVAL;
- }
-
- }
-
- -
- -
- static
- int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi,
- unsigned int cmd, void *arg)
- @@ -2336,47 +1973,6 @@
- struct cdrom_info *info = drive->driver_data;
-
- switch (cmd) {
- - case CDROMSUBCHNL: {
- - struct atapi_cdrom_subchnl scbuf;
- - int stat;
- - struct cdrom_subchnl *subchnl = (struct cdrom_subchnl *)arg;
- -
- - stat = cdrom_read_subchannel (drive, 1, /* current position */
- - (char *)&scbuf, sizeof (scbuf),
- - NULL);
- - if (stat) return stat;
- -
- -#if ! STANDARD_ATAPI
- - if (CDROM_CONFIG_FLAGS (drive)->subchan_as_bcd) {
- - msf_from_bcd (&scbuf.acdsc_absaddr.msf);
- - msf_from_bcd (&scbuf.acdsc_reladdr.msf);
- - }
- - if (CDROM_CONFIG_FLAGS (drive)->tocaddr_as_bcd)
- - scbuf.acdsc_trk = bcd2bin (scbuf.acdsc_trk);
- -#endif /* not STANDARD_ATAPI */
- -
- - subchnl->cdsc_absaddr.msf.minute =
- - scbuf.acdsc_absaddr.msf.minute;
- - subchnl->cdsc_absaddr.msf.second =
- - scbuf.acdsc_absaddr.msf.second;
- - subchnl->cdsc_absaddr.msf.frame =
- - scbuf.acdsc_absaddr.msf.frame;
- -
- - subchnl->cdsc_reladdr.msf.minute =
- - scbuf.acdsc_reladdr.msf.minute;
- - subchnl->cdsc_reladdr.msf.second =
- - scbuf.acdsc_reladdr.msf.second;
- - subchnl->cdsc_reladdr.msf.frame =
- - scbuf.acdsc_reladdr.msf.frame;
- -
- - subchnl->cdsc_audiostatus = scbuf.acdsc_audiostatus;
- - subchnl->cdsc_ctrl = scbuf.acdsc_ctrl;
- - subchnl->cdsc_trk = scbuf.acdsc_trk;
- - subchnl->cdsc_ind = scbuf.acdsc_ind;
- -
- - return 0;
- - }
- -
- case CDROMREADTOCHDR: {
- int stat;
- struct cdrom_tochdr *tochdr = (struct cdrom_tochdr *) arg;
- @@ -2409,120 +2005,17 @@
- &tocentry->cdte_addr.msf.minute,
- &tocentry->cdte_addr.msf.second,
- &tocentry->cdte_addr.msf.frame);
- - } else {
- + } else
- tocentry->cdte_addr.lba = toce->addr.lba;
- - }
-
- return 0;
- }
-
- - case CDROMPLAYMSF: {
- - struct cdrom_msf *msf = (struct cdrom_msf *) arg;
- - int lba_start, lba_end;
- -
- - lba_start = msf_to_lba (msf->cdmsf_min0, msf->cdmsf_sec0,
- - msf->cdmsf_frame0);
- - lba_end = msf_to_lba (msf->cdmsf_min1, msf->cdmsf_sec1,
- - msf->cdmsf_frame1) + 1;
- -
- - if (lba_end <= lba_start) return -EINVAL;
- -
- - return cdrom_play_lba_range (drive, lba_start, lba_end, NULL);
- - }
- -
- - /* Like just about every other Linux cdrom driver, we ignore the
- - index part of the request here. */
- - case CDROMPLAYTRKIND: {
- - int stat, lba_start, lba_end;
- - struct cdrom_ti *ti = (struct cdrom_ti *)arg;
- - struct atapi_toc_entry *first_toc, *last_toc;
- -
- - stat = cdrom_get_toc_entry (drive, ti->cdti_trk0, &first_toc,
- - NULL);
- - if (stat) return stat;
- - stat = cdrom_get_toc_entry (drive, ti->cdti_trk1, &last_toc,
- - NULL);
- - if (stat) return stat;
- -
- - if (ti->cdti_trk1 != CDROM_LEADOUT) ++last_toc;
- - lba_start = first_toc->addr.lba;
- - lba_end = last_toc->addr.lba;
- -
- - if (lba_end <= lba_start) return -EINVAL;
- -
- - return cdrom_play_lba_range (drive, lba_start, lba_end, NULL);
- - }
- -
- - case CDROMVOLCTRL: {
- - struct cdrom_volctrl *volctrl = (struct cdrom_volctrl *) arg;
- - char buffer[24], mask[24];
- - int stat;
- -
- - stat = cdrom_mode_sense (drive, PAGE_AUDIO, 0, buffer,
- - sizeof (buffer), NULL);
- - if (stat) return stat;
- - stat = cdrom_mode_sense (drive, PAGE_AUDIO, 1, mask,
- - sizeof (buffer), NULL);
- - if (stat) return stat;
- -
- - buffer[1] = buffer[2] = 0;
- -
- - buffer[17] = volctrl->channel0 & mask[17];
- - buffer[19] = volctrl->channel1 & mask[19];
- - buffer[21] = volctrl->channel2 & mask[21];
- - buffer[23] = volctrl->channel3 & mask[23];
- -
- - return cdrom_mode_select (drive, PAGE_AUDIO, buffer,
- - sizeof (buffer), NULL);
- - }
- -
- - case CDROMVOLREAD: {
- - struct cdrom_volctrl *volctrl = (struct cdrom_volctrl *) arg;
- - char buffer[24];
- - int stat;
- -
- - stat = cdrom_mode_sense (drive, PAGE_AUDIO, 0, buffer,
- - sizeof (buffer), NULL);
- - if (stat) return stat;
- -
- - volctrl->channel0 = buffer[17];
- - volctrl->channel1 = buffer[19];
- - volctrl->channel2 = buffer[21];
- - volctrl->channel3 = buffer[23];
- -
- - return 0;
- - }
- -
- - case CDROMSTART:
- - return cdrom_startstop (drive, 1, NULL);
- -
- - case CDROMSTOP: {
- -#ifdef IHAVEADOLPHIN
- - /* Certain Drives require this. Most don't
- - and will produce errors upon CDROMSTOP
- - pit says the Dolphin needs this. If you
- - own a dolphin, just define IHAVEADOLPHIN somewhere */
- - int stat;
- - stat = cdrom_startstop (drive, 0, NULL);
- - if (stat) return stat;
- - return cdrom_eject (drive, 1, NULL);
- -#endif /* end of IHAVEADOLPHIN */
- - return cdrom_startstop (drive, 0, NULL);
- - }
- -
- - case CDROMPAUSE:
- - return cdrom_pause (drive, 1, NULL);
- -
- - case CDROMRESUME:
- - return cdrom_pause (drive, 0, NULL);
- -
- -
- default:
- return -EINVAL;
- }
- }
-
- -
- static
- int ide_cdrom_reset (struct cdrom_device_info *cdi)
- {
- @@ -2549,7 +2042,6 @@
- return cdrom_eject (drive, !position, NULL);
- }
-
- -
- static
- int ide_cdrom_lock_door (struct cdrom_device_info *cdi, int lock)
- {
- @@ -2561,22 +2053,23 @@
- int ide_cdrom_select_speed (struct cdrom_device_info *cdi, int speed)
- {
- int stat, attempts = 3;
- - struct {
- - char pad[8];
- - struct atapi_capabilities_page cap;
- - } buf;
- ide_drive_t *drive = (ide_drive_t*) cdi->handle;
- struct atapi_request_sense reqbuf;
- + struct cdrom_generic_command cgc;
- + struct {
- + char pad[8];
- + struct atapi_capabilities_page cap;
- + } buf;
- stat=cdrom_select_speed (drive, speed, &reqbuf);
- if (stat<0)
- return stat;
-
- + init_cdrom_command(&cgc, &buf, sizeof(buf));
- /* Now with that done, update the speed fields */
- do { /* we seem to get stat=0x01,err=0x00 the first time (??) */
- if (attempts-- <= 0)
- return 0;
- - stat = cdrom_mode_sense (drive, PAGE_CAPABILITIES, 0,
- - (char *)&buf, sizeof (buf), NULL);
- + stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
- } while (stat);
-
- /* The ACER/AOpen 24X cdrom has the speed fields byte-swapped */
- @@ -2595,107 +2088,23 @@
- return 0;
- }
-
- -
- -static
- -int ide_cdrom_select_disc (struct cdrom_device_info *cdi, int slot)
- -{
- - ide_drive_t *drive = (ide_drive_t*) cdi->handle;
- - struct cdrom_info *info = drive->driver_data;
- -
- - struct atapi_request_sense my_reqbuf;
- - int stat;
- - int nslots, curslot;
- -
- - if ( ! CDROM_CONFIG_FLAGS (drive)->is_changer)
- - return -EDRIVE_CANT_DO_THIS;
- -
- -#if ! STANDARD_ATAPI
- - if (CDROM_STATE_FLAGS (drive)->sanyo_slot > 0) {
- - nslots = 3;
- - curslot = CDROM_STATE_FLAGS (drive)->sanyo_slot;
- - if (curslot == 3)
- - curslot = 0;
- - } else
- -#endif /* not STANDARD_ATAPI */
- - {
- - stat = cdrom_read_changer_info (drive);
- - if (stat)
- - return stat;
- -
- - nslots = info->changer_info->hdr.nslots;
- - curslot = info->changer_info->hdr.curslot;
- - }
- -
- - if (slot == curslot)
- - return curslot;
- -
- - if (slot == CDSL_CURRENT)
- - return curslot;
- -
- - if (slot != CDSL_NONE && (slot < 0 || slot >= nslots))
- - return -EINVAL;
- -
- - if (drive->usage > 1)
- - return -EBUSY;
- -
- - if (slot == CDSL_NONE) {
- - (void) cdrom_load_unload (drive, -1, NULL);
- - cdrom_saw_media_change (drive);
- - (void) cdrom_lockdoor (drive, 0, NULL);
- - return 0;
- - }
- - else {
- - int was_locked;
- -
- - if (
- -#if ! STANDARD_ATAPI
- - CDROM_STATE_FLAGS (drive)->sanyo_slot == 0 &&
- -#endif
- - info->changer_info->slots[slot].disc_present == 0) {
- - return -ENOMEDIUM;
- - }
- -
- - was_locked = CDROM_STATE_FLAGS (drive)->door_locked;
- - if (was_locked)
- - (void) cdrom_lockdoor (drive, 0, NULL);
- -
- - stat = cdrom_load_unload (drive, slot, NULL);
- - cdrom_saw_media_change (drive);
- - if (stat)
- - return stat;
- -
- - stat = cdrom_check_status (drive, &my_reqbuf);
- - if (stat && my_reqbuf.sense_key == NOT_READY)
- - return -ENOENT;
- -
- - if (stat == 0 || my_reqbuf.sense_key == UNIT_ATTENTION) {
- - stat = cdrom_read_toc (drive, &my_reqbuf);
- - if (stat)
- - return stat;
- - }
- -
- - if (was_locked)
- - (void) cdrom_lockdoor (drive, 1, NULL);
- -
- - return slot;
- - }
- -}
- -
- -
- static
- int ide_cdrom_drive_status (struct cdrom_device_info *cdi, int slot_nr)
- {
- ide_drive_t *drive = (ide_drive_t*) cdi->handle;
- - struct cdrom_info *info = drive->driver_data;
-
- if (slot_nr == CDSL_CURRENT) {
-
- - struct atapi_request_sense my_reqbuf;
- - int stat = cdrom_check_status (drive, &my_reqbuf);
- - if (stat == 0 || my_reqbuf.sense_key == UNIT_ATTENTION)
- + struct atapi_request_sense sense;
- + int stat = cdrom_check_status (drive, &sense);
- + if (stat == 0 || sense.sense_key == UNIT_ATTENTION)
- + return CDS_DISC_OK;
- +
- + if (sense.sense_key == NOT_READY && sense.asc == 0x04 &&
- + sense.ascq == 0x04)
- return CDS_DISC_OK;
-
- - if (my_reqbuf.sense_key == NOT_READY) {
- + if (sense.sense_key == NOT_READY) {
- /* ATAPI doesn't have anything that can help
- us decide whether the drive is really
- emtpy or the tray is just open. irk. */
- @@ -2703,24 +2112,8 @@
- }
-
- return CDS_DRIVE_NOT_READY;
- - }
- -
- -#if ! STANDARD_ATAPI
- - else if (CDROM_STATE_FLAGS (drive)->sanyo_slot > 0)
- - return CDS_NO_INFO;
- -#endif /* not STANDARD_ATAPI */
- -
- - else {
- - struct atapi_changer_info *ci;
- - int stat = cdrom_read_changer_info (drive);
- - if (stat < 0)
- - return stat;
- - ci = info->changer_info;
- -
- - if (ci->slots[slot_nr].disc_present)
- - return CDS_DISC_OK;
- - else
- - return CDS_NO_DISC;
- + } else {
- + return -EINVAL;
- }
- }
-
- @@ -2728,15 +2121,10 @@
- int ide_cdrom_get_last_session (struct cdrom_device_info *cdi,
- struct cdrom_multisession *ms_info)
- {
- - int stat;
- struct atapi_toc *toc;
- ide_drive_t *drive = (ide_drive_t*) cdi->handle;
- struct cdrom_info *info = drive->driver_data;
-
- - /* Make sure the TOC information is valid. */
- - stat = cdrom_read_toc (drive, NULL);
- - if (stat) return stat;
- -
- toc = info->toc;
- ms_info->addr.lba = toc->last_session_lba;
- ms_info->xa_flag = toc->xa_flag;
- @@ -2744,7 +2132,6 @@
- return 0;
- }
-
- -
- static
- int ide_cdrom_get_mcn (struct cdrom_device_info *cdi,
- struct cdrom_mcn *mcn_info)
- @@ -2777,37 +2164,14 @@
- int slot_nr)
- {
- ide_drive_t *drive = (ide_drive_t*) cdi->handle;
- - struct cdrom_info *info = drive->driver_data;
- -
- - int retval;
- -
- +
- if (slot_nr == CDSL_CURRENT) {
- (void) cdrom_check_status (drive, NULL);
- - retval = CDROM_STATE_FLAGS (drive)->media_changed;
- CDROM_STATE_FLAGS (drive)->media_changed = 0;
- + return CDROM_STATE_FLAGS (drive)->media_changed;
- + } else {
- + return -EINVAL;
- }
- -
- -#if ! STANDARD_ATAPI
- - else if (CDROM_STATE_FLAGS (drive)->sanyo_slot > 0) {
- - retval = 0;
- - }
- -#endif /* not STANDARD_ATAPI */
- -
- - else {
- - struct atapi_changer_info *ci;
- - int stat = cdrom_read_changer_info (drive);
- - if (stat < 0)
- - return stat;
- - ci = info->changer_info;
- -
- - /* This test may be redundant with cdrom.c. */
- - if (slot_nr < 0 || slot_nr >= ci->hdr.nslots)
- - return -EINVAL;
- -
- - retval = ci->slots[slot_nr].change;
- - }
- -
- - return retval;
- }
-
-
- @@ -2842,7 +2206,7 @@
- ide_cdrom_tray_move, /* tray_move */
- ide_cdrom_lock_door, /* lock_door */
- ide_cdrom_select_speed, /* select_speed */
- - ide_cdrom_select_disc, /* select_disc */
- + NULL, /* select_disc */
- ide_cdrom_get_last_session, /* get_last_session */
- ide_cdrom_get_mcn, /* get_mcn */
- ide_cdrom_reset, /* reset */
- @@ -2850,9 +2214,11 @@
- ide_cdrom_dev_ioctl, /* dev_ioctl */
- 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_IOCTLS | CDC_DRIVE_STATUS, /* capability */
- - 0 /* n_minors */
- + | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET | CDC_IOCTLS
- + | CDC_DRIVE_STATUS | CDC_CD_R | CDC_CD_RW | CDC_DVD
- + | CDC_DVD_R| CDC_DVD_RAM | CDC_GENERIC_PACKET, /* capability */
- + 0, /* n_minors */
- + ide_cdrom_packet
- };
-
- static int ide_cdrom_register (ide_drive_t *drive, int nslots)
- @@ -2861,22 +2227,32 @@
- struct cdrom_device_info *devinfo = &info->devinfo;
- int minor = (drive->select.b.unit)<<PARTN_BITS;
-
- - devinfo->dev = MKDEV (HWIF(drive)->major, minor);
- + devinfo->dev = MKDEV (HWIF(drive)->major, minor | CD_PART_MASK);
- devinfo->ops = &ide_cdrom_dops;
- devinfo->mask = 0;
- *(int *)&devinfo->speed = CDROM_STATE_FLAGS (drive)->current_speed;
- *(int *)&devinfo->capacity = nslots;
- devinfo->handle = (void *) drive;
- strcpy(devinfo->name, drive->name);
- -
- +
- /* set capability mask to match the probe. */
- + if (!CDROM_CONFIG_FLAGS (drive)->cd_r)
- + devinfo->mask |= CDC_CD_R;
- + if (!CDROM_CONFIG_FLAGS (drive)->cd_rw)
- + devinfo->mask |= CDC_CD_RW;
- + if (!CDROM_CONFIG_FLAGS (drive)->dvd)
- + devinfo->mask |= CDC_DVD;
- + if (!CDROM_CONFIG_FLAGS (drive)->dvd_r)
- + devinfo->mask |= CDC_DVD_R;
- + if (!CDROM_CONFIG_FLAGS (drive)->dvd_ram)
- + devinfo->mask |= CDC_DVD_RAM;
- if (!CDROM_CONFIG_FLAGS (drive)->is_changer)
- devinfo->mask |= CDC_SELECT_DISC;
- if (!CDROM_CONFIG_FLAGS (drive)->audio_play)
- devinfo->mask |= CDC_PLAY_AUDIO;
- if (!CDROM_CONFIG_FLAGS (drive)->close_tray)
- devinfo->mask |= CDC_CLOSE_TRAY;
- -
- +
- return register_cdrom (devinfo);
- }
-
- @@ -2884,20 +2260,35 @@
- static
- int ide_cdrom_probe_capabilities (ide_drive_t *drive)
- {
- - int stat, nslots = 0, attempts = 3;
- - struct {
- + struct cdrom_info *info = drive->driver_data;
- + struct cdrom_device_info *cdi = &info->devinfo;
- + int stat, nslots = 1, attempts = 3;
- + struct cdrom_generic_command cgc;
- + struct {
- char pad[8];
- struct atapi_capabilities_page cap;
- } buf;
-
- - if (CDROM_CONFIG_FLAGS (drive)->nec260)
- + if (CDROM_CONFIG_FLAGS (drive)->nec260) {
- + CDROM_CONFIG_FLAGS (drive)->no_eject = 0;
- + CDROM_CONFIG_FLAGS (drive)->audio_play = 1;
- return nslots;
- + }
-
- - do { /* we seem to get stat=0x01,err=0x00 the first time (??) */
- + init_cdrom_command(&cgc, &buf, sizeof(buf));
- + /* 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.
- + */
- + cdi->handle = (ide_drive_t *) drive;
- + cdi->ops = &ide_cdrom_dops;
- + /* we seem to get stat=0x01,err=0x00 the first time (??) */
- + do {
- if (attempts-- <= 0)
- return 0;
- - stat = cdrom_mode_sense (drive, PAGE_CAPABILITIES, 0,
- - (char *)&buf, sizeof (buf), NULL);
- + stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
- } while (stat);
-
- if (buf.cap.lock == 0)
- @@ -2915,14 +2306,14 @@
- if (buf.cap.dvd_ram_write)
- CDROM_CONFIG_FLAGS (drive)->dvd_r = 1;
- if (buf.cap.dvd_r_write)
- - CDROM_CONFIG_FLAGS (drive)->dvd_rw = 1;
- + CDROM_CONFIG_FLAGS (drive)->dvd_ram = 1;
- if (buf.cap.audio_play)
- CDROM_CONFIG_FLAGS (drive)->audio_play = 1;
- if (buf.cap.mechtype == 0)
- CDROM_CONFIG_FLAGS (drive)->close_tray = 0;
-
- #if ! STANDARD_ATAPI
- - if (CDROM_STATE_FLAGS (drive)->sanyo_slot > 0) {
- + if (cdi->sanyo_slot > 0) {
- CDROM_CONFIG_FLAGS (drive)->is_changer = 1;
- nslots = 3;
- }
- @@ -2931,14 +2322,9 @@
- #endif /* not STANDARD_ATAPI */
- if (buf.cap.mechtype == mechtype_individual_changer ||
- buf.cap.mechtype == mechtype_cartridge_changer) {
- - struct atapi_mechstat_header mechbuf;
- -
- - stat = cdrom_read_mech_status (drive, (char*)&mechbuf,
- - sizeof (mechbuf), NULL);
- - if (!stat) {
- + if ((nslots = cdrom_number_of_slots(cdi)) > 1) {
- CDROM_CONFIG_FLAGS (drive)->is_changer = 1;
- CDROM_CONFIG_FLAGS (drive)->supp_disc_present = 1;
- - nslots = mechbuf.nslots;
- }
- }
-
- @@ -2955,14 +2341,17 @@
- (ntohs(buf.cap.maxspeed) + (176/2)) / 176;
- }
-
- - printk ("%s: ATAPI %dX %s",
- - drive->name, CDROM_CONFIG_FLAGS (drive)->max_speed,
- - (CDROM_CONFIG_FLAGS (drive)->dvd) ? "DVD-ROM" : "CD-ROM");
- + /* don't print speed if the drive reported 0.
- + */
- + printk("%s: ATAPI", drive->name);
- + if (CDROM_CONFIG_FLAGS(drive)->max_speed)
- + printk(" %dX", CDROM_CONFIG_FLAGS(drive)->max_speed);
- + printk(" %s", CDROM_CONFIG_FLAGS(drive)->dvd ? "DVD-ROM" : "CD-ROM");
-
- - if (CDROM_CONFIG_FLAGS (drive)->dvd_r|CDROM_CONFIG_FLAGS (drive)->dvd_rw)
- + if (CDROM_CONFIG_FLAGS (drive)->dvd_r|CDROM_CONFIG_FLAGS (drive)->dvd_ram)
- printk (" DVD%s%s",
- - (CDROM_CONFIG_FLAGS (drive)->dvd_r)? "-RAM" : "",
- - (CDROM_CONFIG_FLAGS (drive)->dvd_rw)? "/RW" : "");
- + (CDROM_CONFIG_FLAGS (drive)->dvd_r)? "-R" : "",
- + (CDROM_CONFIG_FLAGS (drive)->dvd_ram)? "AM" : "");
-
- if (CDROM_CONFIG_FLAGS (drive)->cd_r|CDROM_CONFIG_FLAGS (drive)->cd_rw)
- printk (" CD%s%s",
- @@ -2974,7 +2363,19 @@
- else
- printk (" drive");
-
- - printk (", %dkB Cachen", ntohs(buf.cap.buffer_size));
- + printk (", %dkB Cache", be16_to_cpu(buf.cap.buffer_size));
- +
- + if (drive->using_dma) {
- + if ((drive->id->field_valid & 4) &&
- + (drive->id->dma_ultra & (drive->id->dma_ultra >> 8) & 7)) {
- + printk(", UDMA"); /* UDMA BIOS-enabled! */
- + } else if (drive->id->field_valid & 4) {
- + printk(", (U)DMA"); /* Can be BIOS-enabled! */
- + } else {
- + printk(", DMA");
- + }
- + }
- + printk("n");
-
- return nslots;
- }
- @@ -2994,19 +2395,17 @@
- int ide_cdrom_setup (ide_drive_t *drive)
- {
- struct cdrom_info *info = drive->driver_data;
- + struct cdrom_device_info *cdi = &info->devinfo;
- + int minor = drive->select.b.unit << PARTN_BITS;
- int nslots;
-
- - kdev_t dev = MKDEV (HWIF (drive)->major,
- - drive->select.b.unit << PARTN_BITS);
- + set_device_ro(MKDEV(HWIF(drive)->major, minor), 1);
- + set_blocksize(MKDEV(HWIF(drive)->major, minor), CD_FRAMESIZE);
-
- - set_device_ro (dev, 1);
- - blksize_size[HWIF(drive)->major][drive->select.b.unit << PARTN_BITS] =
- - CD_FRAMESIZE;
- + drive->special.all = 0;
- + drive->ready_stat = 0;
-
- - drive->special.all = 0;
- - drive->ready_stat = 0;
- -
- - CDROM_STATE_FLAGS (drive)->media_changed = 0;
- + CDROM_STATE_FLAGS (drive)->media_changed = 1;
- CDROM_STATE_FLAGS (drive)->toc_valid = 0;
- CDROM_STATE_FLAGS (drive)->door_locked = 0;
-
- @@ -3028,25 +2427,29 @@
- CDROM_CONFIG_FLAGS (drive)->test_write = 0;
- CDROM_CONFIG_FLAGS (drive)->dvd = 0;
- CDROM_CONFIG_FLAGS (drive)->dvd_r = 0;
- - CDROM_CONFIG_FLAGS (drive)->dvd_rw = 0;
- + CDROM_CONFIG_FLAGS (drive)->dvd_ram = 0;
- CDROM_CONFIG_FLAGS (drive)->no_eject = 1;
- CDROM_CONFIG_FLAGS (drive)->supp_disc_present = 0;
- CDROM_CONFIG_FLAGS (drive)->audio_play = 0;
- CDROM_CONFIG_FLAGS (drive)->close_tray = 1;
- -
- +
- /* limit transfer size per interrupt. */
- CDROM_CONFIG_FLAGS (drive)->limit_nframes = 0;
- if (drive->id != NULL) {
- - if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2430"))
- - CDROM_CONFIG_FLAGS (drive)->limit_nframes = 1;
- - else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2432"))
- - CDROM_CONFIG_FLAGS (drive)->limit_nframes = 1;
- + /* a testament to the nice quality of Samsung drives... */
- + if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2430"))
- + CDROM_CONFIG_FLAGS (drive)->limit_nframes = 1;
- + else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2432"))
- + CDROM_CONFIG_FLAGS (drive)->limit_nframes = 1;
- + /* the 3231 model does not support the SET_CD_SPEED command */
- + else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-3231"))
- + cdi->mask |= CDC_SELECT_SPEED;
- }
-
- #if ! STANDARD_ATAPI
- /* by default Sanyo 3 CD changer support is turned off and
- ATAPI Rev 2.2+ standard support for CD changers is used */
- - CDROM_STATE_FLAGS (drive)->sanyo_slot = 0;
- + cdi->sanyo_slot = 0;
-
- CDROM_CONFIG_FLAGS (drive)->nec260 = 0;
- CDROM_CONFIG_FLAGS (drive)->toctracks_as_bcd = 0;
- @@ -3098,18 +2501,20 @@
- (strcmp(drive->id->model, "CD-ROM CDR-C3G") == 0) ||
- (strcmp(drive->id->model, "CD-ROM CDR_C36") == 0)) {
- /* uses CD in slot 0 when value is set to 3 */
- - CDROM_STATE_FLAGS (drive)->sanyo_slot = 3;
- + cdi->sanyo_slot = 3;
- }
-
-
- }
- #endif /* not STANDARD_ATAPI */
-
- - info->toc = NULL;
- - info->sector_buffer = NULL;
- - info->sector_buffered = 0;
- - info->nsectors_buffered = 0;
- + info->toc = NULL;
- + info->buffer = NULL;
- + info->sector_buffered = 0;
- + info->nsectors_buffered = 0;
- info->changer_info = NULL;
- + info->last_block = 0;
- + info->start_seek = 0;
-
- nslots = ide_cdrom_probe_capabilities (drive);
-
- @@ -3134,9 +2539,12 @@
- static
- int ide_cdrom_open (struct inode *ip, struct file *fp, ide_drive_t *drive)
- {
- + struct cdrom_info *info = drive->driver_data;
- int rc;
-
- MOD_INC_USE_COUNT;
- + if (info->buffer == NULL)
- + info->buffer = (char *) kmalloc(SECTOR_BUFFER_SIZE, GFP_KERNEL);
- rc = cdrom_fops.open (ip, fp);
- if (rc) {
- drive->usage--;
- @@ -3161,7 +2569,6 @@
- (drive->select.b.unit)<<PARTN_BITS));
- }
-
- -
- static
- int ide_cdrom_cleanup(ide_drive_t *drive)
- {
- @@ -3170,15 +2577,15 @@
-
- if (ide_unregister_subdriver (drive))
- return 1;
- - if (info->sector_buffer != NULL)
- - kfree (info->sector_buffer);
- + if (info->buffer != NULL)
- + kfree(info->buffer);
- if (info->toc != NULL)
- - kfree (info->toc);
- + kfree(info->toc);
- if (info->changer_info != NULL)
- - kfree (info->changer_info);
- + kfree(info->changer_info);
- if (devinfo->handle == drive && unregister_cdrom (devinfo))
- printk ("%s: ide_cdrom_cleanup failed to unregister device from the cdrom driver.n", drive->name);
- - kfree (info);
- + kfree(info);
- drive->driver_data = NULL;
- return 0;
- }
- @@ -3218,11 +2625,6 @@
- MODULE_PARM(ignore, "s");
- MODULE_DESCRIPTION("ATAPI CD-ROM Driver");
-
- -int init_module (void)
- -{
- - return ide_cdrom_init();
- -}
- -
- void cleanup_module(void)
- {
- ide_drive_t *drive;
- @@ -3235,6 +2637,11 @@
- }
- ide_unregister_module (&ide_cdrom_module);
- }
- +
- +int init_module(void)
- +{
- + return ide_cdrom_init();
- +}
- #endif /* MODULE */
-
- int ide_cdrom_init (void)
- @@ -3246,11 +2653,12 @@
- MOD_INC_USE_COUNT;
- while ((drive = ide_scan_devices (ide_cdrom, ide_cdrom_driver.name, NULL, failed++)) != NULL) {
- /* skip drives that we were told to ignore */
- - if (ignore != NULL)
- + if (ignore != NULL) {
- if (strstr(ignore, drive->name)) {
- printk("ide-cd: ignoring drive %sn", drive->name);
- continue;
- }
- + }
- info = (struct cdrom_info *) kmalloc (sizeof (struct cdrom_info), GFP_KERNEL);
- if (info == NULL) {
- printk ("%s: Can't allocate a cdrom structuren", drive->name);
- @@ -3277,11 +2685,3 @@
- MOD_DEC_USE_COUNT;
- return 0;
- }
- -
- -
- -/*==========================================================================*/
- -/*
- - * Local variables:
- - * c-basic-offset: 8
- - * End:
- - */
- diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/drivers/block/ide-cd.h linux/drivers/block/ide-cd.h
- --- linux-2.2.13/drivers/block/ide-cd.h Fri Nov 5 15:15:33 1999
- +++ linux/drivers/block/ide-cd.h Sun Oct 31 13:56:23 1999
- @@ -1,9 +1,9 @@
- #ifndef _IDE_CD_H
- #define _IDE_CD_H
- /*
- - * linux/drivers/block/ide_modes.h
- + * linux/drivers/block/ide_cd.h
- *
- - * Copyright (C) 1996 Erik Andersen
- + * Copyright (C) 1996, 1997, 1998 Erik Andersen
- * Copyright (C) 1998, 1999 Jens Axboe
- */
-
- @@ -34,19 +34,13 @@
- #define NO_DOOR_LOCKING 0
- #endif
-
- -
- -/* Size of buffer to allocate, in blocks, for audio reads. */
- -
- -#ifndef CDROM_NBLOCKS_BUFFER
- -#define CDROM_NBLOCKS_BUFFER 8
- -#endif
- -
- -
- /************************************************************************/
-
- -#define SECTOR_SIZE 512
- -#define SECTOR_BITS 9
- -#define SECTORS_PER_FRAME (CD_FRAMESIZE / SECTOR_SIZE)
- +#define SECTOR_SIZE 512
- +#define SECTOR_BITS 9
- +#define SECTORS_PER_FRAME (CD_FRAMESIZE / SECTOR_SIZE)
- +#define SECTOR_BUFFER_SIZE (CD_FRAMESIZE * 32)
- +#define SECTORS_BUFFER (SECTOR_BUFFER_SIZE / SECTOR_SIZE)
-
- #define MIN(a,b) ((a) < (b) ? (a) : (b))
-
- @@ -55,96 +49,38 @@
- #define REQUEST_SENSE_COMMAND 4316
- #define RESET_DRIVE_COMMAND 4317
-
- -/*
- - * For controlling drive spindown time.
- - */
- -#define CDROMGETSPINDOWN 0x531d
- -#define CDROMSETSPINDOWN 0x531e
- -
- -
- -/* Some ATAPI command opcodes (just like SCSI).
- - (Some other cdrom-specific codes are in cdrom.h.) */
- -#define TEST_UNIT_READY 0x00
- -#define REQUEST_SENSE 0x03
- -#define INQUIRY 0x12
- -#define START_STOP 0x1b
- -#define ALLOW_MEDIUM_REMOVAL 0x1e
- -#define READ_CAPACITY 0x25
- -#define READ_10 0x28
- -#define SEEK 0x2b
- -#define READ_HEADER 0x44
- -#define STOP_PLAY_SCAN 0x4e
- -#define MODE_SELECT_10 0x55
- -#define MODE_SENSE_10 0x5a
- -#define LOAD_UNLOAD 0xa6
- -#define READ_12 0xa8
- -#define READ_CD_MSF 0xb9
- -#define SCAN 0xba
- -#define SET_CD_SPEED 0xbb
- -#define PLAY_CD 0xbc
- -#define MECHANISM_STATUS 0xbd
- -#define READ_CD 0xbe
- -
- -/* DVD Opcodes */
- -#define DVD_GET_PERFORMANCE 0xac
- -
- -
- -/* Page codes for mode sense/set */
- -
- -#define PAGE_READERR 0x01
- -#define PAGE_CDROM 0x0d
- -#define PAGE_AUDIO 0x0e
- -#define PAGE_CAPABILITIES 0x2a
- -#define PAGE_ALL 0x3f
- -
- -
- -/* ATAPI sense keys (from table 140 of ATAPI 2.6) */
- -
- -#define NO_SENSE 0x00
- -#define RECOVERED_ERROR 0x01
- -#define NOT_READY 0x02
- -#define MEDIUM_ERROR 0x03
- -#define HARDWARE_ERROR 0x04
- -#define ILLEGAL_REQUEST 0x05
- -#define UNIT_ATTENTION 0x06
- -#define DATA_PROTECT 0x07
- -#define ABORTED_COMMAND 0x0b
- -#define MISCOMPARE 0x0e
- -
- -/* We want some additional flags for CDROM drives.
- - To save space in the ide_drive_t struct, use some fields which
- - doesn't make sense for CDROMs -- `bios_cyl' and `bios_head'. */
-
- /* Configuration flags. These describe the capabilities of the drive.
- They generally do not change after initialization, unless we learn
- more about the drive from stuff failing. */
- struct ide_cd_config_flags {
- - __u8 drq_interrupt : 1; /* Device sends an interrupt when ready
- - for a packet command. */
- - __u8 no_doorlock : 1; /* Drive cannot lock the door. */
- - __u8 no_eject : 1; /* Drive cannot eject the disc. */
- - __u8 nec260 : 1; /* Drive is a pre-1.2 NEC 260 drive. */
- - __u8 playmsf_as_bcd : 1; /* PLAYMSF command takes BCD args. */
- - __u8 tocaddr_as_bcd : 1; /* TOC addresses are in BCD. */
- - __u8 toctracks_as_bcd : 1; /* TOC track numbers are in BCD. */
- - __u8 subchan_as_bcd : 1; /* Subchannel info is in BCD. */
- - __u8 is_changer : 1; /* Drive is a changer. */
- - __u8 cd_r : 1; /* Drive can write to CD-R media . */
- - __u8 cd_rw : 1; /* Drive can write to CD-R/W media . */
- - __u8 dvd : 1; /* Drive is a DVD-ROM */
- - __u8 dvd_r : 1; /* Drive can write DVD-RAM */
- - __u8 dvd_rw : 1; /* Drive can write DVD-R/W */
- - __u8 test_write : 1; /* Drive can fake writes */
- - __u8 supp_disc_present: 1; /* Changer can report exact contents
- - of slots. */
- - __u8 limit_nframes : 1; /* Drive does not provide data in
- - multiples of SECTOR_SIZE when more
- - than one interrupt is needed. */
- - __u8 seeking : 1; /* Seeking in progress */
- - __u8 audio_play : 1; /* can do audio related commands */
- - __u8 close_tray : 1; /* can close the tray */
- - __u8 reserved : 4;
- - byte max_speed; /* Max speed of the drive */
- + __u8 drq_interrupt : 1; /* Device sends an interrupt when ready
- + for a packet command. */
- + __u8 no_doorlock : 1; /* Drive cannot lock the door. */
- + __u8 no_eject : 1; /* Drive cannot eject the disc. */
- + __u8 nec260 : 1; /* Drive is a pre-1.2 NEC 260 drive. */
- + __u8 playmsf_as_bcd : 1; /* PLAYMSF command takes BCD args. */
- + __u8 tocaddr_as_bcd : 1; /* TOC addresses are in BCD. */
- + __u8 toctracks_as_bcd : 1; /* TOC track numbers are in BCD. */
- + __u8 subchan_as_bcd : 1; /* Subchannel info is in BCD. */
- + __u8 is_changer : 1; /* Drive is a changer. */
- + __u8 cd_r : 1; /* Drive can write to CD-R media . */
- + __u8 cd_rw : 1; /* Drive can write to CD-R/W media . */
- + __u8 dvd : 1; /* Drive is a DVD-ROM */
- + __u8 dvd_r : 1; /* Drive can write DVD-R */
- + __u8 dvd_ram : 1; /* Drive can write DVD-RAM */
- + __u8 test_write : 1; /* Drive can fake writes */
- + __u8 supp_disc_present : 1; /* Changer can report exact contents
- + of slots. */
- + __u8 limit_nframes : 1; /* Drive does not provide data in
- + multiples of SECTOR_SIZE when more
- + than one interrupt is needed. */
- + __u8 seeking : 1; /* Seeking in progress */
- + __u8 audio_play : 1; /* can do audio related commands */
- + __u8 close_tray : 1; /* can close the tray */
- + __u8 writing : 1; /* pseudo write in progress */
- + __u8 reserved : 3;
- + byte max_speed; /* Max speed of the drive */
- };
- #define CDROM_CONFIG_FLAGS(drive) (&(((struct cdrom_info *)(drive->driver_data))->config_flags))
-
- @@ -155,8 +91,8 @@
- __u8 media_changed : 1; /* Driver has noticed a media change. */
- __u8 toc_valid : 1; /* Saved TOC information is current. */
- __u8 door_locked : 1; /* We think that the drive door is locked. */
- - __u8 sanyo_slot : 2; /* Sanyo 3 CD changer support */
- - __u8 reserved : 3;
- + __u8 writing : 1; /* the drive is currently writing */
- + __u8 reserved : 4;
- byte current_speed; /* Current speed of the drive */
- };
- #define CDROM_STATE_FLAGS(drive) (&(((struct cdrom_info *)(drive->driver_data))->state_flags))
- @@ -278,15 +214,10 @@
- };
-
-
- -typedef enum {
- - mechtype_caddy = 0,
- - mechtype_tray = 1,
- - mechtype_popup = 2,
- - mechtype_individual_changer = 4,
- - mechtype_cartridge_changer = 5
- -} mechtype_t;
- -
-
- +/* This should probably go into cdrom.h along with the other
- + * generic stuff now in the Mt. Fuji spec.
- + */
- struct atapi_capabilities_page {
- #if defined(__BIG_ENDIAN_BITFIELD)
- __u8 parameters_saveable : 1;
- @@ -552,13 +483,11 @@
- byte reserved2[3];
- };
-
- -
- struct atapi_changer_info {
- struct atapi_mechstat_header hdr;
- struct atapi_slot slots[0];
- };
-
- -
- /* Extra per-device info for cdrom drives. */
- struct cdrom_info {
-
- @@ -567,17 +496,9 @@
-
- struct atapi_toc *toc;
-
- - /* Sector buffer. If a read request wants only the first part
- - of a cdrom block, we cache the rest of the block here,
- - in the expectation that the data is going to be wanted soon.
- - SECTOR_BUFFERED is the number of the first buffered sector,
- - and NSECTORS_BUFFERED is the number of sectors in the buffer.
- - Before the buffer is allocated, we should have
- - SECTOR_BUFFER == NULL and NSECTORS_BUFFERED == 0. */
- -
- - unsigned long sector_buffered;
- - unsigned long nsectors_buffered;
- - char *sector_buffer;
- + unsigned long sector_buffered;
- + unsigned long nsectors_buffered;
- + unsigned char *buffer;
-
- /* The result of the last successful request sense command
- on this device. */
- @@ -598,21 +519,91 @@
- struct cdrom_device_info devinfo;
- };
-
- -
- -#define SECTOR_BUFFER_SIZE CD_FRAMESIZE
- -
- -
- /****************************************************************************
- * Descriptions of ATAPI error codes.
- */
-
- #define ARY_LEN(a) ((sizeof(a) / sizeof(a[0])))
-
- +/* This stuff should be in cdrom.h, since it is now generic... */
- +
- +/* ATAPI sense keys (from table 140 of ATAPI 2.6) */
- +#define NO_SENSE 0x00
- +#define RECOVERED_ERROR 0x01
- +#define NOT_READY 0x02
- +#define MEDIUM_ERROR 0x03
- +#define HARDWARE_ERROR 0x04
- +#define ILLEGAL_REQUEST 0x05
- +#define UNIT_ATTENTION 0x06
- +#define DATA_PROTECT 0x07
- +#define ABORTED_COMMAND 0x0b
- +#define MISCOMPARE 0x0e
- +
- +
- +
- +/* This stuff should be in cdrom.h, since it is now generic... */
- #if VERBOSE_IDE_CD_ERRORS
-
- -/* From Table 124 of the ATAPI 1.2 spec.
- - Unchanged in Table 140 of the ATAPI 2.6 draft standard. */
- + /* The generic packet command opcodes for CD/DVD Logical Units,
- + * From Table 57 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */
- +const struct {
- + unsigned short packet_command;
- + const char * const text;
- +} packet_command_texts[] = {
- + { GPCMD_TEST_UNIT_READY, "Test Unit Ready" },
- + { GPCMD_REQUEST_SENSE, "Request Sense" },
- + { GPCMD_FORMAT_UNIT, "Format Unit" },
- + { GPCMD_INQUIRY, "Inquiry" },
- + { GPCMD_START_STOP_UNIT, "Start/Stop Unit" },
- + { GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL, "Prevent/Allow Medium Removal" },
- + { GPCMD_READ_FORMAT_CAPACITIES, "Read Format Capacities" },
- + { GPCMD_READ_CDVD_CAPACITY, "Read Cd/Dvd Capacity" },
- + { GPCMD_READ_10, "Read 10" },
- + { GPCMD_WRITE_10, "Write 10" },
- + { GPCMD_SEEK, "Seek" },
- + { GPCMD_WRITE_AND_VERIFY_10, "Write and Verify 10" },
- + { GPCMD_VERIFY_10, "Verify 10" },
- + { GPCMD_FLUSH_CACHE, "Flush Cache" },
- + { GPCMD_READ_SUBCHANNEL, "Read Subchannel" },
- + { GPCMD_READ_TOC_PMA_ATIP, "Read Table of Contents" },
- + { GPCMD_READ_HEADER, "Read Header" },
- + { GPCMD_PLAY_AUDIO_10, "Play Audio 10" },
- + { GPCMD_GET_CONFIGURATION, "Get Configuration" },
- + { GPCMD_PLAY_AUDIO_MSF, "Play Audio MSF" },
- + { GPCMD_PLAYAUDIO_TI, "Play Audio TrackIndex" },
- + { GPCMD_GET_EVENT_STATUS_NOTIFICATION, "Get Event Status Notification" },
- + { GPCMD_PAUSE_RESUME, "Pause/Resume" },
- + { GPCMD_STOP_PLAY_SCAN, "Stop Play/Scan" },
- + { GPCMD_READ_DISC_INFO, "Read Disc Info" },
- + { GPCMD_READ_TRACK_RZONE_INFO, "Read Track Rzone Info" },
- + { GPCMD_RESERVE_RZONE_TRACK, "Reserve Rzone Track" },
- + { GPCMD_SEND_OPC, "Send OPC" },
- + { GPCMD_MODE_SELECT_10, "Mode Select 10" },
- + { GPCMD_REPAIR_RZONE_TRACK, "Repair Rzone Track" },
- + { GPCMD_MODE_SENSE_10, "Mode Sense 10" },
- + { GPCMD_CLOSE_TRACK, "Close Track" },
- + { GPCMD_BLANK, "Blank" },
- + { GPCMD_SEND_EVENT, "Send Event" },
- + { GPCMD_SEND_KEY, "Send Key" },
- + { GPCMD_REPORT_KEY, "Report Key" },
- + { GPCMD_LOAD_UNLOAD, "Load/Unload" },
- + { GPCMD_SET_READ_AHEAD, "Set Read-ahead" },
- + { GPCMD_READ_12, "Read 12" },
- + { GPCMD_GET_PERFORMANCE, "Get Performance" },
- + { GPCMD_SEND_DVD_STRUCTURE, "Send DVD Structure" },
- + { GPCMD_READ_DVD_STRUCTURE, "Read DVD Structure" },
- + { GPCMD_SET_STREAMING, "Set Streaming" },
- + { GPCMD_READ_CD_MSF, "Read CD MSF" },
- + { GPCMD_SCAN, "Scan" },
- + { GPCMD_SET_SPEED, "Set Speed" },
- + { GPCMD_PLAY_CD, "Play CD" },
- + { GPCMD_MECHANISM_STATUS, "Mechanism Status" },
- + { GPCMD_READ_CD, "Read CD" },
- +};
- +
-
- +
- +/* From Table 303 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */
- const char * const sense_key_texts[16] = {
- "No sense data",
- "Recovered error",
- @@ -632,162 +623,144 @@
- "(reserved)",
- };
-
- -
- -/* From Table 37 of the ATAPI 2.6 draft standard. */
- -const struct {
- - unsigned short packet_command;
- - const char * const text;
- -} packet_command_texts[] = {
- - { TEST_UNIT_READY, "Test Unit Ready" },
- - { REQUEST_SENSE, "Request Sense" },
- - { INQUIRY, "Inquiry" },
- - { START_STOP, "Start Stop Unit" },
- - { ALLOW_MEDIUM_REMOVAL, "Prevent/Allow Medium Removal" },
- - { READ_CAPACITY, "Read CD-ROM Capacity" },
- - { READ_10, "Read(10)" },
- - { SEEK, "Seek" },
- - { SCMD_READ_TOC, "Read TOC" },
- - { SCMD_READ_SUBCHANNEL, "Read Sub-Channel" },
- - { READ_HEADER, "Read Header" },
- - { STOP_PLAY_SCAN, "Stop Play/Scan" },
- - { SCMD_PLAYAUDIO10, "Play Audio" },
- - { SCMD_PLAYAUDIO_MSF, "Play Audio MSF" },
- - { SCMD_PAUSE_RESUME, "Pause/Resume" },
- - { MODE_SELECT_10, "Mode Select" },
- - { MODE_SENSE_10, "Mode Sense" },
- - { LOAD_UNLOAD, "Load/Unload CD" },
- - { READ_12, "Read(12)" },
- - { READ_CD_MSF, "Read CD MSF" },
- - { SCAN, "Scan" },
- - { SET_CD_SPEED, "Set CD Speed" },
- - { PLAY_CD, "Play CD" },
- - { MECHANISM_STATUS, "Mechanism Status" },
- - { READ_CD, "Read CD" },
- - { DVD_GET_PERFORMANCE, "Get Performance" },
- -};
- -
- -
- -/* From Table 125 of the ATAPI 1.2 spec.,
- - with additions from Tables 141 and 142 of the ATAPI 2.6 draft standard. */
- -
- +/* From Table 304 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */
- const struct {
- - unsigned short asc_ascq;
- + unsigned long asc_ascq;
- const char * const text;
- } sense_data_texts[] = {
- - { 0x0000, "No additional sense information" },
- -
- - { 0x0011, "Audio play operation in progress" },
- - { 0x0012, "Audio play operation paused" },
- - { 0x0013, "Audio play operation successfully completed" },
- - { 0x0014, "Audio play operation stopped due to error" },
- - { 0x0015, "No current audio status to return" },
- -
- - { 0x0100, "Mechanical positioning or changer error" },
- -
- - { 0x0200, "No seek complete" },
- -
- - { 0x0400, "Logical unit not ready - cause not reportable" },
- - { 0x0401,
- - "Logical unit not ready - in progress (sic) of becoming ready" },
- - { 0x0402, "Logical unit not ready - initializing command required" },
- - { 0x0403, "Logical unit not ready - manual intervention required" },
- -
- - { 0x0501, "Media load - eject failed" },
- -
- - { 0x0600, "No reference position found" },
- -
- - { 0x0900, "Track following error" },
- - { 0x0901, "Tracking servo failure" },
- - { 0x0902, "Focus servo failure" },
- - { 0x0903, "Spindle servo failure" },
- -
- - { 0x1100, "Unrecovered read error" },
- - { 0x1106, "CIRC unrecovered error" },
- -
- - { 0x1500, "Random positioning error" },
- - { 0x1501, "Mechanical positioning or changer error" },
- - { 0x1502, "Positioning error detected by read of medium" },
- -
- - { 0x1700, "Recovered data with no error correction applied" },
- - { 0x1701, "Recovered data with retries" },
- - { 0x1702, "Recovered data with positive head offset" },
- - { 0x1703, "Recovered data with negative head offset" },
- - { 0x1704, "Recovered data with retries and/or CIRC applied" },
- - { 0x1705, "Recovered data using previous sector ID" },
- -
- - { 0x1800, "Recovered data with error correction applied" },
- - { 0x1801, "Recovered data with error correction and retries applied" },
- - { 0x1802, "Recovered data - the data was auto-reallocated" },
- - { 0x1803, "Recovered data with CIRC" },
- - { 0x1804, "Recovered data with L-EC" },
- - /* Following two not in 2.6. */
- - { 0x1805, "Recovered data - recommend reassignment" },
- - { 0x1806, "Recovered data - recommend rewrite" },
- -
- - { 0x1a00, "Parameter list length error" },
- -
- - { 0x2000, "Invalid command operation code" },
- -
- - { 0x2100, "Logical block address out of range" },
- -
- - { 0x2400, "Invalid field in command packet" },
- -
- - { 0x2600, "Invalid field in parameter list" },
- - { 0x2601, "Parameter not supported" },
- - { 0x2602, "Parameter value invalid" },
- - /* Following code not in 2.6. */
- - { 0x2603, "Threshold parameters not supported" },
- -
- - { 0x2800, "Not ready to ready transition, medium may have changed" },
- -
- - { 0x2900, "Power on, reset or bus device reset occurred" },
- -
- - { 0x2a00, "Parameters changed" },
- - { 0x2a01, "Mode parameters changed" },
- -
- - { 0x3000, "Incompatible medium installed" },
- - { 0x3001, "Cannot read medium - unknown format" },
- - { 0x3002, "Cannot read medium - incompatible format" },
- -
- - /* Following code not in 2.6. */
- - { 0x3700, "Rounded parameter" },
- -
- - { 0x3900, "Saving parameters not supported" },
- -
- - { 0x3a00, "Medium not present" },
- -
- - { 0x3f00, "ATAPI CD-ROM drive operating conditions have changed" },
- - { 0x3f01, "Microcode has been changed" },
- - /* Following two not in 2.6. */
- - { 0x3f02, "Changed operating definition" },
- - { 0x3f03, "Inquiry data has changed" },
- -
- - { 0x4000, "Diagnostic failure on component (ASCQ)" },
- -
- - { 0x4400, "Internal ATAPI CD-ROM drive failure" },
- -
- - { 0x4e00, "Overlapped commands attempted" },
- -
- - { 0x5300, "Media load or eject failed" },
- - { 0x5302, "Medium removal prevented" },
- -
- - { 0x5700, "Unable to recover table of contents" },
- -
- - { 0x5a00, "Operator request or state change input (unspecified)" },
- - { 0x5a01, "Operator medium removal request" },
- -
- - /* Following two not in 2.6. */
- - { 0x5b00, "Threshold condition met" },
- - { 0x5c00, "Status change" },
- -
- - { 0x6300, "End of user area encountered on this track" },
- -
- - { 0x6400, "Illegal mode for this track or incompatible medium" },
- -
- - /* Following error is misspelled in ATAPI 2.6 */
- - { 0xb900, "Play operation oborted [sic]" },
- -
- - { 0xbf00, "Loss of streaming" },
- + { 0x000000, "No additional sense information" },
- + { 0x000011, "Play operation in progress" },
- + { 0x000012, "Play operation paused" },
- + { 0x000013, "Play operation successfully completed" },
- + { 0x000014, "Play operation stopped due to error" },
- + { 0x000015, "No current audio status to return" },
- + { 0x010c0a, "Write error - padding blocks added" },
- + { 0x011700, "Recovered data with no error correction applied" },
- + { 0x011701, "Recovered data with retries" },
- + { 0x011702, "Recovered data with positive head offset" },
- + { 0x011703, "Recovered data with negative head offset" },
- + { 0x011704, "Recovered data with retries and/or CIRC applied" },
- + { 0x011705, "Recovered data using previous sector ID" },
- + { 0x011800, "Recovered data with error correction applied" },
- + { 0x011801, "Recovered data with error correction and retries applied"},
- + { 0x011802, "Recovered data - the data was auto-reallocated" },
- + { 0x011803, "Recovered data with CIRC" },
- + { 0x011804, "Recovered data with L-EC" },
- + { 0x015d00,
- + "Failure prediction threshold exceeded - Predicted logical unit failure" },
- + { 0x015d01,
- + "Failure prediction threshold exceeded - Predicted media failure" },
- + { 0x015dff, "Failure prediction threshold exceeded - False" },
- + { 0x017301, "Power calibration area almost full" },
- + { 0x020400, "Logical unit not ready - cause not reportable" },
- + /* Following is misspelled in ATAPI 2.6, _and_ in Mt. Fuji */
- + { 0x020401,
- + "Logical unit not ready - in progress [sic] of becoming ready" },
- + { 0x020402, "Logical unit not ready - initializing command required" },
- + { 0x020403, "Logical unit not ready - manual intervention required" },
- + { 0x020404, "In process of becoming ready - writing" },
- + { 0x020600, "No reference position found (media may be upside down)" },
- + { 0x023000, "Incompatible medium installed" },
- + { 0x023a00, "Medium not present" },
- + { 0x025300, "Media load or eject failed" },
- + { 0x025700, "Unable to recover table of contents" },
- + { 0x030300, "Peripheral device write fault" },
- + { 0x030301, "No write current" },
- + { 0x030302, "Excessive write errors" },
- + { 0x030c00, "Write error" },
- + { 0x030c01, "Write error - Recovered with auto reallocation" },
- + { 0x030c02, "Write error - auto reallocation failed" },
- + { 0x030c03, "Write error - recommend reassignment" },
- + { 0x030c04, "Compression check miscompare error" },
- + { 0x030c05, "Data expansion occurred during compress" },
- + { 0x030c06, "Block not compressible" },
- + { 0x030c07, "Write error - recovery needed" },
- + { 0x030c08, "Write error - recovery failed" },
- + { 0x030c09, "Write error - loss of streaming" },
- + { 0x031100, "Unrecovered read error" },
- + { 0x031106, "CIRC unrecovered error" },
- + { 0x033101, "Format command failed" },
- + { 0x033200, "No defect spare location available" },
- + { 0x033201, "Defect list update failure" },
- + { 0x035100, "Erase failure" },
- + { 0x037200, "Session fixation error" },
- + { 0x037201, "Session fixation error writin lead-in" },
- + { 0x037202, "Session fixation error writin lead-out" },
- + { 0x037300, "CD control error" },
- + { 0x037302, "Power calibration area is full" },
- + { 0x037303, "Power calibration area error" },
- + { 0x037304, "Program memory area / RMA update failure" },
- + { 0x037305, "Program memory area / RMA is full" },
- + { 0x037306, "Program memory area / RMA is (almost) full" },
- +
- + { 0x040200, "No seek complete" },
- + { 0x040300, "Write fault" },
- + { 0x040900, "Track following error" },
- + { 0x040901, "Tracking servo failure" },
- + { 0x040902, "Focus servo failure" },
- + { 0x040903, "Spindle servo failure" },
- + { 0x041500, "Random positioning error" },
- + { 0x041501, "Mechanical positioning or changer error" },
- + { 0x041502, "Positioning error detected by read of medium" },
- + { 0x043c00, "Mechanical positioning or changer error" },
- + { 0x044000, "Diagnostic failure on component (ASCQ)" },
- + { 0x044400, "Internal CD/DVD logical unit failure" },
- + { 0x04b600, "Media load mechanism failed" },
- + { 0x051a00, "Parameter list length error" },
- + { 0x052000, "Invalid command operation code" },
- + { 0x052c00, "Command sequence error" },
- + { 0x052100, "Logical block address out of range" },
- + { 0x052102, "Invalid address for write" },
- + { 0x052400, "Invalid field in command packet" },
- + { 0x052600, "Invalid field in parameter list" },
- + { 0x052601, "Parameter not supported" },
- + { 0x052602, "Parameter value invalid" },
- + { 0x052700, "Write protected media" },
- + { 0x052c00, "Command sequence error" },
- + { 0x052c03, "Current program area is not empty" },
- + { 0x052c04, "Current program area is empty" },
- + { 0x053001, "Cannot read medium - unknown format" },
- + { 0x053002, "Cannot read medium - incompatible format" },
- + { 0x053900, "Saving parameters not supported" },
- + { 0x054e00, "Overlapped commands attempted" },
- + { 0x055302, "Medium removal prevented" },
- + { 0x055500, "System resource failure" },
- + { 0x056300, "End of user area encountered on this track" },
- + { 0x056400, "Illegal mode for this track or incompatible medium" },
- + { 0x056f00, "Copy protection key exchange failure - Authentication failure" },
- + { 0x056f01, "Copy protection key exchange failure - Key not present" },
- + { 0x056f02, "Copy protection key exchange failure - Key not established" },
- + { 0x056f03, "Read of scrambled sector without authentication" },
- + { 0x056f04, "Media region code is mismatched to logical unit" },
- + { 0x056f05, "Drive region must be permanent / region reset count error" },
- + { 0x057203, "Session fixation error - incomplete track in session" },
- + { 0x057204, "Empty or partially written reserved track" },
- + { 0x057205, "No more RZONE reservations are allowed" },
- + { 0x05bf00, "Loss of streaming" },
- + { 0x062800, "Not ready to ready transition, medium may have changed" },
- + { 0x062900, "Power on, reset or hardware reset occurred" },
- + { 0x062a00, "Parameters changed" },
- + { 0x062a01, "Mode parameters changed" },
- + { 0x062e00, "Insufficient time for operation" },
- + { 0x063f00, "Logical unit operating conditions have changed" },
- + { 0x063f01, "Microcode has been changed" },
- + { 0x065a00, "Operator request or state change input (unspecified)" },
- + { 0x065a01, "Operator medium removal request" },
- + { 0x0bb900, "Play operation aborted" },
- +
- + /* Here we use 0xff for the key (not a valid key) to signify
- + * that these can have _any_ key value associated with them... */
- + { 0xff0401, "Logical unit is in process of becoming ready" },
- + { 0xff0400, "Logical unit not ready, cause not reportable" },
- + { 0xff0402, "Logical unit not ready, initializing command required" },
- + { 0xff0403, "Logical unit not ready, manual intervention required" },
- + { 0xff0500, "Logical unit does not respond to selection" },
- + { 0xff0800, "Logical unit communication failure" },
- + { 0xff0802, "Logical unit communication parity error" },
- + { 0xff0801, "Logical unit communication time-out" },
- + { 0xff2500, "Logical unit not supported" },
- + { 0xff4c00, "Logical unit failed self-configuration" },
- + { 0xff3e00, "Logical unit has not self-configured yet" },
- };
- #endif
-
- diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/drivers/block/ide-disk.c linux/drivers/block/ide-disk.c
- --- linux-2.2.13/drivers/block/ide-disk.c Thu Mar 11 02:49:43 1999
- +++ linux/drivers/block/ide-disk.c Sun Nov 7 15:17:18 1999
- @@ -159,7 +159,7 @@
- if (i > 0) {
- if (msect)
- goto read_next;
- - ide_set_handler (drive, &read_intr, WAIT_CMD);
- + ide_set_handler (drive, &read_intr, WAIT_CMD, NULL);
- }
- }
-
- @@ -190,7 +190,7 @@
- ide_end_request(1, hwgroup);
- if (i > 0) {
- idedisk_output_data (drive, rq->buffer, SECTOR_WORDS);
- - ide_set_handler (drive, &write_intr, WAIT_CMD);
- + ide_set_handler (drive, &write_intr, WAIT_CMD, NULL);
- }
- goto out;
- }
- @@ -252,7 +252,7 @@
- if (stat & DRQ_STAT) {
- if (rq->nr_sectors) {
- ide_multwrite(drive, drive->mult_count);
- - ide_set_handler (drive, &multwrite_intr, WAIT_CMD);
- + ide_set_handler (drive, &multwrite_intr, WAIT_CMD, NULL);
- goto out;
- }
- } else {
- @@ -371,7 +371,7 @@
- if (drive->using_dma && !(HWIF(drive)->dmaproc(ide_dma_read, drive)))
- return;
- #endif /* CONFIG_BLK_DEV_IDEDMA */
- - ide_set_handler(drive, &read_intr, WAIT_CMD);
- + ide_set_handler(drive, &read_intr, WAIT_CMD, NULL);
- OUT_BYTE(drive->mult_count ? WIN_MULTREAD : WIN_READ, IDE_COMMAND_REG);
- return;
- }
- @@ -390,10 +390,10 @@
- __cli(); /* local CPU only */
- if (drive->mult_count) {
- HWGROUP(drive)->wrq = *rq; /* scratchpad */
- - ide_set_handler (drive, &multwrite_intr, WAIT_CMD);
- + ide_set_handler (drive, &multwrite_intr, WAIT_CMD, NULL);
- ide_multwrite(drive, drive->mult_count);
- } else {
- - ide_set_handler (drive, &write_intr, WAIT_CMD);
- + ide_set_handler (drive, &write_intr, WAIT_CMD, NULL);
- idedisk_output_data(drive, rq->buffer, SECTOR_WORDS);
- }
- return;
- diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/drivers/block/ide-dma.c linux/drivers/block/ide-dma.c
- --- linux-2.2.13/drivers/block/ide-dma.c Tue May 18 13:17:11 1999
- +++ linux/drivers/block/ide-dma.c Sun Nov 7 15:17:34 1999
- @@ -329,7 +329,7 @@
- drive->waiting_for_dma = 1;
- if (drive->media != ide_disk)
- return 0;
- - ide_set_handler(drive, &ide_dma_intr, WAIT_CMD);/* issue cmd to drive */
- + ide_set_handler(drive, &ide_dma_intr, WAIT_CMD, NULL);/* issue cmd to drive */
- OUT_BYTE(reading ? WIN_READDMA : WIN_WRITEDMA, IDE_COMMAND_REG);
- case ide_dma_begin:
- /* Note that this is done *after* the cmd has
- diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/drivers/block/ide-floppy.c linux/drivers/block/ide-floppy.c
- --- linux-2.2.13/drivers/block/ide-floppy.c Thu Sep 9 12:27:35 1999
- +++ linux/drivers/block/ide-floppy.c Sun Nov 7 15:18:08 1999
- @@ -920,7 +920,7 @@
- if (temp > pc->buffer_size) {
- printk (KERN_ERR "ide-floppy: The floppy wants to send us more data than expected - discarding datan");
- idefloppy_discard_data (drive,bcount.all);
- - ide_set_handler (drive,&idefloppy_pc_intr,IDEFLOPPY_WAIT_CMD);
- + ide_set_handler (drive,&idefloppy_pc_intr,IDEFLOPPY_WAIT_CMD,NULL);
- return;
- }
- #if IDEFLOPPY_DEBUG_LOG
- @@ -942,7 +942,7 @@
- pc->actually_transferred+=bcount.all; /* Update the current position */
- pc->current_position+=bcount.all;
-
- - ide_set_handler (drive,&idefloppy_pc_intr,IDEFLOPPY_WAIT_CMD); /* And set the interrupt handler again */
- + ide_set_handler (drive,&idefloppy_pc_intr,IDEFLOPPY_WAIT_CMD,NULL); /* And set the interrupt handler again */
- }
-
- static void idefloppy_transfer_pc (ide_drive_t *drive)
- @@ -960,7 +960,7 @@
- ide_do_reset (drive);
- return;
- }
- - ide_set_handler (drive, &idefloppy_pc_intr, IDEFLOPPY_WAIT_CMD); /* Set the interrupt routine */
- + ide_set_handler (drive, &idefloppy_pc_intr, IDEFLOPPY_WAIT_CMD, NULL); /* Set the interrupt routine */
- atapi_output_bytes (drive, floppy->pc->c, 12); /* Send the actual packet */
- }
-
- @@ -1028,7 +1028,7 @@
- #endif /* CONFIG_BLK_DEV_IDEDMA */
-
- if (test_bit (IDEFLOPPY_DRQ_INTERRUPT, &floppy->flags)) {
- - ide_set_handler (drive, &idefloppy_transfer_pc, IDEFLOPPY_WAIT_CMD);
- + ide_set_handler (drive, &idefloppy_transfer_pc, IDEFLOPPY_WAIT_CMD, NULL);
- OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG); /* Issue the packet command */
- } else {
- OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG);
- diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/drivers/block/ide-pmac.c linux/drivers/block/ide-pmac.c
- --- linux-2.2.13/drivers/block/ide-pmac.c Fri Nov 5 15:15:33 1999
- +++ linux/drivers/block/ide-pmac.c Sun Nov 7 15:18:26 1999
- @@ -359,7 +359,7 @@
- drive->waiting_for_dma = 1;
- if (drive->media != ide_disk)
- return 0;
- - ide_set_handler(drive, &ide_dma_intr, WAIT_CMD);
- + ide_set_handler(drive, &ide_dma_intr, WAIT_CMD, NULL);
- OUT_BYTE(func==ide_dma_write? WIN_WRITEDMA: WIN_READDMA,