diff options
Diffstat (limited to 'drivers/ide/ide-tape.c')
-rw-r--r-- | drivers/ide/ide-tape.c | 31 |
1 files changed, 11 insertions, 20 deletions
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 70b499a617d8..5b2ac04d9be9 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -172,15 +172,11 @@ typedef struct ide_tape_obj { | |||
172 | struct kref kref; | 172 | struct kref kref; |
173 | 173 | ||
174 | /* | 174 | /* |
175 | * pc points to the current processed packet command. | ||
176 | * | ||
177 | * failed_pc points to the last failed packet command, or contains | 175 | * failed_pc points to the last failed packet command, or contains |
178 | * NULL if we do not need to retry any packet command. This is | 176 | * NULL if we do not need to retry any packet command. This is |
179 | * required since an additional packet command is needed before the | 177 | * required since an additional packet command is needed before the |
180 | * retry, to get detailed information on what went wrong. | 178 | * retry, to get detailed information on what went wrong. |
181 | */ | 179 | */ |
182 | /* Current packet command */ | ||
183 | struct ide_atapi_pc *pc; | ||
184 | /* Last failed packet command */ | 180 | /* Last failed packet command */ |
185 | struct ide_atapi_pc *failed_pc; | 181 | struct ide_atapi_pc *failed_pc; |
186 | /* used by REQ_IDETAPE_{READ,WRITE} requests */ | 182 | /* used by REQ_IDETAPE_{READ,WRITE} requests */ |
@@ -527,7 +523,7 @@ static void ide_tape_handle_dsc(ide_drive_t *); | |||
527 | static void ide_tape_callback(ide_drive_t *drive, int dsc) | 523 | static void ide_tape_callback(ide_drive_t *drive, int dsc) |
528 | { | 524 | { |
529 | idetape_tape_t *tape = drive->driver_data; | 525 | idetape_tape_t *tape = drive->driver_data; |
530 | struct ide_atapi_pc *pc = tape->pc; | 526 | struct ide_atapi_pc *pc = drive->pc; |
531 | int uptodate = pc->error ? 0 : 1; | 527 | int uptodate = pc->error ? 0 : 1; |
532 | 528 | ||
533 | debug_log(DBG_PROCS, "Enter %s\n", __func__); | 529 | debug_log(DBG_PROCS, "Enter %s\n", __func__); |
@@ -563,7 +559,7 @@ static void ide_tape_callback(ide_drive_t *drive, int dsc) | |||
563 | if (pc->error) | 559 | if (pc->error) |
564 | uptodate = pc->error; | 560 | uptodate = pc->error; |
565 | } else if (pc->c[0] == READ_POSITION && uptodate) { | 561 | } else if (pc->c[0] == READ_POSITION && uptodate) { |
566 | u8 *readpos = tape->pc->buf; | 562 | u8 *readpos = pc->buf; |
567 | 563 | ||
568 | debug_log(DBG_SENSE, "BOP - %s\n", | 564 | debug_log(DBG_SENSE, "BOP - %s\n", |
569 | (readpos[0] & 0x80) ? "Yes" : "No"); | 565 | (readpos[0] & 0x80) ? "Yes" : "No"); |
@@ -659,9 +655,7 @@ static int ide_tape_io_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc, | |||
659 | */ | 655 | */ |
660 | static ide_startstop_t idetape_pc_intr(ide_drive_t *drive) | 656 | static ide_startstop_t idetape_pc_intr(ide_drive_t *drive) |
661 | { | 657 | { |
662 | idetape_tape_t *tape = drive->driver_data; | 658 | return ide_pc_intr(drive, idetape_pc_intr, WAIT_TAPE_CMD, |
663 | |||
664 | return ide_pc_intr(drive, tape->pc, idetape_pc_intr, WAIT_TAPE_CMD, | ||
665 | NULL, idetape_update_buffers, idetape_retry_pc, | 659 | NULL, idetape_update_buffers, idetape_retry_pc, |
666 | ide_tape_io_buffers); | 660 | ide_tape_io_buffers); |
667 | } | 661 | } |
@@ -669,7 +663,7 @@ static ide_startstop_t idetape_pc_intr(ide_drive_t *drive) | |||
669 | /* | 663 | /* |
670 | * Packet Command Interface | 664 | * Packet Command Interface |
671 | * | 665 | * |
672 | * The current Packet Command is available in tape->pc, and will not change | 666 | * The current Packet Command is available in drive->pc, and will not change |
673 | * until we finish handling it. Each packet command is associated with a | 667 | * until we finish handling it. Each packet command is associated with a |
674 | * callback function that will be called when the command is finished. | 668 | * callback function that will be called when the command is finished. |
675 | * | 669 | * |
@@ -704,10 +698,7 @@ static ide_startstop_t idetape_pc_intr(ide_drive_t *drive) | |||
704 | */ | 698 | */ |
705 | static ide_startstop_t idetape_transfer_pc(ide_drive_t *drive) | 699 | static ide_startstop_t idetape_transfer_pc(ide_drive_t *drive) |
706 | { | 700 | { |
707 | idetape_tape_t *tape = drive->driver_data; | 701 | return ide_transfer_pc(drive, idetape_pc_intr, WAIT_TAPE_CMD, NULL); |
708 | |||
709 | return ide_transfer_pc(drive, tape->pc, idetape_pc_intr, | ||
710 | WAIT_TAPE_CMD, NULL); | ||
711 | } | 702 | } |
712 | 703 | ||
713 | static ide_startstop_t idetape_issue_pc(ide_drive_t *drive, | 704 | static ide_startstop_t idetape_issue_pc(ide_drive_t *drive, |
@@ -715,7 +706,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive, | |||
715 | { | 706 | { |
716 | idetape_tape_t *tape = drive->driver_data; | 707 | idetape_tape_t *tape = drive->driver_data; |
717 | 708 | ||
718 | if (tape->pc->c[0] == REQUEST_SENSE && | 709 | if (drive->pc->c[0] == REQUEST_SENSE && |
719 | pc->c[0] == REQUEST_SENSE) { | 710 | pc->c[0] == REQUEST_SENSE) { |
720 | printk(KERN_ERR "ide-tape: possible ide-tape.c bug - " | 711 | printk(KERN_ERR "ide-tape: possible ide-tape.c bug - " |
721 | "Two request sense in serial were issued\n"); | 712 | "Two request sense in serial were issued\n"); |
@@ -723,8 +714,9 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive, | |||
723 | 714 | ||
724 | if (tape->failed_pc == NULL && pc->c[0] != REQUEST_SENSE) | 715 | if (tape->failed_pc == NULL && pc->c[0] != REQUEST_SENSE) |
725 | tape->failed_pc = pc; | 716 | tape->failed_pc = pc; |
717 | |||
726 | /* Set the current packet command */ | 718 | /* Set the current packet command */ |
727 | tape->pc = pc; | 719 | drive->pc = pc; |
728 | 720 | ||
729 | if (pc->retries > IDETAPE_MAX_PC_RETRIES || | 721 | if (pc->retries > IDETAPE_MAX_PC_RETRIES || |
730 | (pc->flags & PC_FLAG_ABORT)) { | 722 | (pc->flags & PC_FLAG_ABORT)) { |
@@ -755,8 +747,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive, | |||
755 | 747 | ||
756 | pc->retries++; | 748 | pc->retries++; |
757 | 749 | ||
758 | return ide_issue_pc(drive, pc, idetape_transfer_pc, | 750 | return ide_issue_pc(drive, idetape_transfer_pc, WAIT_TAPE_CMD, NULL); |
759 | WAIT_TAPE_CMD, NULL); | ||
760 | } | 751 | } |
761 | 752 | ||
762 | /* A mode sense command is used to "sense" tape parameters. */ | 753 | /* A mode sense command is used to "sense" tape parameters. */ |
@@ -790,7 +781,7 @@ static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive) | |||
790 | { | 781 | { |
791 | ide_hwif_t *hwif = drive->hwif; | 782 | ide_hwif_t *hwif = drive->hwif; |
792 | idetape_tape_t *tape = drive->driver_data; | 783 | idetape_tape_t *tape = drive->driver_data; |
793 | struct ide_atapi_pc *pc = tape->pc; | 784 | struct ide_atapi_pc *pc = drive->pc; |
794 | u8 stat; | 785 | u8 stat; |
795 | 786 | ||
796 | stat = hwif->tp_ops->read_status(hwif); | 787 | stat = hwif->tp_ops->read_status(hwif); |
@@ -867,7 +858,7 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, | |||
867 | } | 858 | } |
868 | 859 | ||
869 | /* Retry a failed packet command */ | 860 | /* Retry a failed packet command */ |
870 | if (tape->failed_pc && tape->pc->c[0] == REQUEST_SENSE) { | 861 | if (tape->failed_pc && drive->pc->c[0] == REQUEST_SENSE) { |
871 | pc = tape->failed_pc; | 862 | pc = tape->failed_pc; |
872 | goto out; | 863 | goto out; |
873 | } | 864 | } |