diff options
Diffstat (limited to 'drivers/ide/ide-cd.c')
-rw-r--r-- | drivers/ide/ide-cd.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 4a19686fcfe9..6a9a769bffc1 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -592,9 +592,19 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
592 | } | 592 | } |
593 | } else if (!blk_pc_request(rq)) { | 593 | } else if (!blk_pc_request(rq)) { |
594 | ide_cd_request_sense_fixup(drive, cmd); | 594 | ide_cd_request_sense_fixup(drive, cmd); |
595 | /* complain if we still have data left to transfer */ | 595 | |
596 | uptodate = cmd->nleft ? 0 : 1; | 596 | uptodate = cmd->nleft ? 0 : 1; |
597 | if (uptodate == 0) | 597 | |
598 | /* | ||
599 | * suck out the remaining bytes from the drive in an | ||
600 | * attempt to complete the data xfer. (see BZ#13399) | ||
601 | */ | ||
602 | if (!(stat & ATA_ERR) && !uptodate && thislen) { | ||
603 | ide_pio_bytes(drive, cmd, write, thislen); | ||
604 | uptodate = cmd->nleft ? 0 : 1; | ||
605 | } | ||
606 | |||
607 | if (!uptodate) | ||
598 | rq->cmd_flags |= REQ_FAILED; | 608 | rq->cmd_flags |= REQ_FAILED; |
599 | } | 609 | } |
600 | goto out_end; | 610 | goto out_end; |
@@ -876,9 +886,12 @@ static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity, | |||
876 | return stat; | 886 | return stat; |
877 | 887 | ||
878 | /* | 888 | /* |
879 | * Sanity check the given block size | 889 | * Sanity check the given block size, in so far as making |
890 | * sure the sectors_per_frame we give to the caller won't | ||
891 | * end up being bogus. | ||
880 | */ | 892 | */ |
881 | blocklen = be32_to_cpu(capbuf.blocklen); | 893 | blocklen = be32_to_cpu(capbuf.blocklen); |
894 | blocklen = (blocklen >> SECTOR_BITS) << SECTOR_BITS; | ||
882 | switch (blocklen) { | 895 | switch (blocklen) { |
883 | case 512: | 896 | case 512: |
884 | case 1024: | 897 | case 1024: |
@@ -886,10 +899,9 @@ static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity, | |||
886 | case 4096: | 899 | case 4096: |
887 | break; | 900 | break; |
888 | default: | 901 | default: |
889 | printk(KERN_ERR PFX "%s: weird block size %u\n", | 902 | printk_once(KERN_ERR PFX "%s: weird block size %u; " |
903 | "setting default block size to 2048\n", | ||
890 | drive->name, blocklen); | 904 | drive->name, blocklen); |
891 | printk(KERN_ERR PFX "%s: default to 2kb block size\n", | ||
892 | drive->name); | ||
893 | blocklen = 2048; | 905 | blocklen = 2048; |
894 | break; | 906 | break; |
895 | } | 907 | } |