diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/ide/ide-cd.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 8f253e5f26a8..e617cf08aef6 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -1311,13 +1311,30 @@ static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity, | |||
1311 | 1311 | ||
1312 | stat = ide_cd_queue_pc(drive, cmd, 0, &capbuf, &len, sense, 0, | 1312 | stat = ide_cd_queue_pc(drive, cmd, 0, &capbuf, &len, sense, 0, |
1313 | REQ_QUIET); | 1313 | REQ_QUIET); |
1314 | if (stat == 0) { | 1314 | if (stat) |
1315 | *capacity = 1 + be32_to_cpu(capbuf.lba); | 1315 | return stat; |
1316 | *sectors_per_frame = | 1316 | |
1317 | be32_to_cpu(capbuf.blocklen) >> SECTOR_BITS; | 1317 | /* |
1318 | * Sanity check the given block size | ||
1319 | */ | ||
1320 | switch (capbuf.blocklen) { | ||
1321 | case __constant_cpu_to_be32(512): | ||
1322 | case __constant_cpu_to_be32(1024): | ||
1323 | case __constant_cpu_to_be32(2048): | ||
1324 | case __constant_cpu_to_be32(4096): | ||
1325 | break; | ||
1326 | default: | ||
1327 | printk(KERN_ERR "%s: weird block size %u\n", | ||
1328 | drive->name, capbuf.blocklen); | ||
1329 | printk(KERN_ERR "%s: default to 2kb block size\n", | ||
1330 | drive->name); | ||
1331 | capbuf.blocklen = __constant_cpu_to_be32(2048); | ||
1332 | break; | ||
1318 | } | 1333 | } |
1319 | 1334 | ||
1320 | return stat; | 1335 | *capacity = 1 + be32_to_cpu(capbuf.lba); |
1336 | *sectors_per_frame = be32_to_cpu(capbuf.blocklen) >> SECTOR_BITS; | ||
1337 | return 0; | ||
1321 | } | 1338 | } |
1322 | 1339 | ||
1323 | static int cdrom_read_tocentry(ide_drive_t *drive, int trackno, int msf_flag, | 1340 | static int cdrom_read_tocentry(ide_drive_t *drive, int trackno, int msf_flag, |