diff options
| author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-12-29 14:27:32 -0500 |
|---|---|---|
| committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-12-29 14:27:32 -0500 |
| commit | 27c01c2db05c3cf8824975e50403cd4fd9356dca (patch) | |
| tree | 5032c9b77971778c7e76722d0e86fa66a3a6dc1b | |
| parent | 08cd1dca00f7c84c8b30c2726e078529d4ebc93f (diff) | |
ide-cd: remove obsolete seek optimization
It doesn't make much sense nowadays and is problematic on some drives.
Cc: Borislav Petkov <petkovbb@googlemail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
| -rw-r--r-- | drivers/ide/ide-cd.c | 89 | ||||
| -rw-r--r-- | drivers/ide/ide-cd.h | 2 | ||||
| -rw-r--r-- | include/linux/ide.h | 4 |
3 files changed, 6 insertions, 89 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 692fd4570df6..ea35e94d0980 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
| @@ -774,52 +774,6 @@ static ide_startstop_t cdrom_start_rw_cont(ide_drive_t *drive) | |||
| 774 | return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr); | 774 | return cdrom_transfer_packet_command(drive, rq, cdrom_newpc_intr); |
| 775 | } | 775 | } |
| 776 | 776 | ||
| 777 | #define IDECD_SEEK_THRESHOLD (1000) /* 1000 blocks */ | ||
| 778 | #define IDECD_SEEK_TIMER (5 * WAIT_MIN_SLEEP) /* 100 ms */ | ||
| 779 | #define IDECD_SEEK_TIMEOUT (2 * WAIT_CMD) /* 20 sec */ | ||
| 780 | |||
| 781 | static ide_startstop_t cdrom_seek_intr(ide_drive_t *drive) | ||
| 782 | { | ||
| 783 | struct cdrom_info *info = drive->driver_data; | ||
| 784 | int stat; | ||
| 785 | static int retry = 10; | ||
| 786 | |||
| 787 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); | ||
| 788 | |||
| 789 | if (cdrom_decode_status(drive, 0, &stat)) | ||
| 790 | return ide_stopped; | ||
| 791 | |||
| 792 | drive->atapi_flags |= IDE_AFLAG_SEEKING; | ||
| 793 | |||
| 794 | if (retry && time_after(jiffies, info->start_seek + IDECD_SEEK_TIMER)) { | ||
| 795 | if (--retry == 0) | ||
| 796 | drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP; | ||
| 797 | } | ||
| 798 | return ide_stopped; | ||
| 799 | } | ||
| 800 | |||
| 801 | static void ide_cd_prepare_seek_request(ide_drive_t *drive, struct request *rq) | ||
| 802 | { | ||
| 803 | sector_t frame = rq->sector; | ||
| 804 | |||
| 805 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); | ||
| 806 | |||
| 807 | sector_div(frame, queue_hardsect_size(drive->queue) >> SECTOR_BITS); | ||
| 808 | |||
| 809 | memset(rq->cmd, 0, BLK_MAX_CDB); | ||
| 810 | rq->cmd[0] = GPCMD_SEEK; | ||
| 811 | put_unaligned(cpu_to_be32(frame), (unsigned int *) &rq->cmd[2]); | ||
| 812 | |||
| 813 | rq->timeout = ATAPI_WAIT_PC; | ||
| 814 | } | ||
| 815 | |||
| 816 | static ide_startstop_t cdrom_start_seek_continuation(ide_drive_t *drive) | ||
| 817 | { | ||
| 818 | struct request *rq = drive->hwif->hwgroup->rq; | ||
| 819 | |||
| 820 | return cdrom_transfer_packet_command(drive, rq, &cdrom_seek_intr); | ||
| 821 | } | ||
| 822 | |||
| 823 | /* | 777 | /* |
| 824 | * Fix up a possibly partially-processed request so that we can start it over | 778 | * Fix up a possibly partially-processed request so that we can start it over |
| 825 | * entirely, or even put it back on the request queue. | 779 | * entirely, or even put it back on the request queue. |
| @@ -1260,7 +1214,6 @@ static void cdrom_do_block_pc(ide_drive_t *drive, struct request *rq) | |||
| 1260 | static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, | 1214 | static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, |
| 1261 | sector_t block) | 1215 | sector_t block) |
| 1262 | { | 1216 | { |
| 1263 | struct cdrom_info *info = drive->driver_data; | ||
| 1264 | ide_handler_t *fn; | 1217 | ide_handler_t *fn; |
| 1265 | int xferlen; | 1218 | int xferlen; |
| 1266 | 1219 | ||
| @@ -1270,44 +1223,14 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, | |||
| 1270 | (unsigned long long)block); | 1223 | (unsigned long long)block); |
| 1271 | 1224 | ||
| 1272 | if (blk_fs_request(rq)) { | 1225 | if (blk_fs_request(rq)) { |
| 1273 | if (drive->atapi_flags & IDE_AFLAG_SEEKING) { | 1226 | xferlen = 32768; |
| 1274 | ide_hwif_t *hwif = drive->hwif; | 1227 | fn = cdrom_start_rw_cont; |
| 1275 | unsigned long elapsed = jiffies - info->start_seek; | ||
| 1276 | int stat = hwif->tp_ops->read_status(hwif); | ||
| 1277 | |||
| 1278 | if ((stat & ATA_DSC) != ATA_DSC) { | ||
| 1279 | if (elapsed < IDECD_SEEK_TIMEOUT) { | ||
| 1280 | ide_stall_queue(drive, | ||
| 1281 | IDECD_SEEK_TIMER); | ||
| 1282 | return ide_stopped; | ||
| 1283 | } | ||
| 1284 | printk(KERN_ERR PFX "%s: DSC timeout\n", | ||
| 1285 | drive->name); | ||
| 1286 | } | ||
| 1287 | drive->atapi_flags &= ~IDE_AFLAG_SEEKING; | ||
| 1288 | } | ||
| 1289 | if (rq_data_dir(rq) == READ && | ||
| 1290 | IDE_LARGE_SEEK(info->last_block, block, | ||
| 1291 | IDECD_SEEK_THRESHOLD) && | ||
| 1292 | (drive->dev_flags & IDE_DFLAG_DSC_OVERLAP)) { | ||
| 1293 | xferlen = 0; | ||
| 1294 | fn = cdrom_start_seek_continuation; | ||
| 1295 | |||
| 1296 | drive->dma = 0; | ||
| 1297 | info->start_seek = jiffies; | ||
| 1298 | |||
| 1299 | ide_cd_prepare_seek_request(drive, rq); | ||
| 1300 | } else { | ||
| 1301 | xferlen = 32768; | ||
| 1302 | fn = cdrom_start_rw_cont; | ||
| 1303 | 1228 | ||
| 1304 | if (cdrom_start_rw(drive, rq) == ide_stopped) | 1229 | if (cdrom_start_rw(drive, rq) == ide_stopped) |
| 1305 | return ide_stopped; | 1230 | return ide_stopped; |
| 1306 | 1231 | ||
| 1307 | if (ide_cd_prepare_rw_request(drive, rq) == ide_stopped) | 1232 | if (ide_cd_prepare_rw_request(drive, rq) == ide_stopped) |
| 1308 | return ide_stopped; | 1233 | return ide_stopped; |
| 1309 | } | ||
| 1310 | info->last_block = block; | ||
| 1311 | } else if (blk_sense_request(rq) || blk_pc_request(rq) || | 1234 | } else if (blk_sense_request(rq) || blk_pc_request(rq) || |
| 1312 | rq->cmd_type == REQ_TYPE_ATA_PC) { | 1235 | rq->cmd_type == REQ_TYPE_ATA_PC) { |
| 1313 | xferlen = rq->data_len; | 1236 | xferlen = rq->data_len; |
diff --git a/drivers/ide/ide-cd.h b/drivers/ide/ide-cd.h index 5882b9a9ea8b..d5ce3362dbd1 100644 --- a/drivers/ide/ide-cd.h +++ b/drivers/ide/ide-cd.h | |||
| @@ -88,8 +88,6 @@ struct cdrom_info { | |||
| 88 | struct request_sense sense_data; | 88 | struct request_sense sense_data; |
| 89 | 89 | ||
| 90 | struct request request_sense_request; | 90 | struct request request_sense_request; |
| 91 | unsigned long last_block; | ||
| 92 | unsigned long start_seek; | ||
| 93 | 91 | ||
| 94 | u8 max_speed; /* Max speed of the drive. */ | 92 | u8 max_speed; /* Max speed of the drive. */ |
| 95 | u8 current_speed; /* Current speed of the drive. */ | 93 | u8 current_speed; /* Current speed of the drive. */ |
diff --git a/include/linux/ide.h b/include/linux/ide.h index c871d325cedb..0b8af0535d85 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
| @@ -122,8 +122,6 @@ struct ide_io_ports { | |||
| 122 | #define MAX_DRIVES 2 /* per interface; 2 assumed by lots of code */ | 122 | #define MAX_DRIVES 2 /* per interface; 2 assumed by lots of code */ |
| 123 | #define SECTOR_SIZE 512 | 123 | #define SECTOR_SIZE 512 |
| 124 | 124 | ||
| 125 | #define IDE_LARGE_SEEK(b1,b2,t) (((b1) > (b2) + (t)) || ((b2) > (b1) + (t))) | ||
| 126 | |||
| 127 | /* | 125 | /* |
| 128 | * Timeouts for various operations: | 126 | * Timeouts for various operations: |
| 129 | */ | 127 | */ |
| @@ -496,8 +494,6 @@ enum { | |||
| 496 | * when more than one interrupt is needed. | 494 | * when more than one interrupt is needed. |
| 497 | */ | 495 | */ |
| 498 | IDE_AFLAG_LIMIT_NFRAMES = (1 << 7), | 496 | IDE_AFLAG_LIMIT_NFRAMES = (1 << 7), |
| 499 | /* Seeking in progress. */ | ||
| 500 | IDE_AFLAG_SEEKING = (1 << 8), | ||
| 501 | /* Saved TOC information is current. */ | 497 | /* Saved TOC information is current. */ |
| 502 | IDE_AFLAG_TOC_VALID = (1 << 9), | 498 | IDE_AFLAG_TOC_VALID = (1 << 9), |
| 503 | /* We think that the drive door is locked. */ | 499 | /* We think that the drive door is locked. */ |
