diff options
| -rw-r--r-- | drivers/ide/ide-tape.c | 45 |
1 files changed, 18 insertions, 27 deletions
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 0afa109ec99a..6e1233bdf3a0 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
| @@ -952,40 +952,29 @@ static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive) | |||
| 952 | return ide_stopped; | 952 | return ide_stopped; |
| 953 | } | 953 | } |
| 954 | 954 | ||
| 955 | static void idetape_create_read_cmd(idetape_tape_t *tape, | 955 | static void ide_tape_create_rw_cmd(idetape_tape_t *tape, |
| 956 | struct ide_atapi_pc *pc, | 956 | struct ide_atapi_pc *pc, unsigned int length, |
| 957 | unsigned int length, struct idetape_bh *bh) | 957 | struct idetape_bh *bh, u8 opcode) |
| 958 | { | 958 | { |
| 959 | idetape_init_pc(pc); | 959 | idetape_init_pc(pc); |
| 960 | pc->c[0] = READ_6; | ||
| 961 | put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]); | 960 | put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]); |
| 962 | pc->c[1] = 1; | 961 | pc->c[1] = 1; |
| 963 | pc->bh = bh; | 962 | pc->bh = bh; |
| 964 | atomic_set(&bh->b_count, 0); | ||
| 965 | pc->buf = NULL; | 963 | pc->buf = NULL; |
| 966 | pc->buf_size = length * tape->blk_size; | 964 | pc->buf_size = length * tape->blk_size; |
| 967 | pc->req_xfer = pc->buf_size; | 965 | pc->req_xfer = pc->buf_size; |
| 968 | if (pc->req_xfer == tape->buffer_size) | 966 | if (pc->req_xfer == tape->buffer_size) |
| 969 | pc->flags |= PC_FLAG_DMA_OK; | 967 | pc->flags |= PC_FLAG_DMA_OK; |
| 970 | } | ||
| 971 | 968 | ||
| 972 | static void idetape_create_write_cmd(idetape_tape_t *tape, | 969 | if (opcode == READ_6) { |
| 973 | struct ide_atapi_pc *pc, | 970 | pc->c[0] = READ_6; |
| 974 | unsigned int length, struct idetape_bh *bh) | 971 | atomic_set(&bh->b_count, 0); |
| 975 | { | 972 | } else if (opcode == WRITE_6) { |
| 976 | idetape_init_pc(pc); | 973 | pc->c[0] = WRITE_6; |
| 977 | pc->c[0] = WRITE_6; | 974 | pc->flags |= PC_FLAG_WRITING; |
| 978 | put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]); | 975 | pc->b_data = bh->b_data; |
| 979 | pc->c[1] = 1; | 976 | pc->b_count = atomic_read(&bh->b_count); |
| 980 | pc->flags |= PC_FLAG_WRITING; | 977 | } |
| 981 | pc->bh = bh; | ||
| 982 | pc->b_data = bh->b_data; | ||
| 983 | pc->b_count = atomic_read(&bh->b_count); | ||
| 984 | pc->buf = NULL; | ||
| 985 | pc->buf_size = length * tape->blk_size; | ||
| 986 | pc->req_xfer = pc->buf_size; | ||
| 987 | if (pc->req_xfer == tape->buffer_size) | ||
| 988 | pc->flags |= PC_FLAG_DMA_OK; | ||
| 989 | } | 978 | } |
| 990 | 979 | ||
| 991 | static ide_startstop_t idetape_do_request(ide_drive_t *drive, | 980 | static ide_startstop_t idetape_do_request(ide_drive_t *drive, |
| @@ -1062,14 +1051,16 @@ static ide_startstop_t idetape_do_request(ide_drive_t *drive, | |||
| 1062 | } | 1051 | } |
| 1063 | if (rq->cmd[0] & REQ_IDETAPE_READ) { | 1052 | if (rq->cmd[0] & REQ_IDETAPE_READ) { |
| 1064 | pc = idetape_next_pc_storage(drive); | 1053 | pc = idetape_next_pc_storage(drive); |
| 1065 | idetape_create_read_cmd(tape, pc, rq->current_nr_sectors, | 1054 | ide_tape_create_rw_cmd(tape, pc, rq->current_nr_sectors, |
| 1066 | (struct idetape_bh *)rq->special); | 1055 | (struct idetape_bh *)rq->special, |
| 1056 | READ_6); | ||
| 1067 | goto out; | 1057 | goto out; |
| 1068 | } | 1058 | } |
| 1069 | if (rq->cmd[0] & REQ_IDETAPE_WRITE) { | 1059 | if (rq->cmd[0] & REQ_IDETAPE_WRITE) { |
| 1070 | pc = idetape_next_pc_storage(drive); | 1060 | pc = idetape_next_pc_storage(drive); |
| 1071 | idetape_create_write_cmd(tape, pc, rq->current_nr_sectors, | 1061 | ide_tape_create_rw_cmd(tape, pc, rq->current_nr_sectors, |
| 1072 | (struct idetape_bh *)rq->special); | 1062 | (struct idetape_bh *)rq->special, |
| 1063 | WRITE_6); | ||
| 1073 | goto out; | 1064 | goto out; |
| 1074 | } | 1065 | } |
| 1075 | if (rq->cmd[0] & REQ_IDETAPE_PC1) { | 1066 | if (rq->cmd[0] & REQ_IDETAPE_PC1) { |
