diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/ide/ide-atapi.c | 19 | ||||
| -rw-r--r-- | drivers/ide/ide-tape.c | 12 |
2 files changed, 13 insertions, 18 deletions
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index 7129495b3e40..1022e421abd8 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c | |||
| @@ -172,8 +172,6 @@ void ide_prep_sense(ide_drive_t *drive, struct request *rq) | |||
| 172 | unsigned int cmd_len, sense_len; | 172 | unsigned int cmd_len, sense_len; |
| 173 | int err; | 173 | int err; |
| 174 | 174 | ||
| 175 | debug_log("%s: enter\n", __func__); | ||
| 176 | |||
| 177 | switch (drive->media) { | 175 | switch (drive->media) { |
| 178 | case ide_floppy: | 176 | case ide_floppy: |
| 179 | cmd_len = 255; | 177 | cmd_len = 255; |
| @@ -370,7 +368,7 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
| 370 | ? "write" : "read"); | 368 | ? "write" : "read"); |
| 371 | pc->flags |= PC_FLAG_DMA_ERROR; | 369 | pc->flags |= PC_FLAG_DMA_ERROR; |
| 372 | } else | 370 | } else |
| 373 | pc->xferred = blk_rq_bytes(rq); | 371 | rq->resid_len = 0; |
| 374 | debug_log("%s: DMA finished\n", drive->name); | 372 | debug_log("%s: DMA finished\n", drive->name); |
| 375 | } | 373 | } |
| 376 | 374 | ||
| @@ -379,7 +377,7 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
| 379 | int uptodate, error; | 377 | int uptodate, error; |
| 380 | 378 | ||
| 381 | debug_log("Packet command completed, %d bytes transferred\n", | 379 | debug_log("Packet command completed, %d bytes transferred\n", |
| 382 | pc->xferred); | 380 | blk_rq_bytes(rq)); |
| 383 | 381 | ||
| 384 | pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS; | 382 | pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS; |
| 385 | 383 | ||
| @@ -467,15 +465,15 @@ static ide_startstop_t ide_pc_intr(ide_drive_t *drive) | |||
| 467 | ide_pio_bytes(drive, cmd, write, done); | 465 | ide_pio_bytes(drive, cmd, write, done); |
| 468 | 466 | ||
| 469 | /* Update transferred byte count */ | 467 | /* Update transferred byte count */ |
| 470 | pc->xferred += done; | 468 | rq->resid_len -= done; |
| 471 | 469 | ||
| 472 | bcount -= done; | 470 | bcount -= done; |
| 473 | 471 | ||
| 474 | if (bcount) | 472 | if (bcount) |
| 475 | ide_pad_transfer(drive, write, bcount); | 473 | ide_pad_transfer(drive, write, bcount); |
| 476 | 474 | ||
| 477 | debug_log("[cmd %x] transferred %d bytes, padded %d bytes\n", | 475 | debug_log("[cmd %x] transferred %d bytes, padded %d bytes, resid: %u\n", |
| 478 | rq->cmd[0], done, bcount); | 476 | rq->cmd[0], done, bcount, rq->resid_len); |
| 479 | 477 | ||
| 480 | /* And set the interrupt handler again */ | 478 | /* And set the interrupt handler again */ |
| 481 | ide_set_handler(drive, ide_pc_intr, timeout); | 479 | ide_set_handler(drive, ide_pc_intr, timeout); |
| @@ -643,16 +641,15 @@ ide_startstop_t ide_issue_pc(ide_drive_t *drive, struct ide_cmd *cmd) | |||
| 643 | } else { | 641 | } else { |
| 644 | pc = drive->pc; | 642 | pc = drive->pc; |
| 645 | 643 | ||
| 646 | /* We haven't transferred any data yet */ | ||
| 647 | pc->xferred = 0; | ||
| 648 | |||
| 649 | valid_tf = IDE_VALID_DEVICE; | 644 | valid_tf = IDE_VALID_DEVICE; |
| 650 | bytes = blk_rq_bytes(rq); | 645 | bytes = blk_rq_bytes(rq); |
| 651 | |||
| 652 | bcount = ((drive->media == ide_tape) ? bytes | 646 | bcount = ((drive->media == ide_tape) ? bytes |
| 653 | : min_t(unsigned int, | 647 | : min_t(unsigned int, |
| 654 | bytes, 63 * 1024)); | 648 | bytes, 63 * 1024)); |
| 655 | 649 | ||
| 650 | /* We haven't transferred any data yet */ | ||
| 651 | rq->resid_len = bcount; | ||
| 652 | |||
| 656 | if (pc->flags & PC_FLAG_DMA_ERROR) { | 653 | if (pc->flags & PC_FLAG_DMA_ERROR) { |
| 657 | pc->flags &= ~PC_FLAG_DMA_ERROR; | 654 | pc->flags &= ~PC_FLAG_DMA_ERROR; |
| 658 | ide_dma_off(drive); | 655 | ide_dma_off(drive); |
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index aaeef12f80ad..c93370997972 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
| @@ -301,11 +301,9 @@ static void idetape_analyze_error(ide_drive_t *drive, u8 *sense) | |||
| 301 | debug_log(DBG_ERR, "pc = %x, sense key = %x, asc = %x, ascq = %x\n", | 301 | debug_log(DBG_ERR, "pc = %x, sense key = %x, asc = %x, ascq = %x\n", |
| 302 | pc->c[0], tape->sense_key, tape->asc, tape->ascq); | 302 | pc->c[0], tape->sense_key, tape->asc, tape->ascq); |
| 303 | 303 | ||
| 304 | /* Correct pc->xferred by asking the tape. */ | 304 | /* correct remaining bytes to transfer */ |
| 305 | if (pc->flags & PC_FLAG_DMA_ERROR) | 305 | if (pc->flags & PC_FLAG_DMA_ERROR) |
| 306 | pc->xferred = blk_rq_bytes(rq) - | 306 | rq->resid_len = tape->blk_size * get_unaligned_be32(&sense[3]); |
| 307 | tape->blk_size * | ||
| 308 | get_unaligned_be32(&sense[3]); | ||
| 309 | 307 | ||
| 310 | /* | 308 | /* |
| 311 | * If error was the result of a zero-length read or write command, | 309 | * If error was the result of a zero-length read or write command, |
| @@ -339,7 +337,7 @@ static void idetape_analyze_error(ide_drive_t *drive, u8 *sense) | |||
| 339 | pc->flags |= PC_FLAG_ABORT; | 337 | pc->flags |= PC_FLAG_ABORT; |
| 340 | } | 338 | } |
| 341 | if (!(pc->flags & PC_FLAG_ABORT) && | 339 | if (!(pc->flags & PC_FLAG_ABORT) && |
| 342 | pc->xferred) | 340 | (blk_rq_bytes(rq) - rq->resid_len)) |
| 343 | pc->retries = IDETAPE_MAX_PC_RETRIES + 1; | 341 | pc->retries = IDETAPE_MAX_PC_RETRIES + 1; |
| 344 | } | 342 | } |
| 345 | } | 343 | } |
| @@ -369,7 +367,8 @@ static int ide_tape_callback(ide_drive_t *drive, int dsc) | |||
| 369 | printk(KERN_ERR "ide-tape: Error in REQUEST SENSE " | 367 | printk(KERN_ERR "ide-tape: Error in REQUEST SENSE " |
| 370 | "itself - Aborting request!\n"); | 368 | "itself - Aborting request!\n"); |
| 371 | } else if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) { | 369 | } else if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) { |
| 372 | int blocks = pc->xferred / tape->blk_size; | 370 | unsigned int blocks = |
| 371 | (blk_rq_bytes(rq) - rq->resid_len) / tape->blk_size; | ||
| 373 | 372 | ||
| 374 | tape->avg_size += blocks * tape->blk_size; | 373 | tape->avg_size += blocks * tape->blk_size; |
| 375 | 374 | ||
| @@ -381,7 +380,6 @@ static int ide_tape_callback(ide_drive_t *drive, int dsc) | |||
| 381 | } | 380 | } |
| 382 | 381 | ||
| 383 | tape->first_frame += blocks; | 382 | tape->first_frame += blocks; |
| 384 | rq->resid_len = blk_rq_bytes(rq) - blocks * tape->blk_size; | ||
| 385 | 383 | ||
| 386 | if (pc->error) { | 384 | if (pc->error) { |
| 387 | uptodate = 0; | 385 | uptodate = 0; |
