dvd-2.2.13-5.diff
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:291k
源码类别:

DVD

开发平台:

Unix_Linux

  1. diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/drivers/block/ide-cd.c linux/drivers/block/ide-cd.c
  2. --- linux-2.2.13/drivers/block/ide-cd.c Fri Nov  5 15:15:33 1999
  3. +++ linux/drivers/block/ide-cd.c Sun Nov  7 15:15:59 1999
  4. @@ -2,7 +2,7 @@
  5.   * linux/drivers/block/ide-cd.c
  6.   * Copyright (C) 1994, 1995, 1996  scott snyder  <snyder@fnald0.fnal.gov>
  7.   * Copyright (C) 1996-1998  Erik Andersen <andersee@debian.org>
  8. - * Copyright (C) 1998, 1999 Jens Axboe
  9. + * Copyright (C) 1998, 1999 Jens Axboe <axboe@image.dk>
  10.   *
  11.   * May be copied or modified under the terms of the GNU General Public
  12.   * License.  See linux/COPYING for more information.
  13. @@ -12,29 +12,20 @@
  14.   *
  15.   * Suggestions are welcome. Patches that work are more welcome though. ;-)
  16.   * For those wishing to work on this driver, please be sure you download
  17. - * and comply with the latest ATAPI standard. This document can be
  18. - * obtained by anonymous ftp from:
  19. - * ftp://fission.dt.wdc.com/pub/standards/SFF_atapi/spec/SFF8020-r2.6/PS/8020r26.ps
  20. + * and comply with the latest Mt. Fuji (SFF8090 version 4) and ATAPI 
  21. + * (SFF-8020i rev 2.6) standards. These documents can be obtained by 
  22. + * anonymous ftp from:
  23. + * ftp://fission.dt.wdc.com/pub/standards/SFF/specs/INF-8020.PDF
  24. + * ftp://ftp.avc-pioneer.com/Mtfuji4/Spec/Fuji4r01.pdf
  25.   *
  26. - * Drives that deviate from the ATAPI standard will be accomodated as much
  27. + * Drives that deviate from these standards will be accomodated as much
  28.   * as possible via compile time or command-line options.  Since I only have
  29.   * a few drives, you generally need to send me patches...
  30.   *
  31.   * ----------------------------------
  32.   * TO DO LIST:
  33. - * -Implement Microsoft Media Status Notification per the spec at
  34. - *   http://www.microsoft.com/hwdev/respec/storspec.htm
  35. - *   This will allow us to get automagically notified when the media changes
  36. - *   on ATAPI drives (something the stock ATAPI spec is lacking).  Looks
  37. - *   very cool.  I discovered its existance the other day at work...
  38. - * -Query the drive to find what features are available before trying to
  39. - *   use them (like trying to close the tray in drives that can't).
  40.   * -Make it so that Pioneer CD DR-A24X and friends don't get screwed up on
  41.   *   boot
  42. - * -Integrate DVD-ROM support in driver. Thanks to Merete Gots鎑-Petersen
  43. - *   of Pioneer Denmark for providing me with a drive for testing.
  44. - * -Implement Features and Profiles.
  45. - *
  46.   *
  47.   * ----------------------------------
  48.   * 1.00  Oct 31, 1994 -- Initial version.
  49. @@ -243,20 +234,49 @@
  50.   *                         Useful when using ide-cd in conjunction with
  51.   *                         ide-scsi. TODO: non-modular way of doing the
  52.   *                         same.
  53. - *                         
  54. - * 4.54  Sep 09, 1999  - Fixed start/stop error on some drives if the
  55. - *    drive was locked.
  56. - * - Fixed read_toc header, size given was too large.
  57. - * - Fixed possible leaks in ioctl.
  58. - * - CDROMREADTOCENTRY now honors the cdte_format
  59. - *    field, instead of forcing CDROM_LBA.
  60. - * - Mask out things the drive can't do instead of
  61. - *    just telling people what the driver can do.
  62. + *
  63. + * 4.54  Aug 5, 1999 - Support for MMC2 class commands through the generic
  64. + *   packet interface to cdrom.c.
  65. + * - Unified audio ioctl support, most of it.
  66. + * - cleaned up various deprecated verify_area().
  67. + * - Added ide_cdrom_packet() as the interface for
  68. + *   the Uniform generic_packet().
  69. + * - bunch of other stuff, will fill in logs later.
  70. + * - report 1 slot for non-changers, like the other
  71. + *   cd-rom drivers. don't report select disc for
  72. + *   non-changers as well.
  73. + * - mask out audio playing, if the device can't do it.
  74. + *
  75. + * 4.55  Sep 1, 1999 - Eliminated the rest of the audio ioctls, except
  76. + *   for CDROMREADTOC[ENTRY|HEADER]. Some of the drivers
  77. + *   use this independently of the actual audio handling.
  78. + *   They will disappear later when I get the time to
  79. + *   do it cleanly.
  80. + * - Minimize the TOC reading - only do it when we
  81. + *   know a media change has occured.
  82. + * - Moved all the CDROMREADx ioctls to the Uniform layer.
  83. + * - Heiko Eissfeldt <heiko@colossus.escape.de> supplied
  84. + *   some fixes for CDI.
  85. + * - CD-ROM leaving door locked fix from Andries
  86. + *   Brouwer <Andries.Brouwer@cwi.nl>
  87. + * - Erik Andersen <andersen@xmission.com> unified
  88. + *   commands across the various drivers and how
  89. + *   sense errors are handled.
  90. + *
  91. + * 4.56  Sep 12, 1999 - Removed changer support - it is now in the
  92. + *   Uniform layer.
  93. + * - Added partition based multisession handling.
  94. + * - Mode sense and mode select moved to the
  95. + *   Uniform layer.
  96. + * - Fixed a problem with WPI CDS-32X drive - it
  97. + *   failed the capabilities 
  98. + *
  99.   *
  100.   *************************************************************************/
  101. +#define IDECD_VERSION "4.56"
  102.  
  103. -#define IDECD_VERSION "4.54"
  104. -
  105. +#include <linux/config.h>
  106.  #include <linux/module.h>
  107.  #include <linux/types.h>
  108.  #include <linux/kernel.h>
  109. @@ -266,6 +286,7 @@
  110.  #include <linux/interrupt.h>
  111.  #include <linux/errno.h>
  112.  #include <linux/cdrom.h>
  113. +
  114.  #include <asm/irq.h>
  115.  #include <asm/io.h>
  116.  #include <asm/byteorder.h>
  117. @@ -310,17 +331,18 @@
  118.      uses this command to poll the drive, and we don't want
  119.      to fill the syslog with useless errors. */
  120.   if (failed_command &&
  121. -     failed_command->c[0] == SCMD_READ_SUBCHANNEL)
  122. +     failed_command->c[0] == GPCMD_READ_SUBCHANNEL)
  123.   return;
  124.   }
  125. +
  126.   if (reqbuf->error_code == 0x70 && reqbuf->sense_key  == 0x02
  127. -  && ((reqbuf->asc        == 0x3a && reqbuf->ascq       == 0x00) ||
  128. -      (reqbuf->asc        == 0x04 && reqbuf->ascq       == 0x01)))
  129. +  && ((reqbuf->asc      == 0x3a && reqbuf->ascq       == 0x00) ||
  130. +      (reqbuf->asc      == 0x04 && reqbuf->ascq       == 0x01)))
  131.   {
  132.   /*
  133.    * Suppress the following errors:
  134. -  * "Medium not present", and "in progress of becoming ready",
  135. -  * to keep the noise level down to a dull roar.
  136. +  * "Medium not present", "in progress of becoming ready",
  137. +  * and "writing" to keep the noise level down to a dull roar.
  138.    */
  139.   return;
  140.   }
  141. @@ -352,15 +374,16 @@
  142.   s = buf;
  143.   } else {
  144.   int lo=0, mid, hi=ARY_LEN (sense_data_texts);
  145. - unsigned short key = (reqbuf->asc << 8);
  146. + unsigned long key = (reqbuf->sense_key << 16);
  147. + key |= (reqbuf->asc << 8);
  148.   if ( ! (reqbuf->ascq >= 0x80 && reqbuf->ascq <= 0xdd) )
  149.   key |= reqbuf->ascq;
  150. -
  151.   s = NULL;
  152.  
  153.   while (hi > lo) {
  154.   mid = (lo + hi) / 2;
  155. - if (sense_data_texts[mid].asc_ascq == key) {
  156. + if (sense_data_texts[mid].asc_ascq == key ||
  157. +     sense_data_texts[mid].asc_ascq == (0xff0000|key)) {
  158.   s = sense_data_texts[mid].text;
  159.   break;
  160.   }
  161. @@ -404,6 +427,19 @@
  162.   printk (""n");
  163.   }
  164.  
  165. + /* The SKSV bit specifies validity of the sense_key_specific
  166. +  * in the next two commands. It is bit 7 of the first byte.
  167. +  * In the case of NOT_READY, if SKSV is set the drive can
  168. +  * give us nice ETA readings.
  169. +  */
  170. + if (reqbuf->sense_key == NOT_READY &&
  171. +     (reqbuf->sense_key_specific[0] & 0x80)) {
  172. + int progress = (reqbuf->sense_key_specific[1] << 8 |
  173. + reqbuf->sense_key_specific[2]) * 100;
  174. + printk("  Command is %02d%% completen", progress / 0xffff);
  175. +
  176. + }
  177. +
  178.   if (reqbuf->sense_key == ILLEGAL_REQUEST &&
  179.       (reqbuf->sense_key_specific[0] & 0x80) != 0) {
  180.   printk ("  Error in %s byte %d",
  181. @@ -439,21 +475,6 @@
  182.  #endif /* not VERBOSE_IDE_CD_ERRORS */
  183.  }
  184.  
  185. -
  186. -/* Fix up a possibly partially-processed request so that we can
  187. -   start it over entirely, or even put it back on the request queue. */
  188. -static void restore_request (struct request *rq)
  189. -{
  190. - if (rq->buffer != rq->bh->b_data) {
  191. - int n = (rq->buffer - rq->bh->b_data) / SECTOR_SIZE;
  192. - rq->buffer = rq->bh->b_data;
  193. - rq->nr_sectors += n;
  194. - rq->sector -= n;
  195. - }
  196. - rq->current_nr_sectors = rq->bh->b_size >> SECTOR_BITS;
  197. -}
  198. -
  199. -
  200.  static void cdrom_queue_request_sense (ide_drive_t *drive, 
  201.          struct semaphore *sem,
  202.          struct atapi_request_sense *reqbuf,
  203. @@ -481,7 +502,7 @@
  204.   len = sizeof (*reqbuf) / 4;
  205.   len *= 4;
  206.  
  207. - pc->c[0] = REQUEST_SENSE;
  208. + pc->c[0] = GPCMD_REQUEST_SENSE;
  209.   pc->c[4] = (unsigned char) len;
  210.   pc->buffer = (char *)reqbuf;
  211.   pc->buflen = len;
  212. @@ -506,13 +527,12 @@
  213.   struct packet_command *pc = (struct packet_command *)
  214.                         rq->buffer;
  215.   cdrom_analyze_sense_data (drive,
  216. -   (struct atapi_request_sense *)
  217. -    (pc->buffer - pc->c[4]), 
  218. -   (struct packet_command *)
  219. -    pc->sense_data);
  220. + (struct atapi_request_sense *) (pc->buffer - pc->c[4]),
  221. + (struct packet_command *) pc->sense_data);
  222.   }
  223.   if (rq->cmd == READ && !rq->current_nr_sectors)
  224.   uptodate = 1;
  225. +
  226.   ide_end_request (uptodate, HWGROUP(drive));
  227.  }
  228.  
  229. @@ -523,8 +543,9 @@
  230.   int *stat_ret)
  231.  {
  232.   struct request *rq = HWGROUP(drive)->rq;
  233. - int stat, err, sense_key, cmd;
  234. -
  235. + int stat, cmd, err, sense_key;
  236. + struct packet_command *pc = (struct packet_command *) rq->buffer;
  237. +
  238.   /* Check for errors. */
  239.   stat = GET_STAT();
  240.   *stat_ret = stat;
  241. @@ -532,8 +553,8 @@
  242.   if (OK_STAT (stat, good_stat, BAD_R_STAT))
  243.   return 0;
  244.  
  245. - /* Got an error. */
  246. - err = IN_BYTE (IDE_ERROR_REG);
  247. + /* Get the IDE error register. */
  248. + err = GET_ERR();
  249.   sense_key = err >> 4;
  250.  
  251.   if (rq == NULL)
  252. @@ -547,8 +568,6 @@
  253.      from the drive (probably while trying
  254.      to recover from a former error).  Just give up. */
  255.  
  256. - struct packet_command *pc = (struct packet_command *)
  257. -                       rq->buffer;
  258.   pc->stat = 1;
  259.   cdrom_end_request (1, drive);
  260.   ide_error (drive, "request sense failure", stat);
  261. @@ -557,23 +576,11 @@
  262.   } else if (cmd == PACKET_COMMAND) {
  263.   /* All other functions, except for READ. */
  264.  
  265. - struct packet_command *pc = (struct packet_command *)
  266. -                       rq->buffer;
  267.   struct semaphore *sem = NULL;
  268.  
  269.   /* Check for tray open. */
  270.   if (sense_key == NOT_READY) {
  271.   cdrom_saw_media_change (drive);
  272. -#if 0 /* let the upper layers do the complaining */
  273. - /* Print an error message to the syslog.
  274. -    Exception: don't print anything if this
  275. -    is a read subchannel command.  This is
  276. -    because workman constantly polls the drive
  277. -    with this command, and we don't want
  278. -    to uselessly fill up the syslog. */
  279. - if (pc->c[0] != SCMD_READ_SUBCHANNEL)
  280. - printk ("%s: tray open or drive not readyn", drive->name);
  281. -#endif
  282.   } else if (sense_key == UNIT_ATTENTION) {
  283.   /* Check for media change. */
  284.   cdrom_saw_media_change (drive);
  285. @@ -652,6 +659,20 @@
  286.   return 1;
  287.  }
  288.  
  289. +static int cdrom_timer_expiry(ide_drive_t *drive)
  290. +{
  291. + struct request *rq = HWGROUP(drive)->rq;
  292. + struct packet_command *pc = (struct packet_command *) rq->buffer;
  293. + unsigned long wait = 0;
  294. +
  295. + /* blank and format can take an extremly long time to
  296. +  * complete, if the IMMED bit was not set.
  297. +  */
  298. + if (pc->c[0] == GPCMD_BLANK || pc->c[0] == GPCMD_FORMAT_UNIT)
  299. + wait = 60*60*HZ;
  300. +
  301. + return wait;
  302. +}
  303.  
  304.  /* Set up the device registers for transferring a packet command on DEV,
  305.     expecting to later transfer XFERLEN bytes.  HANDLER is the routine
  306. @@ -666,7 +687,7 @@
  307.   struct cdrom_info *info = drive->driver_data;
  308.  
  309.   /* Wait for the controller to be idle. */
  310. - if (ide_wait_stat (drive, 0, BUSY_STAT, WAIT_READY)) return 1;
  311. + if (ide_wait_stat(drive, 0, BUSY_STAT, WAIT_READY)) return 1;
  312.  
  313.   if (info->dma)
  314.   info->dma = !HWIF(drive)->dmaproc(ide_dma_read, drive);
  315. @@ -678,13 +699,14 @@
  316.  
  317.   OUT_BYTE (xferlen & 0xff, IDE_LCYL_REG);
  318.   OUT_BYTE (xferlen >> 8  , IDE_HCYL_REG);
  319. - OUT_BYTE (drive->ctl, IDE_CONTROL_REG);
  320. + if (IDE_CONTROL_REG)
  321. + OUT_BYTE (drive->ctl, IDE_CONTROL_REG);
  322.   
  323.   if (info->dma)
  324.   (void) (HWIF(drive)->dmaproc(ide_dma_begin, drive));
  325.  
  326.   if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) {
  327. - ide_set_handler (drive, handler, WAIT_CMD);
  328. + ide_set_handler (drive, handler, WAIT_CMD, cdrom_timer_expiry);
  329.   OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG); /* packet command */
  330.   } else {
  331.   OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG); /* packet command */
  332. @@ -701,7 +723,7 @@
  333.     HANDLER is the interrupt handler to call when the command completes
  334.     or there's data ready. */
  335.  static int cdrom_transfer_packet_command (ide_drive_t *drive,
  336. -                                          char *cmd_buf, int cmd_len,
  337. +                                          unsigned char *cmd_buf, int cmd_len,
  338.     ide_handler_t *handler)
  339.  {
  340.   if (CDROM_CONFIG_FLAGS (drive)->drq_interrupt) {
  341. @@ -719,7 +741,7 @@
  342.   }
  343.  
  344.   /* Arm the interrupt handler. */
  345. - ide_set_handler (drive, handler, WAIT_CMD);
  346. + ide_set_handler (drive, handler, WAIT_CMD, cdrom_timer_expiry);
  347.  
  348.   /* Send the command to the device. */
  349.   atapi_output_bytes (drive, cmd_buf, cmd_len);
  350. @@ -752,25 +774,16 @@
  351.  
  352.   char *dest;
  353.  
  354. - /* If we don't yet have a sector buffer, try to allocate one.
  355. -    If we can't get one atomically, it's not fatal -- we'll just throw
  356. -    the data away rather than caching it. */
  357. - if (info->sector_buffer == NULL) {
  358. - info->sector_buffer = (char *) kmalloc (SECTOR_BUFFER_SIZE,
  359. - GFP_ATOMIC);
  360. -
  361. - /* If we couldn't get a buffer,
  362. -    don't try to buffer anything... */
  363. - if (info->sector_buffer == NULL)
  364. + /* If we couldn't get a buffer, don't try to buffer anything... */
  365. + if (info->buffer == NULL)
  366.   sectors_to_buffer = 0;
  367. - }
  368.  
  369.   /* If this is the first sector in the buffer, remember its number. */
  370.   if (info->nsectors_buffered == 0)
  371.   info->sector_buffered = sector;
  372.  
  373.   /* Read the data into the buffer. */
  374. - dest = info->sector_buffer + info->nsectors_buffered * SECTOR_SIZE;
  375. + dest = info->buffer + info->nsectors_buffered * SECTOR_SIZE;
  376.   while (sectors_to_buffer > 0) {
  377.   atapi_input_bytes (drive, dest, SECTOR_SIZE);
  378.   --sectors_to_buffer;
  379. @@ -787,7 +800,6 @@
  380.   }
  381.  }
  382.  
  383. -
  384.  /*
  385.   * Check the contents of the interrupt reason register from the cdrom
  386.   * and attempt to recover if there are problems.  Returns  0 if everything's
  387. @@ -812,6 +824,12 @@
  388.   atapi_output_bytes (drive, &dum, sizeof (dum));
  389.   len -= sizeof (dum);
  390.   }
  391. + } else  if (ireason == 1) {
  392. + /* Some drives (ASUS) seem to tell us that status
  393. +  * info is available. just get it and ignore.
  394. +  */
  395. + GET_STAT();
  396. + return 0;
  397.   } else {
  398.   /* Drive wants a command packet, or invalid ireason... */
  399.   printk ("%s: cdrom_read_intr: bad interrupt reason %dn",
  400. @@ -822,7 +840,6 @@
  401.   return -1;
  402.  }
  403.  
  404. -
  405.  /*
  406.   * Interrupt routine.  Called when a read request has completed.
  407.   */
  408. @@ -846,13 +863,14 @@
  409.   return;
  410.   
  411.   if (dma) {
  412. - if (!dma_error) {
  413. - for (i = rq->nr_sectors; i > 0;) {
  414. - i -= rq->current_nr_sectors;
  415. - ide_end_request(1, HWGROUP(drive));
  416. - }
  417. - } else
  418. + if (dma_error) {
  419.   ide_error (drive, "dma error", stat);
  420. + return;
  421. + }
  422. + for (i = rq->nr_sectors; i > 0;) {
  423. + i -= rq->current_nr_sectors;
  424. + ide_end_request(1, HWGROUP(drive));
  425. + }
  426.   return;
  427.   }
  428.  
  429. @@ -897,8 +915,7 @@
  430.  
  431.   /* First, figure out if we need to bit-bucket
  432.      any of the leading sectors. */
  433. - nskip = MIN ((int)(rq->current_nr_sectors -
  434. -    (rq->bh->b_size >> SECTOR_BITS)),
  435. + nskip = MIN ((int)(rq->current_nr_sectors - (rq->bh->b_size >> SECTOR_BITS)),
  436.        sectors_to_transfer);
  437.  
  438.   while (nskip > 0) {
  439. @@ -924,8 +941,7 @@
  440.   /* If the buffers are full, cache the rest of the data in our
  441.      internal buffer. */
  442.   if (rq->current_nr_sectors == 0) {
  443. - cdrom_buffer_sectors (drive,
  444. -       rq->sector, sectors_to_transfer);
  445. + cdrom_buffer_sectors(drive, rq->sector, sectors_to_transfer);
  446.   sectors_to_transfer = 0;
  447.   } else {
  448.   /* Transfer data to the buffers.
  449. @@ -937,8 +953,7 @@
  450.   /* Read this_transfer sectors
  451.      into the current buffer. */
  452.   while (this_transfer > 0) {
  453. - atapi_input_bytes (drive,
  454. -    rq->buffer, SECTOR_SIZE);
  455. + atapi_input_bytes(drive, rq->buffer, SECTOR_SIZE);
  456.   rq->buffer += SECTOR_SIZE;
  457.   --rq->nr_sectors;
  458.   --rq->current_nr_sectors;
  459. @@ -951,10 +966,9 @@
  460.  
  461.   /* Done moving data!
  462.      Wait for another interrupt. */
  463. - ide_set_handler (drive, &cdrom_read_intr, WAIT_CMD);
  464. + ide_set_handler(drive, &cdrom_read_intr, WAIT_CMD, NULL);
  465.  }
  466.  
  467. -
  468.  /*
  469.   * Try to satisfy some of the current read request from our cached data.
  470.   * Returns nonzero if the request has been completed, zero otherwise.
  471. @@ -965,7 +979,7 @@
  472.   struct request *rq = HWGROUP(drive)->rq;
  473.  
  474.   /* Can't do anything if there's no buffer. */
  475. - if (info->sector_buffer == NULL) return 0;
  476. + if (info->buffer == NULL) return 0;
  477.  
  478.   /* Loop while this request needs data and the next block is present
  479.      in our cache. */
  480. @@ -976,7 +990,7 @@
  481.   cdrom_end_request (1, drive);
  482.  
  483.   memcpy (rq->buffer,
  484. - info->sector_buffer +
  485. + info->buffer +
  486.   (rq->sector - info->sector_buffered) * SECTOR_SIZE,
  487.   SECTOR_SIZE);
  488.   rq->buffer += SECTOR_SIZE;
  489. @@ -1011,8 +1025,6 @@
  490.   return 0;
  491.  }
  492.  
  493. -
  494. -
  495.  /*
  496.   * Routine to send a read packet command to the drive.
  497.   * This is usually called directly from cdrom_start_read.
  498. @@ -1041,14 +1053,13 @@
  499.   nskip = (sector % SECTORS_PER_FRAME);
  500.   if (nskip > 0) {
  501.   /* Sanity check... */
  502. - if (rq->current_nr_sectors !=
  503. -     (rq->bh->b_size >> SECTOR_BITS)) {
  504. - printk ("%s: cdrom_start_read_continuation: buffer botch (%ld)n",
  505. + if (rq->current_nr_sectors != (rq->bh->b_size >> SECTOR_BITS) &&
  506. + (rq->sector % CD_FRAMESIZE != 0)) {
  507. + printk ("%s: cdrom_start_read_continuation: buffer botch (%lu)n",
  508.   drive->name, rq->current_nr_sectors);
  509.   cdrom_end_request (0, drive);
  510.   return;
  511.   }
  512. -
  513.   sector -= nskip;
  514.   nsect += nskip;
  515.   rq->current_nr_sectors += nskip;
  516. @@ -1066,7 +1077,7 @@
  517.  
  518.   /* Set up the command */
  519.   memset (&pc.c, 0, sizeof (pc.c));
  520. - pc.c[0] = READ_10;
  521. + pc.c[0] = GPCMD_READ_10;
  522.   pc.c[7] = (nframes >> 8);
  523.   pc.c[8] = (nframes & 0xff);
  524.   put_unaligned(htonl (frame), (unsigned int *) &pc.c[2]);
  525. @@ -1076,9 +1087,10 @@
  526.         &cdrom_read_intr);
  527.  }
  528.  
  529. +
  530.  #define IDECD_SEEK_THRESHOLD (1000) /* 1000 blocks */
  531. -#define IDECD_SEEK_TIMER (2 * WAIT_MIN_SLEEP) /* 40 ms */
  532. -#define IDECD_SEEK_TIMEOUT     WAIT_CMD                /* 10 sec */
  533. +#define IDECD_SEEK_TIMER (5 * WAIT_MIN_SLEEP) /* 100 ms */
  534. +#define IDECD_SEEK_TIMEOUT     WAIT_CMD /* 10 sec */
  535.  
  536.  static void cdrom_seek_intr (ide_drive_t *drive)
  537.  {
  538. @@ -1092,7 +1104,7 @@
  539.  
  540.   if (retry && jiffies - info->start_seek > IDECD_SEEK_TIMER) {
  541.   if (--retry == 0) {
  542. - printk ("%s: disabled DSC seek overlapn", drive->name);
  543. + printk("%s: disabled DSC seek overlapn", drive->name);
  544.   drive->dsc_overlap = 0;
  545.   }
  546.   }
  547. @@ -1111,8 +1123,8 @@
  548.   frame = sector / SECTORS_PER_FRAME;
  549.  
  550.   memset (&pc.c, 0, sizeof (pc.c));
  551. - pc.c[0] = SEEK;
  552. - put_unaligned(htonl (frame), (unsigned int *) &pc.c[2]);
  553. + pc.c[0] = GPCMD_SEEK;
  554. + put_unaligned(cpu_to_be32(frame), (unsigned int *) &pc.c[2]);
  555.   (void) cdrom_transfer_packet_command (drive, pc.c, sizeof (pc.c), &cdrom_seek_intr);
  556.  }
  557.  
  558. @@ -1125,6 +1137,19 @@
  559.   cdrom_start_packet_command (drive, 0, cdrom_start_seek_continuation);
  560.  }
  561.  
  562. +/* Fix up a possibly partially-processed request so that we can
  563. +   start it over entirely, or even put it back on the request queue. */
  564. +static void restore_request (struct request *rq)
  565. +{
  566. + if (rq->buffer != rq->bh->b_data) {
  567. + int n = (rq->buffer - rq->bh->b_data) / SECTOR_SIZE;
  568. + rq->buffer = rq->bh->b_data;
  569. + rq->nr_sectors += n;
  570. + rq->sector -= n;
  571. + }
  572. + rq->current_nr_sectors = rq->bh->b_size >> SECTOR_BITS;
  573. +}
  574. +
  575.  /*
  576.   * Start a read request from the CD-ROM.
  577.   */
  578. @@ -1147,25 +1172,22 @@
  579.   restore_request (rq);
  580.  
  581.   /* Satisfy whatever we can of this request from our cached sector. */
  582. - if (cdrom_read_from_buffer (drive))
  583. + if (cdrom_read_from_buffer(drive))
  584.   return;
  585.  
  586. - /* Clear the local sector buffer. */
  587.   info->nsectors_buffered = 0;
  588.  
  589. - if (drive->using_dma && (rq->sector % SECTORS_PER_FRAME == 0) && (rq->nr_sectors % SECTORS_PER_FRAME == 0))
  590. + /* use dma, if possible. */
  591. + if (drive->using_dma && (rq->sector % SECTORS_PER_FRAME == 0) &&
  592. + (rq->nr_sectors % SECTORS_PER_FRAME == 0))
  593.   info->dma = 1;
  594.   else
  595.   info->dma = 0;
  596.  
  597.   /* Start sending the read request to the drive. */
  598. - cdrom_start_packet_command (drive, 32768,
  599. -     cdrom_start_read_continuation);
  600. + cdrom_start_packet_command(drive, 32768, cdrom_start_read_continuation);
  601.  }
  602.  
  603. -
  604. -
  605. -
  606.  /****************************************************************************
  607.   * Execute all other packet commands.
  608.   */
  609. @@ -1175,8 +1197,6 @@
  610.  cdrom_lockdoor (ide_drive_t *drive, int lockflag,
  611.   struct atapi_request_sense *reqbuf);
  612.  
  613. -
  614. -
  615.  /* Interrupt routine for packet command completion. */
  616.  static void cdrom_pc_intr (ide_drive_t *drive)
  617.  {
  618. @@ -1197,7 +1217,7 @@
  619.   if ((stat & DRQ_STAT) == 0) {
  620.   /* Some of the trailing request sense fields are optional, and
  621.      some drives don't send them.  Sigh. */
  622. - if (pc->c[0] == REQUEST_SENSE &&
  623. + if (pc->c[0] == GPCMD_REQUEST_SENSE &&
  624.       pc->buflen > 0 &&
  625.       pc->buflen <= 5) {
  626.   while (pc->buflen > 0) {
  627. @@ -1224,20 +1244,10 @@
  628.  
  629.   /* Figure out how much data to transfer. */
  630.   thislen = pc->buflen;
  631. - if (thislen < 0) thislen = -thislen;
  632.   if (thislen > len) thislen = len;
  633.  
  634.   /* The drive wants to be written to. */
  635.   if ((ireason & 3) == 0) {
  636. - /* Check that we want to write. */
  637. - if (pc->buflen > 0) {
  638. - printk ("%s: cdrom_pc_intr: Drive wants "
  639. - "to transfer data the wrong way!n",
  640. - drive->name);
  641. - pc->stat = 1;
  642. - thislen = 0;
  643. - }
  644. -
  645.   /* Transfer the data. */
  646.   atapi_output_bytes (drive, pc->buffer, thislen);
  647.  
  648. @@ -1251,19 +1261,11 @@
  649.  
  650.   /* Keep count of how much data we've moved. */
  651.   pc->buffer += thislen;
  652. - pc->buflen += thislen;
  653. + pc->buflen -= thislen;
  654.   }
  655.  
  656.   /* Same drill for reading. */
  657.   else if ((ireason & 3) == 2) {
  658. - /* Check that we want to read. */
  659. - if (pc->buflen < 0) {
  660. - printk ("%s: cdrom_pc_intr: Drive wants to "
  661. - "transfer data the wrong way!n",
  662. - drive->name);
  663. - pc->stat = 1;
  664. - thislen = 0;
  665. - }
  666.  
  667.   /* Transfer the data. */
  668.   atapi_input_bytes (drive, pc->buffer, thislen);
  669. @@ -1287,7 +1289,7 @@
  670.   }
  671.  
  672.   /* Now we wait for another interrupt. */
  673. - ide_set_handler (drive, &cdrom_pc_intr, WAIT_CMD);
  674. + ide_set_handler (drive, &cdrom_pc_intr, WAIT_CMD, cdrom_timer_expiry);
  675.  }
  676.  
  677.  
  678. @@ -1310,11 +1312,8 @@
  679.   struct cdrom_info *info = drive->driver_data;
  680.  
  681.   info->dma = 0;
  682. -
  683. - len = pc->buflen;
  684. - if (len < 0) len = -len;
  685. -
  686.   pc->stat = 0;
  687. + len = pc->buflen;
  688.  
  689.   /* Start sending the command to the drive. */
  690.   cdrom_start_packet_command (drive, len, cdrom_do_pc_continuation);
  691. @@ -1362,67 +1361,60 @@
  692.   if (reqbuf->sense_key == UNIT_ATTENTION)
  693.   cdrom_saw_media_change (drive);
  694.   else if (reqbuf->sense_key == NOT_READY &&
  695. -  reqbuf->asc == 4) {
  696. +  reqbuf->asc == 4 && reqbuf->ascq != 4) {
  697.   /* The drive is in the process of loading
  698.      a disk.  Retry, but wait a little to give
  699.      the drive time to complete the load. */
  700.   cdrom_sleep (HZ);
  701. - } else
  702. + } else {
  703.   /* Otherwise, don't retry. */
  704.   retries = 0;
  705. -
  706. + }
  707.   --retries;
  708.   }
  709.  
  710.   /* End of retry loop. */
  711.   } while (pc->stat != 0 && retries >= 0);
  712.  
  713. -
  714.   /* Return an error if the command failed. */
  715.   if (pc->stat != 0)
  716.   return -EIO;
  717.   else {
  718.   /* The command succeeded.  If it was anything other than
  719.      a request sense, eject, or door lock command,
  720. -    and we think that the door is presently, lock it again.
  721. -    (The door was probably unlocked via an explicit
  722. +    and we think that the door is presently unlocked, lock it
  723. +    again. (The door was probably unlocked via an explicit
  724.      CDROMEJECT ioctl.) */
  725. - if (CDROM_STATE_FLAGS (drive)->door_locked == 0 && drive->usage &&
  726. -     (pc->c[0] != REQUEST_SENSE &&
  727. -      pc->c[0] != ALLOW_MEDIUM_REMOVAL &&
  728. -      pc->c[0] != START_STOP)) {
  729. + if (CDROM_STATE_FLAGS (drive)->door_locked == 0 &&
  730. +     (pc->c[0] != GPCMD_TEST_UNIT_READY &&
  731. +      pc->c[0] != GPCMD_REQUEST_SENSE &&
  732. +      pc->c[0] != GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL &&
  733. +      pc->c[0] != GPCMD_START_STOP_UNIT &&
  734. +      pc->c[0] != GPCMD_MODE_SENSE_10 &&
  735. +      pc->c[0] != GPCMD_MODE_SELECT_10)) {
  736.   (void) cdrom_lockdoor (drive, 1, NULL);
  737.   }
  738.   return 0;
  739.   }
  740.  }
  741.  
  742. -
  743.  /****************************************************************************
  744.   * cdrom driver request routine.
  745.   */
  746.  static
  747.  void ide_do_rw_cdrom (ide_drive_t *drive, struct request *rq, unsigned long block)
  748.  {
  749. - if (rq -> cmd == PACKET_COMMAND || rq -> cmd == REQUEST_SENSE_COMMAND)
  750. - cdrom_do_packet_command (drive);
  751. - else if (rq -> cmd == RESET_DRIVE_COMMAND) {
  752. - cdrom_end_request (1, drive);
  753. - ide_do_reset (drive);
  754. - return;
  755. - } else if (rq -> cmd != READ) {
  756. - printk ("ide-cd: bad cmd %dn", rq -> cmd);
  757. - cdrom_end_request (0, drive);
  758. - } else {
  759. - struct cdrom_info *info = drive->driver_data;
  760. + struct cdrom_info *info = drive->driver_data;
  761.  
  762. + switch (rq->cmd) {
  763. + case READ: {
  764.   if (CDROM_CONFIG_FLAGS(drive)->seeking) {
  765.   unsigned long elpased = jiffies - info->start_seek;
  766.   int stat = GET_STAT();
  767.  
  768.   if ((stat & SEEK_STAT) != SEEK_STAT) {
  769.   if (elpased < IDECD_SEEK_TIMEOUT) {
  770. - ide_stall_queue (drive, IDECD_SEEK_TIMER);
  771. + ide_stall_queue(drive, IDECD_SEEK_TIMER);
  772.   return;
  773.   }
  774.   printk ("%s: DSC timeoutn", drive->name);
  775. @@ -1434,6 +1426,26 @@
  776.   else
  777.   cdrom_start_read (drive, block);
  778.   info->last_block = block;
  779. + break;
  780. + }
  781. +
  782. + case PACKET_COMMAND:
  783. + case REQUEST_SENSE_COMMAND: {
  784. + cdrom_do_packet_command(drive);
  785. + break;
  786. + }
  787. +
  788. + case RESET_DRIVE_COMMAND: {
  789. + cdrom_end_request(1, drive);
  790. + ide_do_reset(drive);
  791. + break;
  792. + }
  793. +
  794. + default: {
  795. + printk("ide-cd: bad cmd %dn", rq -> cmd);
  796. + cdrom_end_request(0, drive);
  797. + break;
  798. + }
  799.   }
  800.  }
  801.  
  802. @@ -1498,17 +1510,19 @@
  803.       struct atapi_request_sense *reqbuf)
  804.  {
  805.   struct packet_command pc;
  806. + struct cdrom_info *info = drive->driver_data;
  807. + struct cdrom_device_info *cdi = &info->devinfo;
  808.  
  809.   memset (&pc, 0, sizeof (pc));
  810.  
  811.   pc.sense_data = reqbuf;
  812. - pc.c[0] = TEST_UNIT_READY;
  813. + pc.c[0] = GPCMD_TEST_UNIT_READY;
  814.  
  815.  #if ! STANDARD_ATAPI
  816.          /* the Sanyo 3 CD changer uses byte 7 of TEST_UNIT_READY to 
  817.             switch CDs instead of supporting the LOAD_UNLOAD opcode   */
  818.  
  819. -        pc.c[7] = CDROM_STATE_FLAGS (drive)->sanyo_slot % 3;
  820. +        pc.c[7] = cdi->sanyo_slot % 3;
  821.  #endif /* not STANDARD_ATAPI */
  822.  
  823.   return cdrom_queue_packet_command (drive, &pc);
  824. @@ -1523,7 +1537,7 @@
  825.   struct atapi_request_sense my_reqbuf;
  826.   int stat;
  827.   struct packet_command pc;
  828. -
  829. +
  830.   if (reqbuf == NULL)
  831.   reqbuf = &my_reqbuf;
  832.  
  833. @@ -1534,7 +1548,7 @@
  834.   memset (&pc, 0, sizeof (pc));
  835.   pc.sense_data = reqbuf;
  836.  
  837. - pc.c[0] = ALLOW_MEDIUM_REMOVAL;
  838. + pc.c[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
  839.   pc.c[4] = (lockflag != 0);
  840.   stat = cdrom_queue_packet_command (drive, &pc);
  841.   }
  842. @@ -1569,9 +1583,9 @@
  843.  {
  844.   struct packet_command pc;
  845.  
  846. - if (CDROM_CONFIG_FLAGS (drive)->no_eject==1 && ejectflag==0)
  847. + if (CDROM_CONFIG_FLAGS (drive)->no_eject && !ejectflag)
  848.   return -EDRIVE_CANT_DO_THIS;
  849. -
  850. +
  851.   /* reload fails on some drives, if the tray is locked */
  852.   if (CDROM_STATE_FLAGS (drive)->door_locked && ejectflag)
  853.   return 0;
  854. @@ -1579,39 +1593,8 @@
  855.   memset (&pc, 0, sizeof (pc));
  856.   pc.sense_data = reqbuf;
  857.  
  858. - pc.c[0] = START_STOP;
  859. - pc.c[4] = 2 + (ejectflag != 0);
  860. - return cdrom_queue_packet_command (drive, &pc);
  861. -}
  862. -
  863. -
  864. -static int
  865. -cdrom_pause (ide_drive_t *drive, int pauseflag,
  866. -      struct atapi_request_sense *reqbuf)
  867. -{
  868. - struct packet_command pc;
  869. -
  870. - memset (&pc, 0, sizeof (pc));
  871. - pc.sense_data = reqbuf;
  872. -
  873. - pc.c[0] = SCMD_PAUSE_RESUME;
  874. - pc.c[8] = !pauseflag;
  875. - return cdrom_queue_packet_command (drive, &pc);
  876. -}
  877. -
  878. -
  879. -static int
  880. -cdrom_startstop (ide_drive_t *drive, int startflag,
  881. -  struct atapi_request_sense *reqbuf)
  882. -{
  883. - struct packet_command pc;
  884. -
  885. - memset (&pc, 0, sizeof (pc));
  886. - pc.sense_data = reqbuf;
  887. -
  888. - pc.c[0] = START_STOP;
  889. - pc.c[1] = 1;
  890. - pc.c[4] = startflag;
  891. + pc.c[0] = GPCMD_START_STOP_UNIT;
  892. + pc.c[4] = 0x02 + (ejectflag != 0);
  893.   return cdrom_queue_packet_command (drive, &pc);
  894.  }
  895.  
  896. @@ -1620,8 +1603,8 @@
  897.        struct atapi_request_sense *reqbuf)
  898.  {
  899.   struct {
  900. - unsigned lba;
  901. - unsigned blocklen;
  902. + __u32 lba;
  903. + __u32 blocklen;
  904.   } capbuf;
  905.  
  906.   int stat;
  907. @@ -1630,13 +1613,13 @@
  908.   memset (&pc, 0, sizeof (pc));
  909.   pc.sense_data = reqbuf;
  910.  
  911. - pc.c[0] = READ_CAPACITY;
  912. + pc.c[0] = GPCMD_READ_CDVD_CAPACITY;
  913.   pc.buffer = (char *)&capbuf;
  914.   pc.buflen = sizeof (capbuf);
  915.  
  916.   stat = cdrom_queue_packet_command (drive, &pc);
  917.   if (stat == 0)
  918. - *capacity = ntohl (capbuf.lba);
  919. + *capacity = be32_to_cpu(capbuf.lba);
  920.  
  921.   return stat;
  922.  }
  923. @@ -1654,7 +1637,7 @@
  924.  
  925.   pc.buffer =  buf;
  926.   pc.buflen = buflen;
  927. - pc.c[0] = SCMD_READ_TOC;
  928. + pc.c[0] = GPCMD_READ_TOC_PMA_ATIP;
  929.   pc.c[6] = trackno;
  930.   pc.c[7] = (buflen >> 8);
  931.   pc.c[8] = (buflen & 0xff);
  932. @@ -1666,12 +1649,12 @@
  933.  
  934.  /* Try to read the entire TOC for the disk into our internal buffer. */
  935.  static int
  936. -cdrom_read_toc (ide_drive_t *drive,
  937. - struct atapi_request_sense *reqbuf)
  938. +cdrom_read_toc (ide_drive_t *drive, struct atapi_request_sense *reqbuf)
  939.  {
  940.   int stat, ntracks, i;
  941.   struct cdrom_info *info = drive->driver_data;
  942.   struct atapi_toc *toc = info->toc;
  943. + int minor = drive->select.b.unit << PARTN_BITS;
  944.   struct {
  945.   struct atapi_toc_header hdr;
  946.   struct atapi_toc_entry  ent;
  947. @@ -1681,11 +1664,11 @@
  948.   /* Try to allocate space. */
  949.   toc = (struct atapi_toc *) kmalloc (sizeof (struct atapi_toc),
  950.       GFP_KERNEL);
  951. + info->toc = toc;
  952.   if (toc == NULL) {
  953.   printk ("%s: No cdrom TOC buffer!n", drive->name);
  954.   return -ENOMEM;
  955.   }
  956. - info->toc = toc;
  957.   }
  958.  
  959.   /* Check to see if the existing data is still valid.
  960. @@ -1697,8 +1680,7 @@
  961.  
  962.   /* First read just the header, so we know how long the TOC is. */
  963.   stat = cdrom_read_tocentry (drive, 0, 1, 0, (char *)&toc->hdr,
  964. -     sizeof (struct atapi_toc_header),
  965. -     reqbuf);
  966. +     sizeof (struct atapi_toc_header), reqbuf);
  967.   if (stat) return stat;
  968.  
  969.  #if ! STANDARD_ATAPI
  970. @@ -1713,12 +1695,46 @@
  971.   if (ntracks > MAX_TRACKS) ntracks = MAX_TRACKS;
  972.  
  973.   /* Now read the whole schmeer. */
  974. - stat = cdrom_read_tocentry (drive, 0, 1, 0, (char *)&toc->hdr,
  975. + stat = cdrom_read_tocentry (drive, toc->hdr.first_track, 1, 0, (char *)&toc->hdr,
  976.       sizeof (struct atapi_toc_header) +
  977. -     (ntracks+1) *
  978. -       sizeof (struct atapi_toc_entry),
  979. -     reqbuf);
  980. +     (ntracks + 1) *
  981. +     sizeof (struct atapi_toc_entry), reqbuf);
  982. +
  983. + if (stat && toc->hdr.first_track > 1) {
  984. + /* Cds with CDI tracks only don't have any TOC entries,
  985. +    despite of this the returned values are
  986. +    first_track == last_track = number of CDI tracks + 1,
  987. +    so that this case is indistinguishable from the same
  988. +    layout plus an additional audio track.
  989. +    If we get an error for the regular case, we assume
  990. +    a CDI without additional audio tracks. In this case
  991. +    the readable TOC is empty (CDI tracks are not included)
  992. +    and only holds the Leadout entry. Heiko Ei遞eldt */
  993. + ntracks = 0;
  994. + stat = cdrom_read_tocentry (drive, CDROM_LEADOUT, 1,
  995. +     0, (char *)&toc->hdr,
  996. +     sizeof (struct atapi_toc_header) +
  997. +    (ntracks+1) *
  998. +     sizeof (struct atapi_toc_entry),
  999. +     reqbuf);
  1000. + if (stat) {
  1001. + return stat;
  1002. + }
  1003. +#if ! STANDARD_ATAPI
  1004. + if (CDROM_CONFIG_FLAGS (drive)->toctracks_as_bcd) {
  1005. + toc->hdr.first_track = bin2bcd(CDROM_LEADOUT);
  1006. + toc->hdr.last_track = bin2bcd(CDROM_LEADOUT);
  1007. + } else
  1008. +#endif  /* not STANDARD_ATAPI */
  1009. + {
  1010. + toc->hdr.first_track = CDROM_LEADOUT;
  1011. + toc->hdr.last_track = CDROM_LEADOUT;
  1012. + }
  1013. + } else if (stat) {
  1014. + return stat;
  1015. + }
  1016.   if (stat) return stat;
  1017. +
  1018.   toc->hdr.toc_length = ntohs (toc->hdr.toc_length);
  1019.  
  1020.  #if ! STANDARD_ATAPI
  1021. @@ -1742,10 +1758,18 @@
  1022.   }
  1023.  
  1024.   /* Read the multisession information. */
  1025. - stat = cdrom_read_tocentry (drive, 0, 1, 1,
  1026. -     (char *)&ms_tmp, sizeof (ms_tmp),
  1027. -     reqbuf);
  1028. - if (stat) return stat;
  1029. + if (toc->hdr.first_track != CDROM_LEADOUT) {
  1030. + /* Read the multisession information. */
  1031. + stat = cdrom_read_tocentry (drive, 0, 1, 1,
  1032. +    (char *)&ms_tmp, sizeof (ms_tmp),
  1033. +     reqbuf);
  1034. + if (stat) return stat;
  1035. + } else {
  1036. + ms_tmp.ent.addr.msf.minute = 0;
  1037. + ms_tmp.ent.addr.msf.second = 2;
  1038. + ms_tmp.ent.addr.msf.frame  = 0;
  1039. + ms_tmp.hdr.first_track = ms_tmp.hdr.last_track = CDROM_LEADOUT;
  1040. + }
  1041.  
  1042.  #if ! STANDARD_ATAPI
  1043.   if (CDROM_CONFIG_FLAGS (drive)->tocaddr_as_bcd)
  1044. @@ -1759,16 +1783,40 @@
  1045.   toc->xa_flag = (ms_tmp.hdr.first_track != ms_tmp.hdr.last_track);
  1046.  
  1047.   /* Now try to get the total cdrom capacity. */
  1048. +#if 0
  1049. + stat = cdrom_get_last_written(MKDEV(HWIF(drive)->major, minor),
  1050. +      (long *)&toc->capacity);
  1051. + if (stat)
  1052. +#endif
  1053.   stat = cdrom_read_capacity (drive, &toc->capacity, reqbuf);
  1054.   if (stat) toc->capacity = 0x1fffff;
  1055.  
  1056. - HWIF(drive)->gd->sizes[drive->select.b.unit << PARTN_BITS]
  1057. - = (toc->capacity * SECTORS_PER_FRAME) >> (BLOCK_SIZE_BITS - 9);
  1058. + /* for general /dev/cdrom like mounting, one big disc */
  1059.   drive->part[0].nr_sects = toc->capacity * SECTORS_PER_FRAME;
  1060. + HWIF(drive)->gd->sizes[minor] = (toc->capacity * SECTORS_PER_FRAME) >>
  1061. + (BLOCK_SIZE_BITS - 9);
  1062.  
  1063.   /* Remember that we've read this stuff. */
  1064.   CDROM_STATE_FLAGS (drive)->toc_valid = 1;
  1065.  
  1066. + /* should be "if multisession", but it does no harm. */
  1067. + if (ntracks == 1)
  1068. + return 0;
  1069. +
  1070. + /* setup each minor to respond to a session */
  1071. + minor++;
  1072. + i = toc->hdr.first_track;
  1073. + while ((i <= ntracks) && ((minor & CD_PART_MASK) < CD_PART_MAX)) {
  1074. + drive->part[minor & PARTN_MASK].start_sect = 0;
  1075. +  drive->part[minor & PARTN_MASK].nr_sects =
  1076. + (toc->ent[i].addr.lba *
  1077. + SECTORS_PER_FRAME) << (BLOCK_SIZE_BITS - 9);
  1078. + HWIF(drive)->gd->sizes[minor] = (toc->ent[i].addr.lba *
  1079. + SECTORS_PER_FRAME) >> (BLOCK_SIZE_BITS - 9);
  1080. + i++;
  1081. + minor++;
  1082. + }
  1083. +
  1084.   return 0;
  1085.  }
  1086.  
  1087. @@ -1785,7 +1833,7 @@
  1088.  
  1089.   pc.buffer =  buf;
  1090.   pc.buflen = buflen;
  1091. - pc.c[0] = SCMD_READ_SUBCHANNEL;
  1092. + pc.c[0] = GPCMD_READ_SUBCHANNEL;
  1093.   pc.c[1] = 2;     /* MSF addressing */
  1094.   pc.c[2] = 0x40;  /* request subQ data */
  1095.   pc.c[3] = format;
  1096. @@ -1794,46 +1842,6 @@
  1097.   return cdrom_queue_packet_command (drive, &pc);
  1098.  }
  1099.  
  1100. -
  1101. -/* modeflag: 0 = current, 1 = changeable mask, 2 = default, 3 = saved */
  1102. -static int
  1103. -cdrom_mode_sense (ide_drive_t *drive, int pageno, int modeflag,
  1104. -                  char *buf, int buflen,
  1105. -   struct atapi_request_sense *reqbuf)
  1106. -{
  1107. - struct packet_command pc;
  1108. -
  1109. - memset (&pc, 0, sizeof (pc));
  1110. - pc.sense_data = reqbuf;
  1111. -
  1112. - pc.buffer =  buf;
  1113. - pc.buflen = buflen;
  1114. - pc.c[0] = MODE_SENSE_10;
  1115. - pc.c[2] = pageno | (modeflag << 6);
  1116. - pc.c[7] = (buflen >> 8);
  1117. - pc.c[8] = (buflen & 0xff);
  1118. - return cdrom_queue_packet_command (drive, &pc);
  1119. -}
  1120. -
  1121. -static int
  1122. -cdrom_mode_select (ide_drive_t *drive, int pageno, char *buf, int buflen,
  1123. -    struct atapi_request_sense *reqbuf)
  1124. -{
  1125. - struct packet_command pc;
  1126. -
  1127. - memset (&pc, 0, sizeof (pc));
  1128. - pc.sense_data = reqbuf;
  1129. -
  1130. - pc.buffer =  buf;
  1131. - pc.buflen = - buflen;
  1132. - pc.c[0] = MODE_SELECT_10;
  1133. - pc.c[1] = 0x10;
  1134. - pc.c[2] = pageno;
  1135. - pc.c[7] = (buflen >> 8);
  1136. - pc.c[8] = (buflen & 0xff);
  1137. - return cdrom_queue_packet_command (drive, &pc);
  1138. -}
  1139. -
  1140.  /* ATAPI cdrom drives are free to select the speed you request or any slower
  1141.     rate :-( Requesting too fast a speed will _not_ produce an error. */
  1142.  static int
  1143. @@ -1849,7 +1857,7 @@
  1144.   else
  1145.       speed *= 177;   /* Nx to kbytes/s */
  1146.  
  1147. - pc.c[0] = SET_CD_SPEED;
  1148. + pc.c[0] = GPCMD_SET_SPEED;
  1149.   /* Read Drive speed in kbytes/second MSB */
  1150.   pc.c[2] = (speed >> 8) & 0xff;
  1151.   /* Read Drive speed in kbytes/second LSB */
  1152. @@ -1865,67 +1873,6 @@
  1153.   return cdrom_queue_packet_command (drive, &pc);
  1154.  }
  1155.  
  1156. -static int
  1157. -cdrom_play_lba_range_1 (ide_drive_t *drive, int lba_start, int lba_end,
  1158. -     struct atapi_request_sense *reqbuf)
  1159. -{
  1160. - struct packet_command pc;
  1161. -
  1162. - memset (&pc, 0, sizeof (pc));
  1163. - pc.sense_data = reqbuf;
  1164. -
  1165. - pc.c[0] = SCMD_PLAYAUDIO_MSF;
  1166. - lba_to_msf (lba_start, &pc.c[3], &pc.c[4], &pc.c[5]);
  1167. - lba_to_msf (lba_end-1, &pc.c[6], &pc.c[7], &pc.c[8]);
  1168. -
  1169. -#if ! STANDARD_ATAPI
  1170. - if (CDROM_CONFIG_FLAGS (drive)->playmsf_as_bcd) {
  1171. - pc.c[3] = bin2bcd (pc.c[3]);
  1172. - pc.c[4] = bin2bcd (pc.c[4]);
  1173. - pc.c[5] = bin2bcd (pc.c[5]);
  1174. - pc.c[6] = bin2bcd (pc.c[6]);
  1175. - pc.c[7] = bin2bcd (pc.c[7]);
  1176. - pc.c[8] = bin2bcd (pc.c[8]);
  1177. - }
  1178. -#endif /* not STANDARD_ATAPI */
  1179. -
  1180. - return cdrom_queue_packet_command (drive, &pc);
  1181. -}
  1182. -
  1183. -
  1184. -/* Play audio starting at LBA LBA_START and finishing with the
  1185. -   LBA before LBA_END. */
  1186. -static int
  1187. -cdrom_play_lba_range (ide_drive_t *drive, int lba_start, int lba_end,
  1188. -       struct atapi_request_sense *reqbuf)
  1189. -{
  1190. - int i, stat = 0;
  1191. - struct atapi_request_sense my_reqbuf;
  1192. -
  1193. - if (reqbuf == NULL)
  1194. - reqbuf = &my_reqbuf;
  1195. -
  1196. - /* Some drives, will, for certain audio cds,
  1197. -    give an error if you ask them to play the entire cd using the
  1198. -    values which are returned in the TOC.  The play will succeed,
  1199. -    however, if the ending address is adjusted downwards
  1200. -    by a few frames. */
  1201. - for (i=0; i<75; i++) {
  1202. - stat = cdrom_play_lba_range_1 (drive, lba_start, lba_end,
  1203. -        reqbuf);
  1204. -
  1205. - if (stat == 0 ||
  1206. -     !(reqbuf->sense_key == ILLEGAL_REQUEST &&
  1207. -       reqbuf->asc == 0x24))
  1208. - return stat;
  1209. -
  1210. - --lba_end;
  1211. - if (lba_end <= lba_start) break;
  1212. - }
  1213. -
  1214. - return stat;
  1215. -}
  1216. -
  1217.  
  1218.  static
  1219.  int cdrom_get_toc_entry (ide_drive_t *drive, int track,
  1220. @@ -1933,17 +1880,12 @@
  1221.    struct atapi_request_sense *reqbuf)
  1222.  {
  1223.   struct cdrom_info *info = drive->driver_data;
  1224. - int stat, ntracks;
  1225. - struct atapi_toc *toc;
  1226. -
  1227. - /* Make sure our saved TOC is valid. */
  1228. - stat = cdrom_read_toc (drive, reqbuf);
  1229. - if (stat) return stat;
  1230. -
  1231. - toc = info->toc;
  1232. + struct atapi_toc *toc = info->toc;
  1233. + int ntracks;
  1234.  
  1235.   /* Check validity of requested track number. */
  1236.   ntracks = toc->hdr.last_track - toc->hdr.first_track + 1;
  1237. + if (toc->hdr.first_track == CDROM_LEADOUT) ntracks = 0;
  1238.   if (track == CDROM_LEADOUT)
  1239.   *ent = &toc->ent[ntracks];
  1240.   else if (track < toc->hdr.first_track ||
  1241. @@ -1956,377 +1898,72 @@
  1242.  }
  1243.  
  1244.  
  1245. -static int
  1246. -cdrom_read_block (ide_drive_t *drive, int format, int lba, int nblocks,
  1247. -   char *buf, int buflen,
  1248. -   struct atapi_request_sense *reqbuf)
  1249. -{
  1250. - struct packet_command pc;
  1251. - struct atapi_request_sense my_reqbuf;
  1252. -
  1253. - if (reqbuf == NULL)
  1254. - reqbuf = &my_reqbuf;
  1255. -
  1256. - memset (&pc, 0, sizeof (pc));
  1257. - pc.sense_data = reqbuf;
  1258.  
  1259. - pc.buffer = buf;
  1260. - pc.buflen = buflen;
  1261.  
  1262. -#if ! STANDARD_ATAPI
  1263. - if (CDROM_CONFIG_FLAGS (drive)->nec260)
  1264. - pc.c[0] = 0xd4;
  1265. - else
  1266. -#endif  /* not STANDARD_ATAPI */
  1267. - pc.c[0] = READ_CD;
  1268.  
  1269. - pc.c[1] = (format << 2);
  1270. - put_unaligned(htonl(lba), (unsigned int *) &pc.c[2]);
  1271. - pc.c[8] = (nblocks & 0xff);
  1272. - pc.c[7] = ((nblocks>>8) & 0xff);
  1273. - pc.c[6] = ((nblocks>>16) & 0xff);
  1274. - if (format <= 1)
  1275. - pc.c[9] = 0xf8;         /* returns 2352 for any format */
  1276. - else
  1277. - pc.c[9] = 0x10;
  1278. +/* the generic packet interface to cdrom.c */
  1279. +static int ide_cdrom_packet(struct cdrom_device_info *cdi,
  1280. +     struct cdrom_generic_command *cgc)
  1281. +{
  1282. + struct packet_command pc;
  1283. + ide_drive_t *drive = (ide_drive_t*) cdi->handle;
  1284.  
  1285. - return cdrom_queue_packet_command (drive, &pc);
  1286. + /* here we queue the commands from the uniform CD-ROM
  1287. +    layer. the packet must be complete, as we do not
  1288. +    touch it at all. */
  1289. + memset(&pc, 0, sizeof(pc));
  1290. + memcpy(pc.c, cgc->cmd, CDROM_PACKET_SIZE);
  1291. + pc.buffer = cgc->buffer;
  1292. + pc.buflen = cgc->buflen;
  1293. + return cgc->stat = cdrom_queue_packet_command(drive, &pc);
  1294.  }
  1295.  
  1296. -
  1297. -/* If SLOT<0, unload the current slot.  Otherwise, try to load SLOT. */
  1298. -static int
  1299. -cdrom_load_unload (ide_drive_t *drive, int slot,
  1300. -    struct atapi_request_sense *reqbuf)
  1301. +static
  1302. +int ide_cdrom_dev_ioctl (struct cdrom_device_info *cdi,
  1303. +  unsigned int cmd, unsigned long arg)
  1304.  {
  1305. -#if ! STANDARD_ATAPI
  1306. - /* if the drive is a Sanyo 3 CD changer then TEST_UNIT_READY
  1307. -           (used in the cdrom_check_status function) is used to 
  1308. -           switch CDs instead of LOAD_UNLOAD */
  1309. -
  1310. - if (CDROM_STATE_FLAGS (drive)->sanyo_slot > 0) {
  1311. -
  1312. -         if ((slot == 1) || (slot == 2))
  1313. - CDROM_STATE_FLAGS (drive)->sanyo_slot = slot;
  1314. - else if (slot >= 0)
  1315. - CDROM_STATE_FLAGS (drive)->sanyo_slot = 3;
  1316. - else
  1317. - return 0;
  1318. -
  1319. - return cdrom_check_status (drive, reqbuf);
  1320. + struct cdrom_generic_command cgc;
  1321. + char buffer[16];
  1322. + int stat;
  1323.  
  1324. - }
  1325. - else
  1326. -#endif /*not STANDARD_ATAPI */
  1327. - {
  1328. + init_cdrom_command(&cgc, buffer, sizeof(buffer));
  1329.  
  1330. - /* ATAPI Rev. 2.2+ standard for requesting switching of
  1331. -                   CDs in a multiplatter device */
  1332. + /* These will be moved into the Uniform layer shortly... */
  1333. + switch (cmd) {
  1334. +  case CDROMSETSPINDOWN: {
  1335. +  char spindown;
  1336. +  if (copy_from_user(&spindown, (void *) arg, sizeof(char)))
  1337. + return -EFAULT;
  1338. +                if ((stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0)))
  1339. + return stat;
  1340.  
  1341. - struct packet_command pc;
  1342. +  buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f);
  1343.  
  1344. - memset (&pc, 0, sizeof (pc));
  1345. - pc.sense_data = reqbuf;
  1346. -
  1347. - pc.c[0] = LOAD_UNLOAD;
  1348. - pc.c[4] = 2 + (slot >= 0);
  1349. - pc.c[8] = slot;
  1350. - return cdrom_queue_packet_command (drive, &pc);
  1351. -
  1352. - }
  1353. -}
  1354. -
  1355. -
  1356. -/* This gets the mechanism status per ATAPI draft spec 2.6 */
  1357. -static int
  1358. -cdrom_read_mech_status (ide_drive_t *drive, char *buf, int buflen,
  1359. - struct atapi_request_sense *reqbuf)
  1360. -{
  1361. - struct packet_command pc;
  1362. -
  1363. - memset (&pc, 0, sizeof (pc));
  1364. - pc.sense_data = reqbuf;
  1365. -
  1366. - pc.buffer = buf;
  1367. - pc.buflen = buflen;
  1368. - pc.c[0] = MECHANISM_STATUS;
  1369. - pc.c[8] = (buflen >> 8);
  1370. - pc.c[9] = (buflen & 0xff);
  1371. - return cdrom_queue_packet_command (drive, &pc);
  1372. -}
  1373. -
  1374. -
  1375. -/* Read the drive mechanism status and slot table into our internal buffer.
  1376. -   If the buffer does not yet exist, allocate it. */
  1377. -static int
  1378. -cdrom_read_changer_info (ide_drive_t *drive)
  1379. -{
  1380. - int nslots;
  1381. - struct cdrom_info *info = drive->driver_data;
  1382. -
  1383. - if (info->changer_info)
  1384. - nslots = info->changer_info->hdr.nslots;
  1385. -
  1386. - else {
  1387. - struct atapi_mechstat_header mechbuf;
  1388. - int stat;
  1389. -
  1390. - stat = cdrom_read_mech_status (drive,
  1391. -        (char *)&mechbuf,
  1392. -        sizeof (mechbuf),
  1393. -        NULL);
  1394. - if (stat)
  1395. - return stat;
  1396. -
  1397. - nslots = mechbuf.nslots;
  1398. - info->changer_info =
  1399. - (struct atapi_changer_info *)
  1400. - kmalloc (sizeof (struct atapi_changer_info) +
  1401. -  nslots * sizeof (struct atapi_slot),
  1402. -  GFP_KERNEL);
  1403. -
  1404. - if (info->changer_info == NULL)
  1405. - return -ENOMEM;
  1406. - }
  1407. -
  1408. - return cdrom_read_mech_status
  1409. - (drive,
  1410. -  (char *)&info->changer_info->hdr,
  1411. -  sizeof (struct atapi_mechstat_header) +
  1412. -  nslots * sizeof (struct atapi_slot),
  1413. -  NULL);
  1414. -}
  1415. -
  1416. -
  1417. -static
  1418. -int ide_cdrom_dev_ioctl (struct cdrom_device_info *cdi,
  1419. -  unsigned int cmd, unsigned long arg)
  1420. -  
  1421. -{
  1422. - ide_drive_t *drive = (ide_drive_t*) cdi->handle;
  1423. - struct cdrom_info *info = drive->driver_data;
  1424. -
  1425. -
  1426. - switch (cmd) {
  1427. - case CDROMREADRAW:
  1428. - case CDROMREADMODE1:
  1429. - case CDROMREADMODE2: {
  1430. - struct cdrom_msf msf;
  1431. - int blocksize, format, stat, lba;
  1432. - struct atapi_toc *toc;
  1433. - char *buf;
  1434. -
  1435. - if (cmd == CDROMREADMODE1) {
  1436. - blocksize = CD_FRAMESIZE;
  1437. - format = 2;
  1438. - } else { /* for RAW and MODE2. */
  1439. - blocksize = CD_FRAMESIZE_RAW;
  1440. - format = 0;
  1441. - }
  1442. -
  1443. - copy_from_user_ret(&msf, (void *)arg, sizeof (msf), -EFAULT); 
  1444. -
  1445. - lba = msf_to_lba(msf.cdmsf_min0, 
  1446. -  msf.cdmsf_sec0, 
  1447. -  msf.cdmsf_frame0);
  1448. -
  1449. - /* Make sure the TOC is up to date. */
  1450. - if (cmd != CDROMREADRAW) {
  1451. - stat = cdrom_read_toc (drive, NULL);
  1452. - if (stat) 
  1453. - return stat;
  1454. -
  1455. - toc = info->toc;
  1456. -
  1457. - if (lba < 0 || lba >= toc->capacity)
  1458. - return -EINVAL;
  1459. - }
  1460. -
  1461. - buf = (char *) kmalloc (blocksize, GFP_KERNEL);
  1462. - if (buf == NULL)
  1463. - return -ENOMEM;
  1464. -
  1465. - stat = cdrom_read_block (drive, format, lba, 1, buf,
  1466. -  blocksize, NULL);
  1467. -
  1468. - if (stat == 0) {
  1469. - if (cmd == CDROMREADMODE2) {
  1470. - /* For Mode2, skip the Sync, Header, and Subheader */
  1471. - if (copy_to_user((char *)arg, buf+16, CD_FRAMESIZE_RAW0))
  1472. - stat = -EFAULT;
  1473. - } else {
  1474. - if (copy_to_user((char *)arg, buf, blocksize))
  1475. - stat = -EFAULT;
  1476. - }
  1477. - }
  1478. -
  1479. - kfree (buf);
  1480. - return stat;
  1481. - }
  1482. -
  1483. - /* Read 2352 byte blocks from audio tracks. */
  1484. - case CDROMREADAUDIO: {
  1485. - int stat, lba;
  1486. - struct atapi_toc *toc;
  1487. - struct cdrom_read_audio ra;
  1488. - char *buf;
  1489. -
  1490. - /* Make sure the TOC is up to date. */
  1491. - stat = cdrom_read_toc (drive, NULL);
  1492. - if (stat) return stat;
  1493. -
  1494. - toc = info->toc;
  1495. -
  1496. - stat = verify_area (VERIFY_READ, (char *)arg, sizeof (ra));
  1497. - if (stat) return stat;
  1498. -
  1499. - copy_from_user (&ra, (void *)arg, sizeof (ra));
  1500. -
  1501. - if (ra.nframes < 0 || ra.nframes > toc->capacity)
  1502. - return -EINVAL;
  1503. - else if (ra.nframes == 0)
  1504. - return 0;
  1505. -
  1506. - stat = verify_area (VERIFY_WRITE, (char *)ra.buf,
  1507. -     ra.nframes * CD_FRAMESIZE_RAW);
  1508. - if (stat) return stat;
  1509. -
  1510. - if (ra.addr_format == CDROM_MSF)
  1511. - lba = msf_to_lba (ra.addr.msf.minute,
  1512. -   ra.addr.msf.second,
  1513. -   ra.addr.msf.frame);
  1514. - else if (ra.addr_format == CDROM_LBA)
  1515. - lba = ra.addr.lba;
  1516. - else
  1517. - return -EINVAL;
  1518. -
  1519. - if (lba < 0 || lba >= toc->capacity)
  1520. - return -EINVAL;
  1521. -
  1522. - buf = (char *) kmalloc (CDROM_NBLOCKS_BUFFER*CD_FRAMESIZE_RAW,
  1523. - GFP_KERNEL);
  1524. - if (buf == NULL)
  1525. - return -ENOMEM;
  1526. -
  1527. - while (ra.nframes > 0) {
  1528. - int this_nblocks = ra.nframes;
  1529. - if (this_nblocks > CDROM_NBLOCKS_BUFFER)
  1530. - this_nblocks = CDROM_NBLOCKS_BUFFER;
  1531. - stat = cdrom_read_block
  1532. - (drive, 1, lba, this_nblocks,
  1533. -  buf, this_nblocks * CD_FRAMESIZE_RAW, NULL);
  1534. - if (stat) break;
  1535. -
  1536. - copy_to_user (ra.buf, buf,
  1537. -      this_nblocks * CD_FRAMESIZE_RAW);
  1538. - ra.buf += this_nblocks * CD_FRAMESIZE_RAW;
  1539. - ra.nframes -= this_nblocks;
  1540. - lba += this_nblocks;
  1541. - }
  1542. -
  1543. - kfree (buf);
  1544. - return stat;
  1545. - }
  1546. -
  1547. -  case CDROMSETSPINDOWN: {
  1548. -  char spindown;
  1549. -  char buffer[16];
  1550. -  int stat;
  1551. -  stat = verify_area (VERIFY_READ, (void *) arg,
  1552. -      sizeof (char));
  1553. -  if (stat) return stat;
  1554. -  copy_from_user (&spindown, (void *) arg, sizeof(char));
  1555. -  stat = cdrom_mode_sense (drive, PAGE_CDROM, 0, buffer,
  1556. -   sizeof (buffer), NULL);
  1557. -  if (stat) return stat;
  1558. -
  1559. -  buffer[11] = (buffer[11] & 0xf0) | (spindown & 0x0f);
  1560. -
  1561. -  return cdrom_mode_select (drive, PAGE_CDROM, buffer,
  1562. -    sizeof (buffer), NULL);
  1563. +  return cdrom_mode_select(cdi, &cgc);
  1564.    } 
  1565.   
  1566.    case CDROMGETSPINDOWN: {
  1567.    char spindown;
  1568. -  char buffer[16];
  1569. -  int stat;
  1570.   
  1571. -  stat = verify_area (VERIFY_WRITE, (void *) arg,
  1572. -                                    sizeof (char));
  1573. -  if (stat) return stat;
  1574. -  stat = cdrom_mode_sense (drive, PAGE_CDROM, 0, buffer,
  1575. -                                         sizeof (buffer), NULL);
  1576. -  if (stat) return stat;
  1577. +                if ((stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CDROM_PAGE, 0)))
  1578. + return stat;
  1579.   
  1580.    spindown = buffer[11] & 0x0f;
  1581.   
  1582. -  copy_to_user ((void *) arg, &spindown, sizeof (char));
  1583. + if (copy_to_user((void *) arg, &spindown, sizeof (char)))
  1584. + return -EFAULT;
  1585.   
  1586.    return 0;
  1587.    }
  1588.    
  1589. -#ifdef ALLOW_TEST_PACKETS
  1590. - case 0x1234: {
  1591. - int stat;
  1592. - struct packet_command pc;
  1593. - int len, lena;
  1594. -
  1595. - memset (&pc, 0, sizeof (pc));
  1596. -
  1597. - stat = verify_area (VERIFY_READ, (void *) arg, sizeof (pc.c));
  1598. - if (stat) return stat;
  1599. - copy_from_user (&pc.c, (void *) arg, sizeof (pc.c));
  1600. - arg += sizeof (pc.c);
  1601. -
  1602. - stat = verify_area (VERIFY_READ, (void *) arg, sizeof (len));
  1603. - if (stat) return stat;
  1604. - copy_from_user (&len, (void *) arg , sizeof (len));
  1605. - arg += sizeof (len);
  1606. -
  1607. - lena = len;
  1608. - if (lena  < 0) lena = -lena;
  1609. -
  1610. - {
  1611. - char buf[lena];
  1612. - if (len > 0) {
  1613. - stat = verify_area (VERIFY_WRITE,
  1614. -     (void *) arg, len);
  1615. - if (stat) return stat;
  1616. - }
  1617. - else if (len < 0) {
  1618. - stat = verify_area (VERIFY_READ,
  1619. -     (void *) arg, -len);
  1620. - if (stat) return stat;
  1621. - copy_from_user (buf, (void*)arg, -len);
  1622. - }
  1623. -
  1624. - if (len != 0) {
  1625. - pc.buflen = len;
  1626. - pc.buffer = buf;
  1627. - }
  1628. -
  1629. - stat = cdrom_queue_packet_command (drive, &pc);
  1630. -
  1631. - if (len > 0)
  1632. - copy_to_user ((void *)arg, buf, len);
  1633. - }
  1634. -
  1635. - return stat;
  1636. - }
  1637. -#endif
  1638. -
  1639.   default:
  1640.   return -EINVAL;
  1641.   }
  1642.  
  1643.  }
  1644.  
  1645. -
  1646. -
  1647.  static
  1648.  int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi,
  1649.      unsigned int cmd, void *arg)
  1650. @@ -2336,47 +1973,6 @@
  1651.   struct cdrom_info *info = drive->driver_data;
  1652.  
  1653.   switch (cmd) {
  1654. - case CDROMSUBCHNL: {
  1655. - struct atapi_cdrom_subchnl scbuf;
  1656. - int stat;
  1657. - struct cdrom_subchnl *subchnl = (struct cdrom_subchnl *)arg;
  1658. -
  1659. - stat = cdrom_read_subchannel (drive, 1, /* current position */
  1660. -       (char *)&scbuf, sizeof (scbuf),
  1661. -       NULL);
  1662. - if (stat) return stat;
  1663. -
  1664. -#if ! STANDARD_ATAPI
  1665. - if (CDROM_CONFIG_FLAGS (drive)->subchan_as_bcd) {
  1666. - msf_from_bcd (&scbuf.acdsc_absaddr.msf);
  1667. - msf_from_bcd (&scbuf.acdsc_reladdr.msf);
  1668. - }
  1669. - if (CDROM_CONFIG_FLAGS (drive)->tocaddr_as_bcd)
  1670. - scbuf.acdsc_trk = bcd2bin (scbuf.acdsc_trk);
  1671. -#endif /* not STANDARD_ATAPI */
  1672. -
  1673. - subchnl->cdsc_absaddr.msf.minute =
  1674. - scbuf.acdsc_absaddr.msf.minute;
  1675. - subchnl->cdsc_absaddr.msf.second =
  1676. - scbuf.acdsc_absaddr.msf.second;
  1677. - subchnl->cdsc_absaddr.msf.frame =
  1678. - scbuf.acdsc_absaddr.msf.frame;
  1679. -
  1680. - subchnl->cdsc_reladdr.msf.minute =
  1681. - scbuf.acdsc_reladdr.msf.minute;
  1682. - subchnl->cdsc_reladdr.msf.second =
  1683. - scbuf.acdsc_reladdr.msf.second;
  1684. - subchnl->cdsc_reladdr.msf.frame =
  1685. - scbuf.acdsc_reladdr.msf.frame;
  1686. -
  1687. - subchnl->cdsc_audiostatus = scbuf.acdsc_audiostatus;
  1688. - subchnl->cdsc_ctrl = scbuf.acdsc_ctrl;
  1689. - subchnl->cdsc_trk  = scbuf.acdsc_trk;
  1690. - subchnl->cdsc_ind  = scbuf.acdsc_ind;
  1691. -
  1692. - return 0;
  1693. - }
  1694. -
  1695.   case CDROMREADTOCHDR: {
  1696.   int stat;
  1697.   struct cdrom_tochdr *tochdr = (struct cdrom_tochdr *) arg;
  1698. @@ -2409,120 +2005,17 @@
  1699.      &tocentry->cdte_addr.msf.minute,
  1700.      &tocentry->cdte_addr.msf.second,
  1701.      &tocentry->cdte_addr.msf.frame);
  1702. - } else {
  1703. + } else
  1704.   tocentry->cdte_addr.lba = toce->addr.lba;
  1705. - }
  1706.  
  1707.   return 0;
  1708.   }
  1709.  
  1710. - case CDROMPLAYMSF: {
  1711. - struct cdrom_msf *msf = (struct cdrom_msf *) arg;
  1712. - int lba_start, lba_end;
  1713. -
  1714. - lba_start = msf_to_lba (msf->cdmsf_min0, msf->cdmsf_sec0,
  1715. - msf->cdmsf_frame0);
  1716. - lba_end = msf_to_lba (msf->cdmsf_min1, msf->cdmsf_sec1,
  1717. -       msf->cdmsf_frame1) + 1;
  1718. -
  1719. - if (lba_end <= lba_start) return -EINVAL;
  1720. -
  1721. - return cdrom_play_lba_range (drive, lba_start, lba_end, NULL);
  1722. - }
  1723. -
  1724. - /* Like just about every other Linux cdrom driver, we ignore the
  1725. -    index part of the request here. */
  1726. - case CDROMPLAYTRKIND: {
  1727. - int stat, lba_start, lba_end;
  1728. - struct cdrom_ti *ti = (struct cdrom_ti *)arg;
  1729. - struct atapi_toc_entry *first_toc, *last_toc;
  1730. -
  1731. - stat = cdrom_get_toc_entry (drive, ti->cdti_trk0, &first_toc,
  1732. -     NULL);
  1733. - if (stat) return stat;
  1734. - stat = cdrom_get_toc_entry (drive, ti->cdti_trk1, &last_toc,
  1735. -     NULL);
  1736. - if (stat) return stat;
  1737. -
  1738. - if (ti->cdti_trk1 != CDROM_LEADOUT) ++last_toc;
  1739. - lba_start = first_toc->addr.lba;
  1740. - lba_end   = last_toc->addr.lba;
  1741. -
  1742. - if (lba_end <= lba_start) return -EINVAL;
  1743. -
  1744. - return cdrom_play_lba_range (drive, lba_start, lba_end, NULL);
  1745. - }
  1746. -
  1747. - case CDROMVOLCTRL: {
  1748. - struct cdrom_volctrl *volctrl = (struct cdrom_volctrl *) arg;
  1749. - char buffer[24], mask[24];
  1750. - int stat;
  1751. -
  1752. - stat = cdrom_mode_sense (drive, PAGE_AUDIO, 0, buffer,
  1753. -  sizeof (buffer), NULL);
  1754. - if (stat) return stat;
  1755. - stat = cdrom_mode_sense (drive, PAGE_AUDIO, 1, mask,
  1756. -  sizeof (buffer), NULL);
  1757. - if (stat) return stat;
  1758. -
  1759. - buffer[1] = buffer[2] = 0;
  1760. -
  1761. - buffer[17] = volctrl->channel0 & mask[17];
  1762. - buffer[19] = volctrl->channel1 & mask[19];
  1763. - buffer[21] = volctrl->channel2 & mask[21];
  1764. - buffer[23] = volctrl->channel3 & mask[23];
  1765. -
  1766. - return cdrom_mode_select (drive, PAGE_AUDIO, buffer,
  1767. -   sizeof (buffer), NULL);
  1768. - }
  1769. -
  1770. - case CDROMVOLREAD: {
  1771. - struct cdrom_volctrl *volctrl = (struct cdrom_volctrl *) arg;
  1772. - char buffer[24];
  1773. - int stat;
  1774. -
  1775. - stat = cdrom_mode_sense (drive, PAGE_AUDIO, 0, buffer,
  1776. -  sizeof (buffer), NULL);
  1777. - if (stat) return stat;
  1778. -
  1779. - volctrl->channel0 = buffer[17];
  1780. - volctrl->channel1 = buffer[19];
  1781. - volctrl->channel2 = buffer[21];
  1782. - volctrl->channel3 = buffer[23];
  1783. -
  1784. - return 0;
  1785. - }
  1786. -
  1787. - case CDROMSTART:
  1788. - return cdrom_startstop (drive, 1, NULL);
  1789. -
  1790. - case CDROMSTOP: {
  1791. -#ifdef IHAVEADOLPHIN
  1792. -               /*  Certain Drives require this.  Most don't
  1793. -                   and will produce errors upon CDROMSTOP
  1794. -                   pit says the Dolphin needs this.  If you
  1795. -                   own a dolphin, just define IHAVEADOLPHIN somewhere */
  1796. -                int stat;
  1797. -                stat = cdrom_startstop (drive, 0, NULL);
  1798. -                if (stat) return stat;
  1799. -                return cdrom_eject (drive, 1, NULL);
  1800. -#endif /* end of IHAVEADOLPHIN  */
  1801. -               return cdrom_startstop (drive, 0, NULL);
  1802. - }
  1803. -
  1804. - case CDROMPAUSE:
  1805. - return cdrom_pause (drive, 1, NULL);
  1806. -
  1807. - case CDROMRESUME:
  1808. - return cdrom_pause (drive, 0, NULL);
  1809. -
  1810. -
  1811.   default:
  1812.   return -EINVAL;
  1813.   }
  1814.  }
  1815.  
  1816. -
  1817.  static
  1818.  int ide_cdrom_reset (struct cdrom_device_info *cdi)
  1819.  {
  1820. @@ -2549,7 +2042,6 @@
  1821.   return cdrom_eject (drive, !position, NULL);
  1822.  }
  1823.  
  1824. -
  1825.  static
  1826.  int ide_cdrom_lock_door (struct cdrom_device_info *cdi, int lock)
  1827.  {
  1828. @@ -2561,22 +2053,23 @@
  1829.  int ide_cdrom_select_speed (struct cdrom_device_info *cdi, int speed)
  1830.  {
  1831.          int stat, attempts = 3;
  1832. -        struct {
  1833. -                char pad[8];
  1834. -                struct atapi_capabilities_page cap;
  1835. -        } buf;
  1836.   ide_drive_t *drive = (ide_drive_t*) cdi->handle;
  1837.   struct atapi_request_sense reqbuf;
  1838. + struct cdrom_generic_command cgc;
  1839. + struct {
  1840. + char pad[8];
  1841. + struct atapi_capabilities_page cap;
  1842. + } buf;
  1843.   stat=cdrom_select_speed (drive, speed, &reqbuf);
  1844.   if (stat<0)
  1845.   return stat;
  1846.  
  1847. + init_cdrom_command(&cgc, &buf, sizeof(buf));
  1848.   /* Now with that done, update the speed fields */
  1849.          do {    /* we seem to get stat=0x01,err=0x00 the first time (??) */
  1850.                  if (attempts-- <= 0)
  1851.                          return 0;
  1852. -                stat = cdrom_mode_sense (drive, PAGE_CAPABILITIES, 0,
  1853. -                                        (char *)&buf, sizeof (buf), NULL);
  1854. +                stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
  1855.          } while (stat);
  1856.  
  1857.          /* The ACER/AOpen 24X cdrom has the speed fields byte-swapped */
  1858. @@ -2595,107 +2088,23 @@
  1859.          return 0;
  1860.  }
  1861.  
  1862. -
  1863. -static
  1864. -int ide_cdrom_select_disc (struct cdrom_device_info *cdi, int slot)
  1865. -{
  1866. - ide_drive_t *drive = (ide_drive_t*) cdi->handle;
  1867. - struct cdrom_info *info = drive->driver_data;
  1868. -
  1869. - struct atapi_request_sense my_reqbuf;
  1870. - int stat;
  1871. - int nslots, curslot;
  1872. -
  1873. - if ( ! CDROM_CONFIG_FLAGS (drive)->is_changer) 
  1874. - return -EDRIVE_CANT_DO_THIS;
  1875. -
  1876. -#if ! STANDARD_ATAPI
  1877. - if (CDROM_STATE_FLAGS (drive)->sanyo_slot > 0) {
  1878. - nslots = 3;
  1879. - curslot = CDROM_STATE_FLAGS (drive)->sanyo_slot;
  1880. - if (curslot == 3)
  1881. - curslot = 0;
  1882. - } else
  1883. -#endif /* not STANDARD_ATAPI */
  1884. - {
  1885. - stat = cdrom_read_changer_info (drive);
  1886. - if (stat)
  1887. - return stat;
  1888. -
  1889. - nslots = info->changer_info->hdr.nslots;
  1890. - curslot = info->changer_info->hdr.curslot;
  1891. - }
  1892. -
  1893. - if (slot == curslot)
  1894. - return curslot;
  1895. -
  1896. - if (slot == CDSL_CURRENT)
  1897. - return curslot;
  1898. -
  1899. - if (slot != CDSL_NONE && (slot < 0 || slot >= nslots))
  1900. - return -EINVAL;
  1901. -
  1902. - if (drive->usage > 1)
  1903. - return -EBUSY;
  1904. -
  1905. - if (slot == CDSL_NONE) {
  1906. - (void) cdrom_load_unload (drive, -1, NULL);
  1907. - cdrom_saw_media_change (drive);
  1908. - (void) cdrom_lockdoor (drive, 0, NULL);
  1909. - return 0;
  1910. - }
  1911. - else {
  1912. - int was_locked;
  1913. -
  1914. - if (
  1915. -#if ! STANDARD_ATAPI
  1916. -     CDROM_STATE_FLAGS (drive)->sanyo_slot == 0 &&
  1917. -#endif
  1918. -     info->changer_info->slots[slot].disc_present == 0) {
  1919. - return -ENOMEDIUM;
  1920. - }
  1921. -
  1922. - was_locked = CDROM_STATE_FLAGS (drive)->door_locked;
  1923. - if (was_locked)
  1924. - (void) cdrom_lockdoor (drive, 0, NULL);
  1925. -
  1926. - stat = cdrom_load_unload (drive, slot, NULL);
  1927. - cdrom_saw_media_change (drive);
  1928. - if (stat)
  1929. - return stat;
  1930. -
  1931. - stat = cdrom_check_status (drive, &my_reqbuf);
  1932. - if (stat && my_reqbuf.sense_key == NOT_READY)
  1933. - return -ENOENT;
  1934. -
  1935. - if (stat == 0 || my_reqbuf.sense_key == UNIT_ATTENTION) {
  1936. - stat = cdrom_read_toc (drive, &my_reqbuf);
  1937. - if (stat)
  1938. - return stat;
  1939. - }
  1940. -
  1941. - if (was_locked)
  1942. - (void) cdrom_lockdoor (drive, 1, NULL);
  1943. -
  1944. - return slot;
  1945. - }
  1946. -}
  1947. -
  1948. -
  1949.  static
  1950.  int ide_cdrom_drive_status (struct cdrom_device_info *cdi, int slot_nr)
  1951.  {
  1952.   ide_drive_t *drive = (ide_drive_t*) cdi->handle;
  1953. - struct cdrom_info *info = drive->driver_data;
  1954.  
  1955.   if (slot_nr == CDSL_CURRENT) {
  1956.  
  1957. - struct atapi_request_sense my_reqbuf;
  1958. - int stat = cdrom_check_status (drive, &my_reqbuf);
  1959. - if (stat == 0 || my_reqbuf.sense_key == UNIT_ATTENTION)
  1960. + struct atapi_request_sense sense;
  1961. + int stat = cdrom_check_status (drive, &sense);
  1962. + if (stat == 0 || sense.sense_key == UNIT_ATTENTION)
  1963. + return CDS_DISC_OK;
  1964. +
  1965. + if (sense.sense_key == NOT_READY && sense.asc == 0x04 &&
  1966. +     sense.ascq == 0x04)
  1967.   return CDS_DISC_OK;
  1968.  
  1969. - if (my_reqbuf.sense_key == NOT_READY) {
  1970. + if (sense.sense_key == NOT_READY) {
  1971.   /* ATAPI doesn't have anything that can help
  1972.      us decide whether the drive is really
  1973.      emtpy or the tray is just open. irk. */
  1974. @@ -2703,24 +2112,8 @@
  1975.   }
  1976.  
  1977.   return CDS_DRIVE_NOT_READY;
  1978. - }
  1979. -
  1980. -#if ! STANDARD_ATAPI
  1981. - else if (CDROM_STATE_FLAGS (drive)->sanyo_slot > 0)
  1982. - return CDS_NO_INFO;
  1983. -#endif /* not STANDARD_ATAPI */
  1984. -
  1985. - else {
  1986. - struct atapi_changer_info *ci;
  1987. - int stat = cdrom_read_changer_info (drive);
  1988. - if (stat < 0)
  1989. - return stat;
  1990. - ci = info->changer_info;
  1991. -
  1992. - if (ci->slots[slot_nr].disc_present)
  1993. - return CDS_DISC_OK;
  1994. - else
  1995. - return CDS_NO_DISC;
  1996. + } else {
  1997. + return -EINVAL;
  1998.   }
  1999.  }
  2000.  
  2001. @@ -2728,15 +2121,10 @@
  2002.  int ide_cdrom_get_last_session (struct cdrom_device_info *cdi,
  2003.   struct cdrom_multisession *ms_info)
  2004.  {
  2005. - int stat;
  2006.   struct atapi_toc *toc;
  2007.   ide_drive_t *drive = (ide_drive_t*) cdi->handle;
  2008.   struct cdrom_info *info = drive->driver_data;
  2009.  
  2010. - /* Make sure the TOC information is valid. */
  2011. - stat = cdrom_read_toc (drive, NULL);
  2012. - if (stat) return stat;
  2013. -
  2014.   toc = info->toc;
  2015.   ms_info->addr.lba = toc->last_session_lba;
  2016.   ms_info->xa_flag = toc->xa_flag;
  2017. @@ -2744,7 +2132,6 @@
  2018.   return 0;
  2019.  }
  2020.  
  2021. -
  2022.  static
  2023.  int ide_cdrom_get_mcn (struct cdrom_device_info *cdi,
  2024.          struct cdrom_mcn *mcn_info)
  2025. @@ -2777,37 +2164,14 @@
  2026.          int slot_nr)
  2027.  {
  2028.   ide_drive_t *drive = (ide_drive_t*) cdi->handle;
  2029. - struct cdrom_info *info = drive->driver_data;
  2030. -
  2031. - int retval;
  2032. -
  2033. +
  2034.   if (slot_nr == CDSL_CURRENT) {
  2035.   (void) cdrom_check_status (drive, NULL);
  2036. - retval = CDROM_STATE_FLAGS (drive)->media_changed;
  2037.   CDROM_STATE_FLAGS (drive)->media_changed = 0;
  2038. + return CDROM_STATE_FLAGS (drive)->media_changed;
  2039. + } else {
  2040. + return -EINVAL;
  2041.   }
  2042. -
  2043. -#if ! STANDARD_ATAPI
  2044. - else if (CDROM_STATE_FLAGS (drive)->sanyo_slot > 0) {
  2045. - retval = 0;
  2046. - }
  2047. -#endif /* not STANDARD_ATAPI */
  2048. -
  2049. - else {
  2050. - struct atapi_changer_info *ci;
  2051. - int stat = cdrom_read_changer_info (drive);
  2052. - if (stat < 0)
  2053. - return stat;
  2054. - ci = info->changer_info;
  2055. -
  2056. - /* This test may be redundant with cdrom.c. */
  2057. - if (slot_nr < 0 || slot_nr >= ci->hdr.nslots)
  2058. - return -EINVAL;
  2059. -
  2060. - retval = ci->slots[slot_nr].change;
  2061. - }
  2062. -
  2063. - return retval;
  2064.  }
  2065.  
  2066.  
  2067. @@ -2842,7 +2206,7 @@
  2068.   ide_cdrom_tray_move,    /* tray_move */
  2069.   ide_cdrom_lock_door,    /* lock_door */
  2070.   ide_cdrom_select_speed, /* select_speed */
  2071. - ide_cdrom_select_disc, /* select_disc */
  2072. + NULL, /* select_disc */
  2073.   ide_cdrom_get_last_session, /* get_last_session */
  2074.   ide_cdrom_get_mcn, /* get_mcn */
  2075.   ide_cdrom_reset, /* reset */
  2076. @@ -2850,9 +2214,11 @@
  2077.   ide_cdrom_dev_ioctl,   /* dev_ioctl */
  2078.   CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK | CDC_SELECT_SPEED
  2079.   | CDC_SELECT_DISC | CDC_MULTI_SESSION | CDC_MCN
  2080. - | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET 
  2081. - | CDC_IOCTLS | CDC_DRIVE_STATUS,  /* capability */
  2082. - 0 /* n_minors */
  2083. + | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET | CDC_IOCTLS
  2084. + | CDC_DRIVE_STATUS | CDC_CD_R | CDC_CD_RW | CDC_DVD
  2085. + | CDC_DVD_R| CDC_DVD_RAM | CDC_GENERIC_PACKET, /* capability */
  2086. + 0, /* n_minors */
  2087. + ide_cdrom_packet
  2088.  };
  2089.  
  2090.  static int ide_cdrom_register (ide_drive_t *drive, int nslots)
  2091. @@ -2861,22 +2227,32 @@
  2092.   struct cdrom_device_info *devinfo = &info->devinfo;
  2093.   int minor = (drive->select.b.unit)<<PARTN_BITS;
  2094.  
  2095. - devinfo->dev = MKDEV (HWIF(drive)->major, minor);
  2096. + devinfo->dev = MKDEV (HWIF(drive)->major, minor | CD_PART_MASK);
  2097.   devinfo->ops = &ide_cdrom_dops;
  2098.   devinfo->mask = 0;
  2099.   *(int *)&devinfo->speed = CDROM_STATE_FLAGS (drive)->current_speed;
  2100.   *(int *)&devinfo->capacity = nslots;
  2101.   devinfo->handle = (void *) drive;
  2102.   strcpy(devinfo->name, drive->name);
  2103. -
  2104. +
  2105.   /* set capability mask to match the probe. */
  2106. + if (!CDROM_CONFIG_FLAGS (drive)->cd_r)
  2107. + devinfo->mask |= CDC_CD_R;
  2108. + if (!CDROM_CONFIG_FLAGS (drive)->cd_rw)
  2109. + devinfo->mask |= CDC_CD_RW;
  2110. + if (!CDROM_CONFIG_FLAGS (drive)->dvd)
  2111. + devinfo->mask |= CDC_DVD;
  2112. + if (!CDROM_CONFIG_FLAGS (drive)->dvd_r)
  2113. + devinfo->mask |= CDC_DVD_R;
  2114. + if (!CDROM_CONFIG_FLAGS (drive)->dvd_ram)
  2115. + devinfo->mask |= CDC_DVD_RAM;
  2116.   if (!CDROM_CONFIG_FLAGS (drive)->is_changer)
  2117.   devinfo->mask |= CDC_SELECT_DISC;
  2118.   if (!CDROM_CONFIG_FLAGS (drive)->audio_play)
  2119.   devinfo->mask |= CDC_PLAY_AUDIO;
  2120.   if (!CDROM_CONFIG_FLAGS (drive)->close_tray)
  2121.   devinfo->mask |= CDC_CLOSE_TRAY;
  2122. -
  2123. +
  2124.   return register_cdrom (devinfo);
  2125.  }
  2126.  
  2127. @@ -2884,20 +2260,35 @@
  2128.  static
  2129.  int ide_cdrom_probe_capabilities (ide_drive_t *drive)
  2130.  {
  2131. - int stat, nslots = 0, attempts = 3;
  2132. -  struct {
  2133. + struct cdrom_info *info = drive->driver_data;
  2134. + struct cdrom_device_info *cdi = &info->devinfo;
  2135. + int stat, nslots = 1, attempts = 3;
  2136. + struct cdrom_generic_command cgc;
  2137. + struct {
  2138.   char pad[8];
  2139.   struct atapi_capabilities_page cap;
  2140.   } buf;
  2141.  
  2142. - if (CDROM_CONFIG_FLAGS (drive)->nec260)
  2143. + if (CDROM_CONFIG_FLAGS (drive)->nec260) {
  2144. + CDROM_CONFIG_FLAGS (drive)->no_eject = 0;                       
  2145. + CDROM_CONFIG_FLAGS (drive)->audio_play = 1;       
  2146.   return nslots;
  2147. + }
  2148.  
  2149. - do { /* we seem to get stat=0x01,err=0x00 the first time (??) */
  2150. + init_cdrom_command(&cgc, &buf, sizeof(buf));
  2151. + /* we have to cheat a little here. the packet will eventually
  2152. +  * be queued with ide_cdrom_packet(), which extracts the
  2153. +  * drive from cdi->handle. Since this device hasn't been
  2154. +  * registered with the Uniform layer yet, it can't do this.
  2155. +  * Same goes for cdi->ops.
  2156. +  */
  2157. + cdi->handle = (ide_drive_t *) drive;
  2158. + cdi->ops = &ide_cdrom_dops;
  2159. + /* we seem to get stat=0x01,err=0x00 the first time (??) */
  2160. + do {
  2161.   if (attempts-- <= 0)
  2162.   return 0;
  2163. - stat = cdrom_mode_sense (drive, PAGE_CAPABILITIES, 0,
  2164. -   (char *)&buf, sizeof (buf), NULL);
  2165. + stat = cdrom_mode_sense(cdi, &cgc, GPMODE_CAPABILITIES_PAGE, 0);
  2166.   } while (stat);
  2167.  
  2168.   if (buf.cap.lock == 0)
  2169. @@ -2915,14 +2306,14 @@
  2170.   if (buf.cap.dvd_ram_write)
  2171.   CDROM_CONFIG_FLAGS (drive)->dvd_r = 1;
  2172.   if (buf.cap.dvd_r_write)
  2173. - CDROM_CONFIG_FLAGS (drive)->dvd_rw = 1;
  2174. + CDROM_CONFIG_FLAGS (drive)->dvd_ram = 1;
  2175.   if (buf.cap.audio_play)
  2176.   CDROM_CONFIG_FLAGS (drive)->audio_play = 1;
  2177.   if (buf.cap.mechtype == 0)
  2178.   CDROM_CONFIG_FLAGS (drive)->close_tray = 0;
  2179.  
  2180.  #if ! STANDARD_ATAPI
  2181. - if (CDROM_STATE_FLAGS (drive)->sanyo_slot > 0) {
  2182. + if (cdi->sanyo_slot > 0) {
  2183.   CDROM_CONFIG_FLAGS (drive)->is_changer = 1;
  2184.   nslots = 3;
  2185.   }
  2186. @@ -2931,14 +2322,9 @@
  2187.  #endif /* not STANDARD_ATAPI */
  2188.   if (buf.cap.mechtype == mechtype_individual_changer ||
  2189.       buf.cap.mechtype == mechtype_cartridge_changer) {
  2190. - struct atapi_mechstat_header mechbuf;
  2191. -
  2192. - stat = cdrom_read_mech_status (drive, (char*)&mechbuf,
  2193. -        sizeof (mechbuf), NULL);
  2194. - if (!stat) {
  2195. + if ((nslots = cdrom_number_of_slots(cdi)) > 1) {
  2196.   CDROM_CONFIG_FLAGS (drive)->is_changer = 1;
  2197.   CDROM_CONFIG_FLAGS (drive)->supp_disc_present = 1;
  2198. - nslots = mechbuf.nslots;
  2199.   }
  2200.   }
  2201.  
  2202. @@ -2955,14 +2341,17 @@
  2203.   (ntohs(buf.cap.maxspeed) + (176/2)) / 176;
  2204.   }
  2205.  
  2206. - printk ("%s: ATAPI %dX %s", 
  2207. -         drive->name, CDROM_CONFIG_FLAGS (drive)->max_speed,
  2208. - (CDROM_CONFIG_FLAGS (drive)->dvd) ? "DVD-ROM" : "CD-ROM");
  2209. + /* don't print speed if the drive reported 0.
  2210. +  */
  2211. + printk("%s: ATAPI", drive->name);
  2212. + if (CDROM_CONFIG_FLAGS(drive)->max_speed)
  2213. + printk(" %dX", CDROM_CONFIG_FLAGS(drive)->max_speed);
  2214. + printk(" %s", CDROM_CONFIG_FLAGS(drive)->dvd ? "DVD-ROM" : "CD-ROM");
  2215.  
  2216. - if (CDROM_CONFIG_FLAGS (drive)->dvd_r|CDROM_CONFIG_FLAGS (drive)->dvd_rw)
  2217. + if (CDROM_CONFIG_FLAGS (drive)->dvd_r|CDROM_CONFIG_FLAGS (drive)->dvd_ram)
  2218.           printk (" DVD%s%s", 
  2219. -         (CDROM_CONFIG_FLAGS (drive)->dvd_r)? "-RAM" : "", 
  2220. -         (CDROM_CONFIG_FLAGS (drive)->dvd_rw)? "/RW" : "");
  2221. +         (CDROM_CONFIG_FLAGS (drive)->dvd_r)? "-R" : "", 
  2222. +         (CDROM_CONFIG_FLAGS (drive)->dvd_ram)? "AM" : "");
  2223.  
  2224.          if (CDROM_CONFIG_FLAGS (drive)->cd_r|CDROM_CONFIG_FLAGS (drive)->cd_rw) 
  2225.           printk (" CD%s%s", 
  2226. @@ -2974,7 +2363,19 @@
  2227.          else 
  2228.           printk (" drive");
  2229.  
  2230. - printk (", %dkB Cachen", ntohs(buf.cap.buffer_size));
  2231. + printk (", %dkB Cache", be16_to_cpu(buf.cap.buffer_size));
  2232. +
  2233. + if (drive->using_dma) {
  2234. + if ((drive->id->field_valid & 4) &&
  2235. +     (drive->id->dma_ultra & (drive->id->dma_ultra >> 8) & 7)) {
  2236. + printk(", UDMA"); /* UDMA BIOS-enabled! */
  2237. + } else if (drive->id->field_valid & 4) {
  2238. + printk(", (U)DMA"); /* Can be BIOS-enabled! */
  2239. + } else {
  2240. + printk(", DMA");
  2241. + }
  2242. + }
  2243. + printk("n");
  2244.  
  2245.   return nslots;
  2246.  }
  2247. @@ -2994,19 +2395,17 @@
  2248.  int ide_cdrom_setup (ide_drive_t *drive)
  2249.  {
  2250.   struct cdrom_info *info = drive->driver_data;
  2251. + struct cdrom_device_info *cdi = &info->devinfo;
  2252. + int minor = drive->select.b.unit << PARTN_BITS;
  2253.   int nslots;
  2254.  
  2255. - kdev_t dev = MKDEV (HWIF (drive)->major,
  2256. -     drive->select.b.unit << PARTN_BITS);
  2257. + set_device_ro(MKDEV(HWIF(drive)->major, minor), 1);
  2258. + set_blocksize(MKDEV(HWIF(drive)->major, minor), CD_FRAMESIZE);
  2259.  
  2260. - set_device_ro (dev, 1);
  2261. - blksize_size[HWIF(drive)->major][drive->select.b.unit << PARTN_BITS] =
  2262. - CD_FRAMESIZE;
  2263. + drive->special.all = 0;
  2264. + drive->ready_stat = 0;
  2265.  
  2266. - drive->special.all = 0;
  2267. - drive->ready_stat = 0;
  2268. -
  2269. - CDROM_STATE_FLAGS (drive)->media_changed = 0;
  2270. + CDROM_STATE_FLAGS (drive)->media_changed = 1;
  2271.   CDROM_STATE_FLAGS (drive)->toc_valid     = 0;
  2272.   CDROM_STATE_FLAGS (drive)->door_locked   = 0;
  2273.  
  2274. @@ -3028,25 +2427,29 @@
  2275.   CDROM_CONFIG_FLAGS (drive)->test_write = 0;
  2276.   CDROM_CONFIG_FLAGS (drive)->dvd = 0;
  2277.   CDROM_CONFIG_FLAGS (drive)->dvd_r = 0;
  2278. - CDROM_CONFIG_FLAGS (drive)->dvd_rw = 0;
  2279. + CDROM_CONFIG_FLAGS (drive)->dvd_ram = 0;
  2280.   CDROM_CONFIG_FLAGS (drive)->no_eject = 1;
  2281.   CDROM_CONFIG_FLAGS (drive)->supp_disc_present = 0;
  2282.   CDROM_CONFIG_FLAGS (drive)->audio_play = 0;
  2283.   CDROM_CONFIG_FLAGS (drive)->close_tray = 1;
  2284. -
  2285. +
  2286.   /* limit transfer size per interrupt. */
  2287.   CDROM_CONFIG_FLAGS (drive)->limit_nframes = 0;
  2288.   if (drive->id != NULL) {
  2289. - if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2430"))
  2290. - CDROM_CONFIG_FLAGS (drive)->limit_nframes = 1;
  2291. - else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2432"))
  2292. - CDROM_CONFIG_FLAGS (drive)->limit_nframes = 1;
  2293. + /* a testament to the nice quality of Samsung drives... */
  2294. +  if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2430"))
  2295. +  CDROM_CONFIG_FLAGS (drive)->limit_nframes = 1;
  2296. +  else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-2432"))
  2297. +  CDROM_CONFIG_FLAGS (drive)->limit_nframes = 1;
  2298. + /* the 3231 model does not support the SET_CD_SPEED command */
  2299. + else if (!strcmp(drive->id->model, "SAMSUNG CD-ROM SCR-3231"))
  2300. + cdi->mask |= CDC_SELECT_SPEED;
  2301.   }
  2302.  
  2303.  #if ! STANDARD_ATAPI
  2304.   /* by default Sanyo 3 CD changer support is turned off and
  2305.             ATAPI Rev 2.2+ standard support for CD changers is used */
  2306. - CDROM_STATE_FLAGS (drive)->sanyo_slot = 0;
  2307. + cdi->sanyo_slot = 0;
  2308.  
  2309.   CDROM_CONFIG_FLAGS (drive)->nec260 = 0;
  2310.   CDROM_CONFIG_FLAGS (drive)->toctracks_as_bcd = 0;
  2311. @@ -3098,18 +2501,20 @@
  2312.                           (strcmp(drive->id->model, "CD-ROM CDR-C3G") == 0) ||
  2313.                           (strcmp(drive->id->model, "CD-ROM CDR_C36") == 0)) {
  2314.                          /* uses CD in slot 0 when value is set to 3 */
  2315. -                        CDROM_STATE_FLAGS (drive)->sanyo_slot = 3;
  2316. +                        cdi->sanyo_slot = 3;
  2317.                  }
  2318.  
  2319.  
  2320.   }
  2321.  #endif /* not STANDARD_ATAPI */
  2322.  
  2323. - info->toc               = NULL;
  2324. - info->sector_buffer     = NULL;
  2325. - info->sector_buffered   = 0;
  2326. - info->nsectors_buffered = 0;
  2327. + info->toc = NULL;
  2328. + info->buffer = NULL;
  2329. + info->sector_buffered = 0;
  2330. + info->nsectors_buffered = 0;
  2331.   info->changer_info      = NULL;
  2332. + info->last_block = 0;
  2333. + info->start_seek = 0;
  2334.  
  2335.   nslots = ide_cdrom_probe_capabilities (drive);
  2336.  
  2337. @@ -3134,9 +2539,12 @@
  2338.  static
  2339.  int ide_cdrom_open (struct inode *ip, struct file *fp, ide_drive_t *drive)
  2340.  {
  2341. + struct cdrom_info *info = drive->driver_data;
  2342.   int rc;
  2343.  
  2344.   MOD_INC_USE_COUNT;
  2345. + if (info->buffer == NULL)
  2346. + info->buffer = (char *) kmalloc(SECTOR_BUFFER_SIZE, GFP_KERNEL);
  2347.   rc = cdrom_fops.open (ip, fp);
  2348.   if (rc) {
  2349.   drive->usage--;
  2350. @@ -3161,7 +2569,6 @@
  2351.   (drive->select.b.unit)<<PARTN_BITS));
  2352.  }
  2353.  
  2354. -
  2355.  static
  2356.  int ide_cdrom_cleanup(ide_drive_t *drive)
  2357.  {
  2358. @@ -3170,15 +2577,15 @@
  2359.  
  2360.   if (ide_unregister_subdriver (drive))
  2361.   return 1;
  2362. - if (info->sector_buffer != NULL)
  2363. - kfree (info->sector_buffer);
  2364. + if (info->buffer != NULL)
  2365. + kfree(info->buffer);
  2366.   if (info->toc != NULL)
  2367. - kfree (info->toc);
  2368. + kfree(info->toc);
  2369.   if (info->changer_info != NULL)
  2370. - kfree (info->changer_info);
  2371. + kfree(info->changer_info);
  2372.   if (devinfo->handle == drive && unregister_cdrom (devinfo))
  2373.   printk ("%s: ide_cdrom_cleanup failed to unregister device from the cdrom driver.n", drive->name);
  2374. - kfree (info);
  2375. + kfree(info);
  2376.   drive->driver_data = NULL;
  2377.   return 0;
  2378.  }
  2379. @@ -3218,11 +2625,6 @@
  2380.  MODULE_PARM(ignore, "s");
  2381.  MODULE_DESCRIPTION("ATAPI CD-ROM Driver");
  2382.  
  2383. -int init_module (void)
  2384. -{
  2385. - return ide_cdrom_init();
  2386. -}
  2387. -
  2388.  void cleanup_module(void)
  2389.  {
  2390.   ide_drive_t *drive;
  2391. @@ -3235,6 +2637,11 @@
  2392.   }
  2393.   ide_unregister_module (&ide_cdrom_module);
  2394.  }
  2395. +
  2396. +int init_module(void)
  2397. +{
  2398. + return ide_cdrom_init();
  2399. +}
  2400.  #endif /* MODULE */
  2401.   
  2402.  int ide_cdrom_init (void)
  2403. @@ -3246,11 +2653,12 @@
  2404.   MOD_INC_USE_COUNT;
  2405.   while ((drive = ide_scan_devices (ide_cdrom, ide_cdrom_driver.name, NULL, failed++)) != NULL) {
  2406.   /* skip drives that we were told to ignore */
  2407. - if (ignore != NULL)
  2408. + if (ignore != NULL) {
  2409.   if (strstr(ignore, drive->name)) {
  2410.   printk("ide-cd: ignoring drive %sn", drive->name);
  2411.   continue;
  2412.   }
  2413. + }
  2414.   info = (struct cdrom_info *) kmalloc (sizeof (struct cdrom_info), GFP_KERNEL);
  2415.   if (info == NULL) {
  2416.   printk ("%s: Can't allocate a cdrom structuren", drive->name);
  2417. @@ -3277,11 +2685,3 @@
  2418.   MOD_DEC_USE_COUNT;
  2419.   return 0;
  2420.  }
  2421. -
  2422. -
  2423. -/*==========================================================================*/
  2424. -/*
  2425. - * Local variables:
  2426. - * c-basic-offset: 8
  2427. - * End:
  2428. - */
  2429. diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/drivers/block/ide-cd.h linux/drivers/block/ide-cd.h
  2430. --- linux-2.2.13/drivers/block/ide-cd.h Fri Nov  5 15:15:33 1999
  2431. +++ linux/drivers/block/ide-cd.h Sun Oct 31 13:56:23 1999
  2432. @@ -1,9 +1,9 @@
  2433.  #ifndef _IDE_CD_H
  2434.  #define _IDE_CD_H
  2435.  /*
  2436. - *  linux/drivers/block/ide_modes.h
  2437. + *  linux/drivers/block/ide_cd.h
  2438.   *
  2439. - *  Copyright (C) 1996  Erik Andersen
  2440. + *  Copyright (C) 1996, 1997, 1998  Erik Andersen
  2441.   *  Copyright (C) 1998, 1999 Jens Axboe
  2442.   */
  2443.  
  2444. @@ -34,19 +34,13 @@
  2445.  #define NO_DOOR_LOCKING 0
  2446.  #endif
  2447.  
  2448. -
  2449. -/* Size of buffer to allocate, in blocks, for audio reads. */
  2450. -
  2451. -#ifndef CDROM_NBLOCKS_BUFFER
  2452. -#define CDROM_NBLOCKS_BUFFER 8
  2453. -#endif
  2454. -
  2455. -
  2456.  /************************************************************************/
  2457.  
  2458. -#define SECTOR_SIZE 512
  2459. -#define SECTOR_BITS 9
  2460. -#define SECTORS_PER_FRAME (CD_FRAMESIZE / SECTOR_SIZE)
  2461. +#define SECTOR_SIZE 512
  2462. +#define SECTOR_BITS  9
  2463. +#define SECTORS_PER_FRAME (CD_FRAMESIZE / SECTOR_SIZE)
  2464. +#define SECTOR_BUFFER_SIZE (CD_FRAMESIZE * 32)
  2465. +#define SECTORS_BUFFER (SECTOR_BUFFER_SIZE / SECTOR_SIZE)
  2466.  
  2467.  #define MIN(a,b) ((a) < (b) ? (a) : (b))
  2468.  
  2469. @@ -55,96 +49,38 @@
  2470.  #define REQUEST_SENSE_COMMAND 4316
  2471.  #define RESET_DRIVE_COMMAND   4317
  2472.  
  2473. -/*
  2474. - * For controlling drive spindown time.
  2475. - */
  2476. -#define CDROMGETSPINDOWN        0x531d
  2477. -#define CDROMSETSPINDOWN        0x531e
  2478. -
  2479. -/* Some ATAPI command opcodes (just like SCSI).
  2480. -   (Some other cdrom-specific codes are in cdrom.h.) */
  2481. -#define TEST_UNIT_READY         0x00
  2482. -#define REQUEST_SENSE           0x03
  2483. -#define INQUIRY                 0x12
  2484. -#define START_STOP              0x1b
  2485. -#define ALLOW_MEDIUM_REMOVAL    0x1e
  2486. -#define READ_CAPACITY           0x25
  2487. -#define READ_10                 0x28
  2488. -#define SEEK 0x2b
  2489. -#define READ_HEADER             0x44
  2490. -#define STOP_PLAY_SCAN 0x4e
  2491. -#define MODE_SELECT_10          0x55
  2492. -#define MODE_SENSE_10           0x5a
  2493. -#define LOAD_UNLOAD             0xa6
  2494. -#define READ_12                 0xa8
  2495. -#define READ_CD_MSF             0xb9
  2496. -#define SCAN 0xba
  2497. -#define SET_CD_SPEED            0xbb
  2498. -#define PLAY_CD                 0xbc
  2499. -#define MECHANISM_STATUS        0xbd
  2500. -#define READ_CD                 0xbe
  2501. -
  2502. -/* DVD Opcodes */
  2503. -#define DVD_GET_PERFORMANCE 0xac
  2504. -
  2505. -
  2506. -/* Page codes for mode sense/set */
  2507. -
  2508. -#define PAGE_READERR            0x01
  2509. -#define PAGE_CDROM              0x0d
  2510. -#define PAGE_AUDIO              0x0e
  2511. -#define PAGE_CAPABILITIES       0x2a
  2512. -#define PAGE_ALL                0x3f
  2513. -
  2514. -
  2515. -/* ATAPI sense keys (from table 140 of ATAPI 2.6) */
  2516. -
  2517. -#define NO_SENSE                0x00
  2518. -#define RECOVERED_ERROR         0x01
  2519. -#define NOT_READY               0x02
  2520. -#define MEDIUM_ERROR            0x03
  2521. -#define HARDWARE_ERROR          0x04
  2522. -#define ILLEGAL_REQUEST         0x05
  2523. -#define UNIT_ATTENTION          0x06
  2524. -#define DATA_PROTECT            0x07
  2525. -#define ABORTED_COMMAND         0x0b
  2526. -#define MISCOMPARE              0x0e
  2527. -
  2528. -/* We want some additional flags for CDROM drives.
  2529. -   To save space in the ide_drive_t struct, use some fields which
  2530. -   doesn't make sense for CDROMs -- `bios_cyl' and `bios_head'. */
  2531.  
  2532.  /* Configuration flags.  These describe the capabilities of the drive.
  2533.     They generally do not change after initialization, unless we learn
  2534.     more about the drive from stuff failing. */
  2535.  struct ide_cd_config_flags {
  2536. - __u8 drq_interrupt    : 1; /* Device sends an interrupt when ready
  2537. -       for a packet command. */
  2538. - __u8 no_doorlock      : 1; /* Drive cannot lock the door. */
  2539. - __u8 no_eject         : 1; /* Drive cannot eject the disc. */
  2540. - __u8 nec260           : 1; /* Drive is a pre-1.2 NEC 260 drive. */
  2541. - __u8 playmsf_as_bcd   : 1; /* PLAYMSF command takes BCD args. */
  2542. - __u8 tocaddr_as_bcd   : 1; /* TOC addresses are in BCD. */
  2543. - __u8 toctracks_as_bcd : 1; /* TOC track numbers are in BCD. */
  2544. - __u8 subchan_as_bcd   : 1; /* Subchannel info is in BCD. */
  2545. - __u8 is_changer       : 1; /* Drive is a changer. */
  2546. - __u8 cd_r             : 1; /* Drive can write to CD-R media . */
  2547. - __u8 cd_rw            : 1; /* Drive can write to CD-R/W media . */
  2548. - __u8 dvd              : 1; /* Drive is a DVD-ROM */
  2549. - __u8 dvd_r            : 1; /* Drive can write DVD-RAM */
  2550. - __u8 dvd_rw           : 1; /* Drive can write DVD-R/W */
  2551. - __u8 test_write       : 1; /* Drive can fake writes */
  2552. - __u8 supp_disc_present: 1; /* Changer can report exact contents
  2553. -       of slots. */
  2554. - __u8 limit_nframes    : 1; /* Drive does not provide data in
  2555. -       multiples of SECTOR_SIZE when more
  2556. -       than one interrupt is needed. */
  2557. - __u8 seeking          : 1; /* Seeking in progress */
  2558. - __u8 audio_play       : 1; /* can do audio related commands */
  2559. - __u8 close_tray       : 1; /* can close the tray */
  2560. - __u8 reserved         : 4;
  2561. - byte max_speed;     /* Max speed of the drive */
  2562. + __u8 drq_interrupt : 1; /* Device sends an interrupt when ready
  2563. + for a packet command. */
  2564. + __u8 no_doorlock : 1; /* Drive cannot lock the door. */
  2565. + __u8 no_eject : 1; /* Drive cannot eject the disc. */
  2566. + __u8 nec260 : 1; /* Drive is a pre-1.2 NEC 260 drive. */
  2567. + __u8 playmsf_as_bcd : 1; /* PLAYMSF command takes BCD args. */
  2568. + __u8 tocaddr_as_bcd : 1; /* TOC addresses are in BCD. */
  2569. + __u8 toctracks_as_bcd : 1; /* TOC track numbers are in BCD. */
  2570. + __u8 subchan_as_bcd : 1; /* Subchannel info is in BCD. */
  2571. + __u8 is_changer : 1; /* Drive is a changer. */
  2572. + __u8 cd_r : 1; /* Drive can write to CD-R media . */
  2573. + __u8 cd_rw : 1; /* Drive can write to CD-R/W media . */
  2574. + __u8 dvd : 1; /* Drive is a DVD-ROM */
  2575. + __u8 dvd_r : 1; /* Drive can write DVD-R */
  2576. + __u8 dvd_ram : 1; /* Drive can write DVD-RAM */
  2577. + __u8 test_write : 1; /* Drive can fake writes */
  2578. + __u8 supp_disc_present : 1; /* Changer can report exact contents
  2579. + of slots. */
  2580. + __u8 limit_nframes : 1; /* Drive does not provide data in
  2581. + multiples of SECTOR_SIZE when more
  2582. + than one interrupt is needed. */
  2583. + __u8 seeking : 1; /* Seeking in progress */
  2584. + __u8 audio_play : 1; /* can do audio related commands */
  2585. + __u8 close_tray : 1; /* can close the tray */
  2586. + __u8 writing : 1; /* pseudo write in progress */
  2587. + __u8 reserved : 3;
  2588. + byte max_speed;      /* Max speed of the drive */
  2589.  };
  2590.  #define CDROM_CONFIG_FLAGS(drive) (&(((struct cdrom_info *)(drive->driver_data))->config_flags))
  2591.  
  2592. @@ -155,8 +91,8 @@
  2593.   __u8 media_changed : 1; /* Driver has noticed a media change. */
  2594.   __u8 toc_valid     : 1; /* Saved TOC information is current. */
  2595.   __u8 door_locked   : 1; /* We think that the drive door is locked. */
  2596. - __u8 sanyo_slot    : 2; /* Sanyo 3 CD changer support */
  2597. - __u8 reserved      : 3;
  2598. + __u8 writing       : 1; /* the drive is currently writing */
  2599. + __u8 reserved      : 4;
  2600.   byte current_speed; /* Current speed of the drive */
  2601.  };
  2602.  #define CDROM_STATE_FLAGS(drive) (&(((struct cdrom_info *)(drive->driver_data))->state_flags))
  2603. @@ -278,15 +214,10 @@
  2604.  };
  2605.  
  2606.  
  2607. -typedef enum {
  2608. - mechtype_caddy = 0,
  2609. - mechtype_tray  = 1,
  2610. - mechtype_popup = 2,
  2611. - mechtype_individual_changer = 4,
  2612. - mechtype_cartridge_changer  = 5
  2613. -} mechtype_t;
  2614. -
  2615.  
  2616. +/* This should probably go into cdrom.h along with the other
  2617. + * generic stuff now in the Mt. Fuji spec.
  2618. + */
  2619.  struct atapi_capabilities_page {
  2620.  #if defined(__BIG_ENDIAN_BITFIELD)
  2621.   __u8 parameters_saveable : 1;
  2622. @@ -552,13 +483,11 @@
  2623.   byte reserved2[3];
  2624.  };
  2625.  
  2626. -
  2627.  struct atapi_changer_info {
  2628.   struct atapi_mechstat_header hdr;
  2629.   struct atapi_slot slots[0];
  2630.  };
  2631.  
  2632. -
  2633.  /* Extra per-device info for cdrom drives. */
  2634.  struct cdrom_info {
  2635.  
  2636. @@ -567,17 +496,9 @@
  2637.  
  2638.   struct atapi_toc *toc;
  2639.  
  2640. - /* Sector buffer.  If a read request wants only the first part
  2641. -    of a cdrom block, we cache the rest of the block here,
  2642. -    in the expectation that the data is going to be wanted soon.
  2643. -    SECTOR_BUFFERED is the number of the first buffered sector,
  2644. -    and NSECTORS_BUFFERED is the number of sectors in the buffer.
  2645. -    Before the buffer is allocated, we should have
  2646. -    SECTOR_BUFFER == NULL and NSECTORS_BUFFERED == 0. */
  2647. -
  2648. - unsigned long sector_buffered;
  2649. - unsigned long nsectors_buffered;
  2650. - char *sector_buffer;
  2651. + unsigned long sector_buffered;
  2652. + unsigned long nsectors_buffered;
  2653. + unsigned char *buffer;
  2654.  
  2655.   /* The result of the last successful request sense command
  2656.      on this device. */
  2657. @@ -598,21 +519,91 @@
  2658.          struct cdrom_device_info devinfo;
  2659.  };
  2660.  
  2661. -
  2662. -#define SECTOR_BUFFER_SIZE CD_FRAMESIZE
  2663. -
  2664. -
  2665.  /****************************************************************************
  2666.   * Descriptions of ATAPI error codes.
  2667.   */
  2668.  
  2669.  #define ARY_LEN(a) ((sizeof(a) / sizeof(a[0])))
  2670.  
  2671. +/* This stuff should be in cdrom.h, since it is now generic... */
  2672. +
  2673. +/* ATAPI sense keys (from table 140 of ATAPI 2.6) */
  2674. +#define NO_SENSE                0x00
  2675. +#define RECOVERED_ERROR         0x01
  2676. +#define NOT_READY               0x02
  2677. +#define MEDIUM_ERROR            0x03
  2678. +#define HARDWARE_ERROR          0x04
  2679. +#define ILLEGAL_REQUEST         0x05
  2680. +#define UNIT_ATTENTION          0x06
  2681. +#define DATA_PROTECT            0x07
  2682. +#define ABORTED_COMMAND         0x0b
  2683. +#define MISCOMPARE              0x0e
  2684. +
  2685. +
  2686. +/* This stuff should be in cdrom.h, since it is now generic... */
  2687.  #if VERBOSE_IDE_CD_ERRORS
  2688.  
  2689. -/* From Table 124 of the ATAPI 1.2 spec.
  2690. -   Unchanged in Table 140 of the ATAPI 2.6 draft standard. */
  2691. + /* The generic packet command opcodes for CD/DVD Logical Units,
  2692. + * From Table 57 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */ 
  2693. +const struct {
  2694. + unsigned short packet_command;
  2695. + const char * const text;
  2696. +} packet_command_texts[] = {
  2697. + { GPCMD_TEST_UNIT_READY, "Test Unit Ready" },
  2698. + { GPCMD_REQUEST_SENSE, "Request Sense" },
  2699. + { GPCMD_FORMAT_UNIT, "Format Unit" },
  2700. + { GPCMD_INQUIRY, "Inquiry" },
  2701. + { GPCMD_START_STOP_UNIT, "Start/Stop Unit" },
  2702. + { GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL, "Prevent/Allow Medium Removal" },
  2703. + { GPCMD_READ_FORMAT_CAPACITIES, "Read Format Capacities" },
  2704. + { GPCMD_READ_CDVD_CAPACITY, "Read Cd/Dvd Capacity" },
  2705. + { GPCMD_READ_10, "Read 10" },
  2706. + { GPCMD_WRITE_10, "Write 10" },
  2707. + { GPCMD_SEEK, "Seek" },
  2708. + { GPCMD_WRITE_AND_VERIFY_10, "Write and Verify 10" },
  2709. + { GPCMD_VERIFY_10, "Verify 10" },
  2710. + { GPCMD_FLUSH_CACHE, "Flush Cache" },
  2711. + { GPCMD_READ_SUBCHANNEL, "Read Subchannel" },
  2712. + { GPCMD_READ_TOC_PMA_ATIP, "Read Table of Contents" },
  2713. + { GPCMD_READ_HEADER, "Read Header" },
  2714. + { GPCMD_PLAY_AUDIO_10, "Play Audio 10" },
  2715. + { GPCMD_GET_CONFIGURATION, "Get Configuration" },
  2716. + { GPCMD_PLAY_AUDIO_MSF, "Play Audio MSF" },
  2717. + { GPCMD_PLAYAUDIO_TI, "Play Audio TrackIndex" },
  2718. + { GPCMD_GET_EVENT_STATUS_NOTIFICATION, "Get Event Status Notification" },
  2719. + { GPCMD_PAUSE_RESUME, "Pause/Resume" },
  2720. + { GPCMD_STOP_PLAY_SCAN, "Stop Play/Scan" },
  2721. + { GPCMD_READ_DISC_INFO, "Read Disc Info" },
  2722. + { GPCMD_READ_TRACK_RZONE_INFO, "Read Track Rzone Info" },
  2723. + { GPCMD_RESERVE_RZONE_TRACK, "Reserve Rzone Track" },
  2724. + { GPCMD_SEND_OPC, "Send OPC" },
  2725. + { GPCMD_MODE_SELECT_10, "Mode Select 10" },
  2726. + { GPCMD_REPAIR_RZONE_TRACK, "Repair Rzone Track" },
  2727. + { GPCMD_MODE_SENSE_10, "Mode Sense 10" },
  2728. + { GPCMD_CLOSE_TRACK, "Close Track" },
  2729. + { GPCMD_BLANK, "Blank" },
  2730. + { GPCMD_SEND_EVENT, "Send Event" },
  2731. + { GPCMD_SEND_KEY, "Send Key" },
  2732. + { GPCMD_REPORT_KEY, "Report Key" },
  2733. + { GPCMD_LOAD_UNLOAD, "Load/Unload" },
  2734. + { GPCMD_SET_READ_AHEAD, "Set Read-ahead" },
  2735. + { GPCMD_READ_12, "Read 12" },
  2736. + { GPCMD_GET_PERFORMANCE, "Get Performance" },
  2737. + { GPCMD_SEND_DVD_STRUCTURE, "Send DVD Structure" },
  2738. + { GPCMD_READ_DVD_STRUCTURE, "Read DVD Structure" },
  2739. + { GPCMD_SET_STREAMING, "Set Streaming" },
  2740. + { GPCMD_READ_CD_MSF, "Read CD MSF" },
  2741. + { GPCMD_SCAN, "Scan" },
  2742. + { GPCMD_SET_SPEED, "Set Speed" },
  2743. + { GPCMD_PLAY_CD, "Play CD" },
  2744. + { GPCMD_MECHANISM_STATUS, "Mechanism Status" },
  2745. + { GPCMD_READ_CD, "Read CD" },
  2746. +};
  2747. +
  2748.  
  2749. +
  2750. +/* From Table 303 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */
  2751.  const char * const sense_key_texts[16] = {
  2752.   "No sense data",
  2753.   "Recovered error",
  2754. @@ -632,162 +623,144 @@
  2755.   "(reserved)",
  2756.  };
  2757.  
  2758. -
  2759. -/* From Table 37 of the ATAPI 2.6 draft standard. */
  2760. -const struct {
  2761. - unsigned short packet_command;
  2762. - const char * const text;
  2763. -} packet_command_texts[] = {
  2764. - { TEST_UNIT_READY, "Test Unit Ready" },
  2765. - { REQUEST_SENSE, "Request Sense" },
  2766. - { INQUIRY, "Inquiry" },
  2767. - { START_STOP, "Start Stop Unit" },
  2768. - { ALLOW_MEDIUM_REMOVAL, "Prevent/Allow Medium Removal" },
  2769. - { READ_CAPACITY, "Read CD-ROM Capacity" },
  2770. - { READ_10, "Read(10)" },
  2771. - { SEEK, "Seek" },
  2772. - { SCMD_READ_TOC, "Read TOC" },
  2773. - { SCMD_READ_SUBCHANNEL, "Read Sub-Channel" },
  2774. - { READ_HEADER, "Read Header" },
  2775. - { STOP_PLAY_SCAN, "Stop Play/Scan" },
  2776. - { SCMD_PLAYAUDIO10, "Play Audio" },
  2777. - { SCMD_PLAYAUDIO_MSF, "Play Audio MSF" },
  2778. - { SCMD_PAUSE_RESUME, "Pause/Resume" },
  2779. - { MODE_SELECT_10, "Mode Select" },
  2780. - { MODE_SENSE_10, "Mode Sense" },
  2781. - { LOAD_UNLOAD, "Load/Unload CD" },
  2782. - { READ_12, "Read(12)" },
  2783. - { READ_CD_MSF, "Read CD MSF" },
  2784. - { SCAN, "Scan" },
  2785. - { SET_CD_SPEED, "Set CD Speed" },
  2786. - { PLAY_CD, "Play CD" },
  2787. - { MECHANISM_STATUS, "Mechanism Status" },
  2788. - { READ_CD, "Read CD" },
  2789. - { DVD_GET_PERFORMANCE, "Get Performance" },
  2790. -};
  2791. -
  2792. -
  2793. -/* From Table 125 of the ATAPI 1.2 spec.,
  2794. -   with additions from Tables 141 and 142 of the ATAPI 2.6 draft standard. */
  2795. -
  2796. +/* From Table 304 of the SFF8090 Ver. 3 (Mt. Fuji) draft standard. */
  2797.  const struct {
  2798. - unsigned short asc_ascq;
  2799. + unsigned long asc_ascq;
  2800.   const char * const text;
  2801.  } sense_data_texts[] = {
  2802. - { 0x0000, "No additional sense information" },
  2803. -
  2804. - { 0x0011, "Audio play operation in progress" },
  2805. - { 0x0012, "Audio play operation paused" },
  2806. - { 0x0013, "Audio play operation successfully completed" },
  2807. - { 0x0014, "Audio play operation stopped due to error" },
  2808. - { 0x0015, "No current audio status to return" },
  2809. -
  2810. - { 0x0100, "Mechanical positioning or changer error" },
  2811. -
  2812. - { 0x0200, "No seek complete" },
  2813. -
  2814. - { 0x0400, "Logical unit not ready - cause not reportable" },
  2815. - { 0x0401,
  2816. -   "Logical unit not ready - in progress (sic) of becoming ready" },
  2817. - { 0x0402, "Logical unit not ready - initializing command required" },
  2818. - { 0x0403, "Logical unit not ready - manual intervention required" },
  2819. -
  2820. - { 0x0501, "Media load - eject failed" },
  2821. -
  2822. - { 0x0600, "No reference position found" },
  2823. -
  2824. - { 0x0900, "Track following error" },
  2825. - { 0x0901, "Tracking servo failure" },
  2826. - { 0x0902, "Focus servo failure" },
  2827. - { 0x0903, "Spindle servo failure" },
  2828. -
  2829. - { 0x1100, "Unrecovered read error" },
  2830. - { 0x1106, "CIRC unrecovered error" },
  2831. -
  2832. - { 0x1500, "Random positioning error" },
  2833. - { 0x1501, "Mechanical positioning or changer error" },
  2834. - { 0x1502, "Positioning error detected by read of medium" },
  2835. -
  2836. - { 0x1700, "Recovered data with no error correction applied" },
  2837. - { 0x1701, "Recovered data with retries" },
  2838. - { 0x1702, "Recovered data with positive head offset" },
  2839. - { 0x1703, "Recovered data with negative head offset" },
  2840. - { 0x1704, "Recovered data with retries and/or CIRC applied" },
  2841. - { 0x1705, "Recovered data using previous sector ID" },
  2842. -
  2843. - { 0x1800, "Recovered data with error correction applied" },
  2844. - { 0x1801, "Recovered data with error correction and retries applied" },
  2845. - { 0x1802, "Recovered data - the data was auto-reallocated" },
  2846. - { 0x1803, "Recovered data with CIRC" },
  2847. - { 0x1804, "Recovered data with L-EC" },
  2848. - /* Following two not in 2.6. */
  2849. - { 0x1805, "Recovered data - recommend reassignment" },
  2850. - { 0x1806, "Recovered data - recommend rewrite" },
  2851. -
  2852. - { 0x1a00, "Parameter list length error" },
  2853. -
  2854. - { 0x2000, "Invalid command operation code" },
  2855. -
  2856. - { 0x2100, "Logical block address out of range" },
  2857. -
  2858. - { 0x2400, "Invalid field in command packet" },
  2859. -
  2860. - { 0x2600, "Invalid field in parameter list" },
  2861. - { 0x2601, "Parameter not supported" },
  2862. - { 0x2602, "Parameter value invalid" },
  2863. - /* Following code not in 2.6. */
  2864. - { 0x2603, "Threshold parameters not supported" },
  2865. -
  2866. - { 0x2800, "Not ready to ready transition, medium may have changed" },
  2867. -
  2868. - { 0x2900, "Power on, reset or bus device reset occurred" },
  2869. -
  2870. - { 0x2a00, "Parameters changed" },
  2871. - { 0x2a01, "Mode parameters changed" },
  2872. -
  2873. - { 0x3000, "Incompatible medium installed" },
  2874. - { 0x3001, "Cannot read medium - unknown format" },
  2875. - { 0x3002, "Cannot read medium - incompatible format" },
  2876. -
  2877. - /* Following code not in 2.6. */
  2878. - { 0x3700, "Rounded parameter" },
  2879. -
  2880. - { 0x3900, "Saving parameters not supported" },
  2881. -
  2882. - { 0x3a00, "Medium not present" },
  2883. -
  2884. - { 0x3f00, "ATAPI CD-ROM drive operating conditions have changed" },
  2885. - { 0x3f01, "Microcode has been changed" },
  2886. - /* Following two not in 2.6. */
  2887. - { 0x3f02, "Changed operating definition" },
  2888. - { 0x3f03, "Inquiry data has changed" },
  2889. -
  2890. - { 0x4000, "Diagnostic failure on component (ASCQ)" },
  2891. -
  2892. - { 0x4400, "Internal ATAPI CD-ROM drive failure" },
  2893. -
  2894. - { 0x4e00, "Overlapped commands attempted" },
  2895. -
  2896. - { 0x5300, "Media load or eject failed" },
  2897. - { 0x5302, "Medium removal prevented" },
  2898. -
  2899. - { 0x5700, "Unable to recover table of contents" },
  2900. -
  2901. - { 0x5a00, "Operator request or state change input (unspecified)" },
  2902. - { 0x5a01, "Operator medium removal request" },
  2903. -
  2904. - /* Following two not in 2.6. */
  2905. - { 0x5b00, "Threshold condition met" },
  2906. - { 0x5c00, "Status change" },
  2907. -
  2908. - { 0x6300, "End of user area encountered on this track" },
  2909. -
  2910. - { 0x6400, "Illegal mode for this track or incompatible medium" },
  2911. -
  2912. - /* Following error is misspelled in ATAPI 2.6 */
  2913. - { 0xb900, "Play operation oborted [sic]" },
  2914. -
  2915. - { 0xbf00, "Loss of streaming" },
  2916. + { 0x000000, "No additional sense information" },
  2917. + { 0x000011, "Play operation in progress" },
  2918. + { 0x000012, "Play operation paused" },
  2919. + { 0x000013, "Play operation successfully completed" },
  2920. + { 0x000014, "Play operation stopped due to error" },
  2921. + { 0x000015, "No current audio status to return" },
  2922. + { 0x010c0a, "Write error - padding blocks added" },
  2923. + { 0x011700, "Recovered data with no error correction applied" },
  2924. + { 0x011701, "Recovered data with retries" },
  2925. + { 0x011702, "Recovered data with positive head offset" },
  2926. + { 0x011703, "Recovered data with negative head offset" },
  2927. + { 0x011704, "Recovered data with retries and/or CIRC applied" },
  2928. + { 0x011705, "Recovered data using previous sector ID" },
  2929. + { 0x011800, "Recovered data with error correction applied" },
  2930. + { 0x011801, "Recovered data with error correction and retries applied"},
  2931. + { 0x011802, "Recovered data - the data was auto-reallocated" },
  2932. + { 0x011803, "Recovered data with CIRC" },
  2933. + { 0x011804, "Recovered data with L-EC" },
  2934. + { 0x015d00, 
  2935. +     "Failure prediction threshold exceeded - Predicted logical unit failure" },
  2936. + { 0x015d01, 
  2937. +     "Failure prediction threshold exceeded - Predicted media failure" },
  2938. + { 0x015dff, "Failure prediction threshold exceeded - False" },
  2939. + { 0x017301, "Power calibration area almost full" },
  2940. + { 0x020400, "Logical unit not ready - cause not reportable" },
  2941. + /* Following is misspelled in ATAPI 2.6, _and_ in Mt. Fuji */
  2942. + { 0x020401,
  2943. +   "Logical unit not ready - in progress [sic] of becoming ready" },
  2944. + { 0x020402, "Logical unit not ready - initializing command required" },
  2945. + { 0x020403, "Logical unit not ready - manual intervention required" },
  2946. + { 0x020404, "In process of becoming ready - writing" },
  2947. + { 0x020600, "No reference position found (media may be upside down)" },
  2948. + { 0x023000, "Incompatible medium installed" },
  2949. + { 0x023a00, "Medium not present" },
  2950. + { 0x025300, "Media load or eject failed" },
  2951. + { 0x025700, "Unable to recover table of contents" },
  2952. + { 0x030300, "Peripheral device write fault" },
  2953. + { 0x030301, "No write current" },
  2954. + { 0x030302, "Excessive write errors" },
  2955. + { 0x030c00, "Write error" },
  2956. + { 0x030c01, "Write error - Recovered with auto reallocation" },
  2957. + { 0x030c02, "Write error - auto reallocation failed" },
  2958. + { 0x030c03, "Write error - recommend reassignment" },
  2959. + { 0x030c04, "Compression check miscompare error" },
  2960. + { 0x030c05, "Data expansion occurred during compress" },
  2961. + { 0x030c06, "Block not compressible" },
  2962. + { 0x030c07, "Write error - recovery needed" },
  2963. + { 0x030c08, "Write error - recovery failed" },
  2964. + { 0x030c09, "Write error - loss of streaming" },
  2965. + { 0x031100, "Unrecovered read error" },
  2966. + { 0x031106, "CIRC unrecovered error" },
  2967. + { 0x033101, "Format command failed" },
  2968. + { 0x033200, "No defect spare location available" },
  2969. + { 0x033201, "Defect list update failure" },
  2970. + { 0x035100, "Erase failure" },
  2971. + { 0x037200, "Session fixation error" },
  2972. + { 0x037201, "Session fixation error writin lead-in" },
  2973. + { 0x037202, "Session fixation error writin lead-out" },
  2974. + { 0x037300, "CD control error" },
  2975. + { 0x037302, "Power calibration area is full" },
  2976. + { 0x037303, "Power calibration area error" },
  2977. + { 0x037304, "Program memory area / RMA update failure" },
  2978. + { 0x037305, "Program memory area / RMA is full" },
  2979. + { 0x037306, "Program memory area / RMA is (almost) full" },
  2980. +
  2981. + { 0x040200, "No seek complete" },
  2982. + { 0x040300, "Write fault" },
  2983. + { 0x040900, "Track following error" },
  2984. + { 0x040901, "Tracking servo failure" },
  2985. + { 0x040902, "Focus servo failure" },
  2986. + { 0x040903, "Spindle servo failure" },
  2987. + { 0x041500, "Random positioning error" },
  2988. + { 0x041501, "Mechanical positioning or changer error" },
  2989. + { 0x041502, "Positioning error detected by read of medium" },
  2990. + { 0x043c00, "Mechanical positioning or changer error" },
  2991. + { 0x044000, "Diagnostic failure on component (ASCQ)" },
  2992. + { 0x044400, "Internal CD/DVD logical unit failure" },
  2993. + { 0x04b600, "Media load mechanism failed" },
  2994. + { 0x051a00, "Parameter list length error" },
  2995. + { 0x052000, "Invalid command operation code" },
  2996. + { 0x052c00, "Command sequence error" },
  2997. + { 0x052100, "Logical block address out of range" },
  2998. + { 0x052102, "Invalid address for write" },
  2999. + { 0x052400, "Invalid field in command packet" },
  3000. + { 0x052600, "Invalid field in parameter list" },
  3001. + { 0x052601, "Parameter not supported" },
  3002. + { 0x052602, "Parameter value invalid" },
  3003. + { 0x052700, "Write protected media" },
  3004. + { 0x052c00, "Command sequence error" },
  3005. + { 0x052c03, "Current program area is not empty" },
  3006. + { 0x052c04, "Current program area is empty" },
  3007. + { 0x053001, "Cannot read medium - unknown format" },
  3008. + { 0x053002, "Cannot read medium - incompatible format" },
  3009. + { 0x053900, "Saving parameters not supported" },
  3010. + { 0x054e00, "Overlapped commands attempted" },
  3011. + { 0x055302, "Medium removal prevented" },
  3012. + { 0x055500, "System resource failure" },
  3013. + { 0x056300, "End of user area encountered on this track" },
  3014. + { 0x056400, "Illegal mode for this track or incompatible medium" },
  3015. + { 0x056f00, "Copy protection key exchange failure - Authentication failure" },
  3016. + { 0x056f01, "Copy protection key exchange failure - Key not present" },
  3017. + { 0x056f02, "Copy protection key exchange failure - Key not established" },
  3018. + { 0x056f03, "Read of scrambled sector without authentication" },
  3019. + { 0x056f04, "Media region code is mismatched to logical unit" },
  3020. + { 0x056f05,  "Drive region must be permanent / region reset count error" },
  3021. + { 0x057203, "Session fixation error - incomplete track in session" },
  3022. + { 0x057204, "Empty or partially written reserved track" },
  3023. + { 0x057205, "No more RZONE reservations are allowed" },
  3024. + { 0x05bf00, "Loss of streaming" },
  3025. + { 0x062800, "Not ready to ready transition, medium may have changed" },
  3026. + { 0x062900, "Power on, reset or hardware reset occurred" },
  3027. + { 0x062a00, "Parameters changed" },
  3028. + { 0x062a01, "Mode parameters changed" },
  3029. + { 0x062e00, "Insufficient time for operation" },
  3030. + { 0x063f00, "Logical unit operating conditions have changed" },
  3031. + { 0x063f01, "Microcode has been changed" },
  3032. + { 0x065a00, "Operator request or state change input (unspecified)" },
  3033. + { 0x065a01, "Operator medium removal request" },
  3034. + { 0x0bb900, "Play operation aborted" },
  3035. +
  3036. + /* Here we use 0xff for the key (not a valid key) to signify
  3037. +  * that these can have _any_ key value associated with them... */
  3038. + { 0xff0401, "Logical unit is in process of becoming ready" },
  3039. + { 0xff0400, "Logical unit not ready, cause not reportable" },
  3040. + { 0xff0402, "Logical unit not ready, initializing command required" },
  3041. + { 0xff0403, "Logical unit not ready, manual intervention required" },
  3042. + { 0xff0500, "Logical unit does not respond to selection" },
  3043. + { 0xff0800, "Logical unit communication failure" },
  3044. + { 0xff0802, "Logical unit communication parity error" },
  3045. + { 0xff0801, "Logical unit communication time-out" },
  3046. + { 0xff2500, "Logical unit not supported" },
  3047. + { 0xff4c00, "Logical unit failed self-configuration" },
  3048. + { 0xff3e00, "Logical unit has not self-configured yet" },
  3049.  };
  3050.  #endif
  3051.  
  3052. diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/drivers/block/ide-disk.c linux/drivers/block/ide-disk.c
  3053. --- linux-2.2.13/drivers/block/ide-disk.c Thu Mar 11 02:49:43 1999
  3054. +++ linux/drivers/block/ide-disk.c Sun Nov  7 15:17:18 1999
  3055. @@ -159,7 +159,7 @@
  3056.   if (i > 0) {
  3057.   if (msect)
  3058.   goto read_next;
  3059. - ide_set_handler (drive, &read_intr, WAIT_CMD);
  3060. + ide_set_handler (drive, &read_intr, WAIT_CMD, NULL);
  3061.   }
  3062.  }
  3063.  
  3064. @@ -190,7 +190,7 @@
  3065.   ide_end_request(1, hwgroup);
  3066.   if (i > 0) {
  3067.   idedisk_output_data (drive, rq->buffer, SECTOR_WORDS);
  3068. - ide_set_handler (drive, &write_intr, WAIT_CMD);
  3069. + ide_set_handler (drive, &write_intr, WAIT_CMD, NULL);
  3070.   }
  3071.   goto out;
  3072.   }
  3073. @@ -252,7 +252,7 @@
  3074.   if (stat & DRQ_STAT) {
  3075.   if (rq->nr_sectors) {
  3076.   ide_multwrite(drive, drive->mult_count);
  3077. - ide_set_handler (drive, &multwrite_intr, WAIT_CMD);
  3078. + ide_set_handler (drive, &multwrite_intr, WAIT_CMD, NULL);
  3079.   goto out;
  3080.   }
  3081.   } else {
  3082. @@ -371,7 +371,7 @@
  3083.   if (drive->using_dma && !(HWIF(drive)->dmaproc(ide_dma_read, drive)))
  3084.   return;
  3085.  #endif /* CONFIG_BLK_DEV_IDEDMA */
  3086. - ide_set_handler(drive, &read_intr, WAIT_CMD);
  3087. + ide_set_handler(drive, &read_intr, WAIT_CMD, NULL);
  3088.   OUT_BYTE(drive->mult_count ? WIN_MULTREAD : WIN_READ, IDE_COMMAND_REG);
  3089.   return;
  3090.   }
  3091. @@ -390,10 +390,10 @@
  3092.   __cli(); /* local CPU only */
  3093.   if (drive->mult_count) {
  3094.   HWGROUP(drive)->wrq = *rq; /* scratchpad */
  3095. - ide_set_handler (drive, &multwrite_intr, WAIT_CMD);
  3096. + ide_set_handler (drive, &multwrite_intr, WAIT_CMD, NULL);
  3097.   ide_multwrite(drive, drive->mult_count);
  3098.   } else {
  3099. - ide_set_handler (drive, &write_intr, WAIT_CMD);
  3100. + ide_set_handler (drive, &write_intr, WAIT_CMD, NULL);
  3101.   idedisk_output_data(drive, rq->buffer, SECTOR_WORDS);
  3102.   }
  3103.   return;
  3104. diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/drivers/block/ide-dma.c linux/drivers/block/ide-dma.c
  3105. --- linux-2.2.13/drivers/block/ide-dma.c Tue May 18 13:17:11 1999
  3106. +++ linux/drivers/block/ide-dma.c Sun Nov  7 15:17:34 1999
  3107. @@ -329,7 +329,7 @@
  3108.   drive->waiting_for_dma = 1;
  3109.   if (drive->media != ide_disk)
  3110.   return 0;
  3111. - ide_set_handler(drive, &ide_dma_intr, WAIT_CMD);/* issue cmd to drive */
  3112. + ide_set_handler(drive, &ide_dma_intr, WAIT_CMD, NULL);/* issue cmd to drive */
  3113.   OUT_BYTE(reading ? WIN_READDMA : WIN_WRITEDMA, IDE_COMMAND_REG);
  3114.   case ide_dma_begin:
  3115.   /* Note that this is done *after* the cmd has
  3116. diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/drivers/block/ide-floppy.c linux/drivers/block/ide-floppy.c
  3117. --- linux-2.2.13/drivers/block/ide-floppy.c Thu Sep  9 12:27:35 1999
  3118. +++ linux/drivers/block/ide-floppy.c Sun Nov  7 15:18:08 1999
  3119. @@ -920,7 +920,7 @@
  3120.   if (temp > pc->buffer_size) {
  3121.   printk (KERN_ERR "ide-floppy: The floppy wants to send us more data than expected - discarding datan");
  3122.   idefloppy_discard_data (drive,bcount.all);
  3123. - ide_set_handler (drive,&idefloppy_pc_intr,IDEFLOPPY_WAIT_CMD);
  3124. + ide_set_handler (drive,&idefloppy_pc_intr,IDEFLOPPY_WAIT_CMD,NULL);
  3125.   return;
  3126.   }
  3127.  #if IDEFLOPPY_DEBUG_LOG
  3128. @@ -942,7 +942,7 @@
  3129.   pc->actually_transferred+=bcount.all; /* Update the current position */
  3130.   pc->current_position+=bcount.all;
  3131.  
  3132. - ide_set_handler (drive,&idefloppy_pc_intr,IDEFLOPPY_WAIT_CMD); /* And set the interrupt handler again */
  3133. + ide_set_handler (drive,&idefloppy_pc_intr,IDEFLOPPY_WAIT_CMD,NULL); /* And set the interrupt handler again */
  3134.  }
  3135.  
  3136.  static void idefloppy_transfer_pc (ide_drive_t *drive)
  3137. @@ -960,7 +960,7 @@
  3138.   ide_do_reset (drive);
  3139.   return;
  3140.   }
  3141. - ide_set_handler (drive, &idefloppy_pc_intr, IDEFLOPPY_WAIT_CMD); /* Set the interrupt routine */
  3142. + ide_set_handler (drive, &idefloppy_pc_intr, IDEFLOPPY_WAIT_CMD, NULL); /* Set the interrupt routine */
  3143.   atapi_output_bytes (drive, floppy->pc->c, 12); /* Send the actual packet */
  3144.  }
  3145.  
  3146. @@ -1028,7 +1028,7 @@
  3147.  #endif /* CONFIG_BLK_DEV_IDEDMA */
  3148.  
  3149.   if (test_bit (IDEFLOPPY_DRQ_INTERRUPT, &floppy->flags)) {
  3150. - ide_set_handler (drive, &idefloppy_transfer_pc, IDEFLOPPY_WAIT_CMD);
  3151. + ide_set_handler (drive, &idefloppy_transfer_pc, IDEFLOPPY_WAIT_CMD, NULL);
  3152.   OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG); /* Issue the packet command */
  3153.   } else {
  3154.   OUT_BYTE (WIN_PACKETCMD, IDE_COMMAND_REG);
  3155. diff -ur --exclude-from /home/axboe/cdrom/exclude-from linux-2.2.13/drivers/block/ide-pmac.c linux/drivers/block/ide-pmac.c
  3156. --- linux-2.2.13/drivers/block/ide-pmac.c Fri Nov  5 15:15:33 1999
  3157. +++ linux/drivers/block/ide-pmac.c Sun Nov  7 15:18:26 1999
  3158. @@ -359,7 +359,7 @@
  3159.   drive->waiting_for_dma = 1;
  3160.   if (drive->media != ide_disk)
  3161.   return 0;
  3162. - ide_set_handler(drive, &ide_dma_intr, WAIT_CMD);
  3163. + ide_set_handler(drive, &ide_dma_intr, WAIT_CMD, NULL);
  3164.   OUT_BYTE(func==ide_dma_write? WIN_WRITEDMA: WIN_READDMA,