aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ide/ide-tape.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
index f43ffb88d844..a6d4e484aaeb 100644
--- a/drivers/ide/ide-tape.c
+++ b/drivers/ide/ide-tape.c
@@ -730,6 +730,7 @@ static void idetape_queue_pc_head(ide_drive_t *drive, struct ide_atapi_pc *pc,
730 rq->cmd_flags |= REQ_PREEMPT; 730 rq->cmd_flags |= REQ_PREEMPT;
731 rq->buffer = (char *) pc; 731 rq->buffer = (char *) pc;
732 rq->rq_disk = tape->disk; 732 rq->rq_disk = tape->disk;
733 memcpy(rq->cmd, pc->c, 12);
733 ide_do_drive_cmd(drive, rq); 734 ide_do_drive_cmd(drive, rq);
734} 735}
735 736
@@ -952,9 +953,12 @@ static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive)
952} 953}
953 954
954static void ide_tape_create_rw_cmd(idetape_tape_t *tape, 955static void ide_tape_create_rw_cmd(idetape_tape_t *tape,
955 struct ide_atapi_pc *pc, unsigned int length, 956 struct ide_atapi_pc *pc, struct request *rq,
956 struct idetape_bh *bh, u8 opcode) 957 u8 opcode)
957{ 958{
959 struct idetape_bh *bh = (struct idetape_bh *)rq->special;
960 unsigned int length = rq->current_nr_sectors;
961
958 idetape_init_pc(pc); 962 idetape_init_pc(pc);
959 put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]); 963 put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]);
960 pc->c[1] = 1; 964 pc->c[1] = 1;
@@ -974,6 +978,8 @@ static void ide_tape_create_rw_cmd(idetape_tape_t *tape,
974 pc->b_data = bh->b_data; 978 pc->b_data = bh->b_data;
975 pc->b_count = atomic_read(&bh->b_count); 979 pc->b_count = atomic_read(&bh->b_count);
976 } 980 }
981
982 memcpy(rq->cmd, pc->c, 12);
977} 983}
978 984
979static ide_startstop_t idetape_do_request(ide_drive_t *drive, 985static ide_startstop_t idetape_do_request(ide_drive_t *drive,
@@ -1051,16 +1057,12 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive,
1051 } 1057 }
1052 if (rq->cmd[13] & REQ_IDETAPE_READ) { 1058 if (rq->cmd[13] & REQ_IDETAPE_READ) {
1053 pc = idetape_next_pc_storage(drive); 1059 pc = idetape_next_pc_storage(drive);
1054 ide_tape_create_rw_cmd(tape, pc, rq->current_nr_sectors, 1060 ide_tape_create_rw_cmd(tape, pc, rq, READ_6);
1055 (struct idetape_bh *)rq->special,
1056 READ_6);
1057 goto out; 1061 goto out;
1058 } 1062 }
1059 if (rq->cmd[13] & REQ_IDETAPE_WRITE) { 1063 if (rq->cmd[13] & REQ_IDETAPE_WRITE) {
1060 pc = idetape_next_pc_storage(drive); 1064 pc = idetape_next_pc_storage(drive);
1061 ide_tape_create_rw_cmd(tape, pc, rq->current_nr_sectors, 1065 ide_tape_create_rw_cmd(tape, pc, rq, WRITE_6);
1062 (struct idetape_bh *)rq->special,
1063 WRITE_6);
1064 goto out; 1066 goto out;
1065 } 1067 }
1066 if (rq->cmd[13] & REQ_IDETAPE_PC1) { 1068 if (rq->cmd[13] & REQ_IDETAPE_PC1) {
@@ -1283,6 +1285,7 @@ static int idetape_queue_pc_tail(ide_drive_t *drive, struct ide_atapi_pc *pc)
1283 rq->cmd_type = REQ_TYPE_SPECIAL; 1285 rq->cmd_type = REQ_TYPE_SPECIAL;
1284 rq->cmd[13] = REQ_IDETAPE_PC1; 1286 rq->cmd[13] = REQ_IDETAPE_PC1;
1285 rq->buffer = (char *)pc; 1287 rq->buffer = (char *)pc;
1288 memcpy(rq->cmd, pc->c, 12);
1286 error = blk_execute_rq(drive->queue, tape->disk, rq, 0); 1289 error = blk_execute_rq(drive->queue, tape->disk, rq, 0);
1287 blk_put_request(rq); 1290 blk_put_request(rq);
1288 return error; 1291 return error;