diff options
Diffstat (limited to 'drivers/ide/ide-cd.c')
-rw-r--r-- | drivers/ide/ide-cd.c | 101 |
1 files changed, 40 insertions, 61 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index edcdc7432ddf..4b395e015e76 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -918,38 +918,6 @@ static void restore_request (struct request *rq) | |||
918 | rq->q->prep_rq_fn(rq->q, rq); | 918 | rq->q->prep_rq_fn(rq->q, rq); |
919 | } | 919 | } |
920 | 920 | ||
921 | /* | ||
922 | * Start a read request from the CD-ROM. | ||
923 | */ | ||
924 | static ide_startstop_t cdrom_start_read (ide_drive_t *drive, unsigned int block) | ||
925 | { | ||
926 | struct cdrom_info *info = drive->driver_data; | ||
927 | struct request *rq = HWGROUP(drive)->rq; | ||
928 | unsigned short sectors_per_frame; | ||
929 | |||
930 | sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS; | ||
931 | |||
932 | /* We may be retrying this request after an error. Fix up | ||
933 | any weirdness which might be present in the request packet. */ | ||
934 | restore_request(rq); | ||
935 | |||
936 | /* Satisfy whatever we can of this request from our cached sector. */ | ||
937 | if (cdrom_read_from_buffer(drive)) | ||
938 | return ide_stopped; | ||
939 | |||
940 | /* Clear the local sector buffer. */ | ||
941 | info->nsectors_buffered = 0; | ||
942 | |||
943 | /* use dma, if possible. */ | ||
944 | info->dma = drive->using_dma; | ||
945 | if ((rq->sector & (sectors_per_frame - 1)) || | ||
946 | (rq->nr_sectors & (sectors_per_frame - 1))) | ||
947 | info->dma = 0; | ||
948 | |||
949 | /* Start sending the read request to the drive. */ | ||
950 | return cdrom_start_packet_command(drive, 32768, cdrom_start_rw_cont); | ||
951 | } | ||
952 | |||
953 | /**************************************************************************** | 921 | /**************************************************************************** |
954 | * Execute all other packet commands. | 922 | * Execute all other packet commands. |
955 | */ | 923 | */ |
@@ -1383,38 +1351,53 @@ static ide_startstop_t cdrom_rw_intr(ide_drive_t *drive) | |||
1383 | return ide_started; | 1351 | return ide_started; |
1384 | } | 1352 | } |
1385 | 1353 | ||
1386 | static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq) | 1354 | static ide_startstop_t cdrom_start_rw(ide_drive_t *drive, struct request *rq) |
1387 | { | 1355 | { |
1388 | struct cdrom_info *info = drive->driver_data; | 1356 | struct cdrom_info *cd = drive->driver_data; |
1389 | struct gendisk *g = info->disk; | 1357 | int write = rq_data_dir(rq) == WRITE; |
1390 | unsigned short sectors_per_frame = queue_hardsect_size(drive->queue) >> SECTOR_BITS; | 1358 | unsigned short sectors_per_frame = |
1359 | queue_hardsect_size(drive->queue) >> SECTOR_BITS; | ||
1391 | 1360 | ||
1392 | /* | 1361 | if (write) { |
1393 | * writes *must* be hardware frame aligned | 1362 | /* |
1394 | */ | 1363 | * disk has become write protected |
1395 | if ((rq->nr_sectors & (sectors_per_frame - 1)) || | 1364 | */ |
1396 | (rq->sector & (sectors_per_frame - 1))) { | 1365 | if (cd->disk->policy) { |
1397 | cdrom_end_request(drive, 0); | 1366 | cdrom_end_request(drive, 0); |
1398 | return ide_stopped; | 1367 | return ide_stopped; |
1368 | } | ||
1369 | } else { | ||
1370 | /* | ||
1371 | * We may be retrying this request after an error. Fix up any | ||
1372 | * weirdness which might be present in the request packet. | ||
1373 | */ | ||
1374 | restore_request(rq); | ||
1375 | |||
1376 | /* Satisfy whatever we can of this request from our cache. */ | ||
1377 | if (cdrom_read_from_buffer(drive)) | ||
1378 | return ide_stopped; | ||
1399 | } | 1379 | } |
1400 | 1380 | ||
1401 | /* | 1381 | /* |
1402 | * disk has become write protected | 1382 | * use DMA, if possible / writes *must* be hardware frame aligned |
1403 | */ | 1383 | */ |
1404 | if (g->policy) { | 1384 | if ((rq->nr_sectors & (sectors_per_frame - 1)) || |
1405 | cdrom_end_request(drive, 0); | 1385 | (rq->sector & (sectors_per_frame - 1))) { |
1406 | return ide_stopped; | 1386 | if (write) { |
1407 | } | 1387 | cdrom_end_request(drive, 0); |
1408 | 1388 | return ide_stopped; | |
1409 | info->nsectors_buffered = 0; | 1389 | } |
1390 | cd->dma = 0; | ||
1391 | } else | ||
1392 | cd->dma = drive->using_dma; | ||
1410 | 1393 | ||
1411 | /* use dma, if possible. we don't need to check more, since we | 1394 | /* Clear the local sector buffer. */ |
1412 | * know that the transfer is always (at least!) frame aligned */ | 1395 | cd->nsectors_buffered = 0; |
1413 | info->dma = drive->using_dma ? 1 : 0; | ||
1414 | 1396 | ||
1415 | info->devinfo.media_written = 1; | 1397 | if (write) |
1398 | cd->devinfo.media_written = 1; | ||
1416 | 1399 | ||
1417 | /* Start sending the write request to the drive. */ | 1400 | /* Start sending the read/write request to the drive. */ |
1418 | return cdrom_start_packet_command(drive, 32768, cdrom_start_rw_cont); | 1401 | return cdrom_start_packet_command(drive, 32768, cdrom_start_rw_cont); |
1419 | } | 1402 | } |
1420 | 1403 | ||
@@ -1487,12 +1470,8 @@ ide_do_rw_cdrom (ide_drive_t *drive, struct request *rq, sector_t block) | |||
1487 | } | 1470 | } |
1488 | if ((rq_data_dir(rq) == READ) && IDE_LARGE_SEEK(info->last_block, block, IDECD_SEEK_THRESHOLD) && drive->dsc_overlap) { | 1471 | if ((rq_data_dir(rq) == READ) && IDE_LARGE_SEEK(info->last_block, block, IDECD_SEEK_THRESHOLD) && drive->dsc_overlap) { |
1489 | action = cdrom_start_seek(drive, block); | 1472 | action = cdrom_start_seek(drive, block); |
1490 | } else { | 1473 | } else |
1491 | if (rq_data_dir(rq) == READ) | 1474 | action = cdrom_start_rw(drive, rq); |
1492 | action = cdrom_start_read(drive, block); | ||
1493 | else | ||
1494 | action = cdrom_start_write(drive, rq); | ||
1495 | } | ||
1496 | info->last_block = block; | 1475 | info->last_block = block; |
1497 | return action; | 1476 | return action; |
1498 | } else if (blk_sense_request(rq) || blk_pc_request(rq) || | 1477 | } else if (blk_sense_request(rq) || blk_pc_request(rq) || |