aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-cd.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/ide-cd.c')
-rw-r--r--drivers/ide/ide-cd.c74
1 files changed, 35 insertions, 39 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
index 58397617b281..edcdc7432ddf 100644
--- a/drivers/ide/ide-cd.c
+++ b/drivers/ide/ide-cd.c
@@ -800,39 +800,48 @@ static int cdrom_read_from_buffer (ide_drive_t *drive)
800static ide_startstop_t cdrom_rw_intr(ide_drive_t *); 800static ide_startstop_t cdrom_rw_intr(ide_drive_t *);
801 801
802/* 802/*
803 * Routine to send a read packet command to the drive. 803 * Routine to send a read/write packet command to the drive.
804 * This is usually called directly from cdrom_start_read. 804 * This is usually called directly from cdrom_start_{read,write}().
805 * However, for drq_interrupt devices, it is called from an interrupt 805 * However, for drq_interrupt devices, it is called from an interrupt
806 * when the drive is ready to accept the command. 806 * when the drive is ready to accept the command.
807 */ 807 */
808static ide_startstop_t cdrom_start_read_continuation (ide_drive_t *drive) 808static ide_startstop_t cdrom_start_rw_cont(ide_drive_t *drive)
809{ 809{
810 struct request *rq = HWGROUP(drive)->rq; 810 struct request *rq = HWGROUP(drive)->rq;
811 unsigned short sectors_per_frame;
812 int nskip;
813 811
814 sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS; 812 if (rq_data_dir(rq) == READ) {
813 unsigned short sectors_per_frame =
814 queue_hardsect_size(drive->queue) >> SECTOR_BITS;
815 int nskip = rq->sector & (sectors_per_frame - 1);
815 816
816 /* If the requested sector doesn't start on a cdrom block boundary, 817 /*
817 we must adjust the start of the transfer so that it does, 818 * If the requested sector doesn't start on a frame boundary,
818 and remember to skip the first few sectors. 819 * we must adjust the start of the transfer so that it does,
819 If the CURRENT_NR_SECTORS field is larger than the size 820 * and remember to skip the first few sectors.
820 of the buffer, it will mean that we're to skip a number 821 *
821 of sectors equal to the amount by which CURRENT_NR_SECTORS 822 * If the rq->current_nr_sectors field is larger than the size
822 is larger than the buffer size. */ 823 * of the buffer, it will mean that we're to skip a number of
823 nskip = rq->sector & (sectors_per_frame - 1); 824 * sectors equal to the amount by which rq->current_nr_sectors
824 if (nskip > 0) { 825 * is larger than the buffer size.
825 /* Sanity check... */ 826 */
826 if (rq->current_nr_sectors != bio_cur_sectors(rq->bio) && 827 if (nskip > 0) {
827 (rq->sector & (sectors_per_frame - 1))) { 828 /* Sanity check... */
828 printk(KERN_ERR "%s: cdrom_start_read_continuation: buffer botch (%u)\n", 829 if (rq->current_nr_sectors !=
829 drive->name, rq->current_nr_sectors); 830 bio_cur_sectors(rq->bio)) {
830 cdrom_end_request(drive, 0); 831 printk(KERN_ERR "%s: %s: buffer botch (%u)\n",
831 return ide_stopped; 832 drive->name, __FUNCTION__,
833 rq->current_nr_sectors);
834 cdrom_end_request(drive, 0);
835 return ide_stopped;
836 }
837 rq->current_nr_sectors += nskip;
832 } 838 }
833 rq->current_nr_sectors += nskip;
834 } 839 }
835 840#if 0
841 else
842 /* the immediate bit */
843 rq->cmd[1] = 1 << 3;
844#endif
836 /* Set up the command */ 845 /* Set up the command */
837 rq->timeout = ATAPI_WAIT_PC; 846 rq->timeout = ATAPI_WAIT_PC;
838 847
@@ -840,7 +849,6 @@ static ide_startstop_t cdrom_start_read_continuation (ide_drive_t *drive)
840 return cdrom_transfer_packet_command(drive, rq, cdrom_rw_intr); 849 return cdrom_transfer_packet_command(drive, rq, cdrom_rw_intr);
841} 850}
842 851
843
844#define IDECD_SEEK_THRESHOLD (1000) /* 1000 blocks */ 852#define IDECD_SEEK_THRESHOLD (1000) /* 1000 blocks */
845#define IDECD_SEEK_TIMER (5 * WAIT_MIN_SLEEP) /* 100 ms */ 853#define IDECD_SEEK_TIMER (5 * WAIT_MIN_SLEEP) /* 100 ms */
846#define IDECD_SEEK_TIMEOUT (2 * WAIT_CMD) /* 20 sec */ 854#define IDECD_SEEK_TIMEOUT (2 * WAIT_CMD) /* 20 sec */
@@ -939,7 +947,7 @@ static ide_startstop_t cdrom_start_read (ide_drive_t *drive, unsigned int block)
939 info->dma = 0; 947 info->dma = 0;
940 948
941 /* Start sending the read request to the drive. */ 949 /* Start sending the read request to the drive. */
942 return cdrom_start_packet_command(drive, 32768, cdrom_start_read_continuation); 950 return cdrom_start_packet_command(drive, 32768, cdrom_start_rw_cont);
943} 951}
944 952
945/**************************************************************************** 953/****************************************************************************
@@ -1375,18 +1383,6 @@ static ide_startstop_t cdrom_rw_intr(ide_drive_t *drive)
1375 return ide_started; 1383 return ide_started;
1376} 1384}
1377 1385
1378static ide_startstop_t cdrom_start_write_cont(ide_drive_t *drive)
1379{
1380 struct request *rq = HWGROUP(drive)->rq;
1381
1382#if 0 /* the immediate bit */
1383 rq->cmd[1] = 1 << 3;
1384#endif
1385 rq->timeout = ATAPI_WAIT_PC;
1386
1387 return cdrom_transfer_packet_command(drive, rq, cdrom_rw_intr);
1388}
1389
1390static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq) 1386static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq)
1391{ 1387{
1392 struct cdrom_info *info = drive->driver_data; 1388 struct cdrom_info *info = drive->driver_data;
@@ -1419,7 +1415,7 @@ static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq)
1419 info->devinfo.media_written = 1; 1415 info->devinfo.media_written = 1;
1420 1416
1421 /* Start sending the write request to the drive. */ 1417 /* Start sending the write request to the drive. */
1422 return cdrom_start_packet_command(drive, 32768, cdrom_start_write_cont); 1418 return cdrom_start_packet_command(drive, 32768, cdrom_start_rw_cont);
1423} 1419}
1424 1420
1425static ide_startstop_t cdrom_do_newpc_cont(ide_drive_t *drive) 1421static ide_startstop_t cdrom_do_newpc_cont(ide_drive_t *drive)