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.c33
1 files changed, 4 insertions, 29 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
index eb4b27548caf..789b19cf5e55 100644
--- a/drivers/ide/ide-cd.c
+++ b/drivers/ide/ide-cd.c
@@ -599,28 +599,6 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive,
599} 599}
600 600
601/* 601/*
602 * Block read functions.
603 */
604static void ide_cd_pad_transfer(ide_drive_t *drive, xfer_func_t *xf, int len)
605{
606 while (len > 0) {
607 int dum = 0;
608 xf(drive, NULL, &dum, sizeof(dum));
609 len -= sizeof(dum);
610 }
611}
612
613static void ide_cd_drain_data(ide_drive_t *drive, int nsects)
614{
615 while (nsects > 0) {
616 static char dum[SECTOR_SIZE];
617
618 drive->hwif->input_data(drive, NULL, dum, sizeof(dum));
619 nsects--;
620 }
621}
622
623/*
624 * Check the contents of the interrupt reason register from the cdrom 602 * Check the contents of the interrupt reason register from the cdrom
625 * and attempt to recover if there are problems. Returns 0 if everything's 603 * and attempt to recover if there are problems. Returns 0 if everything's
626 * ok; nonzero if the request has been terminated. 604 * ok; nonzero if the request has been terminated.
@@ -635,15 +613,12 @@ static int ide_cd_check_ireason(ide_drive_t *drive, struct request *rq,
635 if (ireason == (!rw << 1)) 613 if (ireason == (!rw << 1))
636 return 0; 614 return 0;
637 else if (ireason == (rw << 1)) { 615 else if (ireason == (rw << 1)) {
638 ide_hwif_t *hwif = drive->hwif;
639 xfer_func_t *xf;
640 616
641 /* whoops... */ 617 /* whoops... */
642 printk(KERN_ERR "%s: %s: wrong transfer direction!\n", 618 printk(KERN_ERR "%s: %s: wrong transfer direction!\n",
643 drive->name, __func__); 619 drive->name, __func__);
644 620
645 xf = rw ? hwif->output_data : hwif->input_data; 621 ide_pad_transfer(drive, rw, len);
646 ide_cd_pad_transfer(drive, xf, len);
647 } else if (rw == 0 && ireason == 1) { 622 } else if (rw == 0 && ireason == 1) {
648 /* 623 /*
649 * Some drives (ASUS) seem to tell us that status info is 624 * Some drives (ASUS) seem to tell us that status info is
@@ -1006,7 +981,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
1006 - bio_cur_sectors(rq->bio), 981 - bio_cur_sectors(rq->bio),
1007 thislen >> 9); 982 thislen >> 9);
1008 if (nskip > 0) { 983 if (nskip > 0) {
1009 ide_cd_drain_data(drive, nskip); 984 ide_pad_transfer(drive, write, nskip << 9);
1010 rq->current_nr_sectors -= nskip; 985 rq->current_nr_sectors -= nskip;
1011 thislen -= (nskip << 9); 986 thislen -= (nskip << 9);
1012 } 987 }
@@ -1043,7 +1018,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
1043 * If the buffers are full, pipe the rest into 1018 * If the buffers are full, pipe the rest into
1044 * oblivion. 1019 * oblivion.
1045 */ 1020 */
1046 ide_cd_drain_data(drive, thislen >> 9); 1021 ide_pad_transfer(drive, 0, thislen);
1047 else { 1022 else {
1048 printk(KERN_ERR "%s: confused, missing data\n", 1023 printk(KERN_ERR "%s: confused, missing data\n",
1049 drive->name); 1024 drive->name);
@@ -1091,7 +1066,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)
1091 1066
1092 /* pad, if necessary */ 1067 /* pad, if necessary */
1093 if (!blk_fs_request(rq) && len > 0) 1068 if (!blk_fs_request(rq) && len > 0)
1094 ide_cd_pad_transfer(drive, xferfunc, len); 1069 ide_pad_transfer(drive, write, len);
1095 1070
1096 if (blk_pc_request(rq)) { 1071 if (blk_pc_request(rq)) {
1097 timeout = rq->timeout; 1072 timeout = rq->timeout;