diff options
| -rw-r--r-- | drivers/ide/ide-atapi.c | 20 | ||||
| -rw-r--r-- | drivers/ide/ide-floppy.c | 21 | ||||
| -rw-r--r-- | drivers/ide/ide-tape.c | 36 | ||||
| -rw-r--r-- | include/linux/ide.h | 16 |
4 files changed, 38 insertions, 55 deletions
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index 8f0842ce77f5..da71bfce92e8 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c | |||
| @@ -119,6 +119,26 @@ void ide_init_pc(struct ide_atapi_pc *pc) | |||
| 119 | } | 119 | } |
| 120 | EXPORT_SYMBOL_GPL(ide_init_pc); | 120 | EXPORT_SYMBOL_GPL(ide_init_pc); |
| 121 | 121 | ||
| 122 | /* | ||
| 123 | * Generate a new packet command request in front of the request queue, before | ||
| 124 | * the current request, so that it will be processed immediately, on the next | ||
| 125 | * pass through the driver. | ||
| 126 | */ | ||
| 127 | void ide_queue_pc_head(ide_drive_t *drive, struct gendisk *disk, | ||
| 128 | struct ide_atapi_pc *pc, struct request *rq) | ||
| 129 | { | ||
| 130 | blk_rq_init(NULL, rq); | ||
| 131 | rq->cmd_type = REQ_TYPE_SPECIAL; | ||
| 132 | rq->cmd_flags |= REQ_PREEMPT; | ||
| 133 | rq->buffer = (char *)pc; | ||
| 134 | rq->rq_disk = disk; | ||
| 135 | memcpy(rq->cmd, pc->c, 12); | ||
| 136 | if (drive->media == ide_tape) | ||
| 137 | rq->cmd[13] = REQ_IDETAPE_PC1; | ||
| 138 | ide_do_drive_cmd(drive, rq); | ||
| 139 | } | ||
| 140 | EXPORT_SYMBOL_GPL(ide_queue_pc_head); | ||
| 141 | |||
| 122 | /* TODO: unify the code thus making some arguments go away */ | 142 | /* TODO: unify the code thus making some arguments go away */ |
| 123 | ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc, | 143 | ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc, |
| 124 | ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry, | 144 | ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry, |
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index e04eaa49a8bf..ddce28e77a4e 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
| @@ -212,25 +212,6 @@ static void idefloppy_update_buffers(ide_drive_t *drive, | |||
| 212 | idefloppy_end_request(drive, 1, 0); | 212 | idefloppy_end_request(drive, 1, 0); |
| 213 | } | 213 | } |
| 214 | 214 | ||
| 215 | /* | ||
| 216 | * Generate a new packet command request in front of the request queue, before | ||
| 217 | * the current request so that it will be processed immediately, on the next | ||
| 218 | * pass through the driver. | ||
| 219 | */ | ||
| 220 | static void idefloppy_queue_pc_head(ide_drive_t *drive, struct ide_atapi_pc *pc, | ||
| 221 | struct request *rq) | ||
| 222 | { | ||
| 223 | struct ide_floppy_obj *floppy = drive->driver_data; | ||
| 224 | |||
| 225 | blk_rq_init(NULL, rq); | ||
| 226 | rq->buffer = (char *) pc; | ||
| 227 | rq->cmd_type = REQ_TYPE_SPECIAL; | ||
| 228 | rq->cmd_flags |= REQ_PREEMPT; | ||
| 229 | rq->rq_disk = floppy->disk; | ||
| 230 | memcpy(rq->cmd, pc->c, 12); | ||
| 231 | ide_do_drive_cmd(drive, rq); | ||
| 232 | } | ||
| 233 | |||
| 234 | static void ide_floppy_callback(ide_drive_t *drive) | 215 | static void ide_floppy_callback(ide_drive_t *drive) |
| 235 | { | 216 | { |
| 236 | idefloppy_floppy_t *floppy = drive->driver_data; | 217 | idefloppy_floppy_t *floppy = drive->driver_data; |
| @@ -288,7 +269,7 @@ static void idefloppy_retry_pc(ide_drive_t *drive) | |||
| 288 | 269 | ||
| 289 | (void)ide_read_error(drive); | 270 | (void)ide_read_error(drive); |
| 290 | idefloppy_create_request_sense_cmd(pc); | 271 | idefloppy_create_request_sense_cmd(pc); |
| 291 | idefloppy_queue_pc_head(drive, pc, rq); | 272 | ide_queue_pc_head(drive, floppy->disk, pc, rq); |
| 292 | } | 273 | } |
| 293 | 274 | ||
| 294 | /* The usual interrupt handler called during a packet command. */ | 275 | /* The usual interrupt handler called during a packet command. */ |
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 5c879fbcca87..7103b98eb53a 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
| @@ -159,20 +159,6 @@ struct idetape_bh { | |||
| 159 | #define IDETAPE_LU_RETENSION_MASK 2 | 159 | #define IDETAPE_LU_RETENSION_MASK 2 |
| 160 | #define IDETAPE_LU_EOT_MASK 4 | 160 | #define IDETAPE_LU_EOT_MASK 4 |
| 161 | 161 | ||
| 162 | /* | ||
| 163 | * Special requests for our block device strategy routine. | ||
| 164 | * | ||
| 165 | * In order to service a character device command, we add special requests to | ||
| 166 | * the tail of our block device request queue and wait for their completion. | ||
| 167 | */ | ||
| 168 | |||
| 169 | enum { | ||
| 170 | REQ_IDETAPE_PC1 = (1 << 0), /* packet command (first stage) */ | ||
| 171 | REQ_IDETAPE_PC2 = (1 << 1), /* packet command (second stage) */ | ||
| 172 | REQ_IDETAPE_READ = (1 << 2), | ||
| 173 | REQ_IDETAPE_WRITE = (1 << 3), | ||
| 174 | }; | ||
| 175 | |||
| 176 | /* Error codes returned in rq->errors to the higher part of the driver. */ | 162 | /* Error codes returned in rq->errors to the higher part of the driver. */ |
| 177 | #define IDETAPE_ERROR_GENERAL 101 | 163 | #define IDETAPE_ERROR_GENERAL 101 |
| 178 | #define IDETAPE_ERROR_FILEMARK 102 | 164 | #define IDETAPE_ERROR_FILEMARK 102 |
| @@ -613,26 +599,6 @@ static void idetape_create_request_sense_cmd(struct ide_atapi_pc *pc) | |||
| 613 | } | 599 | } |
| 614 | 600 | ||
| 615 | /* | 601 | /* |
| 616 | * Generate a new packet command request in front of the request queue, before | ||
| 617 | * the current request, so that it will be processed immediately, on the next | ||
| 618 | * pass through the driver. | ||
| 619 | */ | ||
| 620 | static void idetape_queue_pc_head(ide_drive_t *drive, struct ide_atapi_pc *pc, | ||
| 621 | struct request *rq) | ||
| 622 | { | ||
| 623 | struct ide_tape_obj *tape = drive->driver_data; | ||
| 624 | |||
| 625 | blk_rq_init(NULL, rq); | ||
| 626 | rq->cmd_type = REQ_TYPE_SPECIAL; | ||
| 627 | rq->cmd_flags |= REQ_PREEMPT; | ||
| 628 | rq->buffer = (char *) pc; | ||
| 629 | rq->rq_disk = tape->disk; | ||
| 630 | memcpy(rq->cmd, pc->c, 12); | ||
| 631 | rq->cmd[13] = REQ_IDETAPE_PC1; | ||
| 632 | ide_do_drive_cmd(drive, rq); | ||
| 633 | } | ||
| 634 | |||
| 635 | /* | ||
| 636 | * idetape_retry_pc is called when an error was detected during the | 602 | * idetape_retry_pc is called when an error was detected during the |
| 637 | * last packet command. We queue a request sense packet command in | 603 | * last packet command. We queue a request sense packet command in |
| 638 | * the head of the request list. | 604 | * the head of the request list. |
| @@ -646,7 +612,7 @@ static void idetape_retry_pc(ide_drive_t *drive) | |||
| 646 | (void)ide_read_error(drive); | 612 | (void)ide_read_error(drive); |
| 647 | idetape_create_request_sense_cmd(pc); | 613 | idetape_create_request_sense_cmd(pc); |
| 648 | set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags); | 614 | set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags); |
| 649 | idetape_queue_pc_head(drive, pc, rq); | 615 | ide_queue_pc_head(drive, tape->disk, pc, rq); |
| 650 | } | 616 | } |
| 651 | 617 | ||
| 652 | /* | 618 | /* |
diff --git a/include/linux/ide.h b/include/linux/ide.h index bba2f73b99a0..1bd49784e4da 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
| @@ -1121,6 +1121,22 @@ int ide_check_atapi_device(ide_drive_t *, const char *); | |||
| 1121 | 1121 | ||
| 1122 | void ide_init_pc(struct ide_atapi_pc *); | 1122 | void ide_init_pc(struct ide_atapi_pc *); |
| 1123 | 1123 | ||
| 1124 | /* | ||
| 1125 | * Special requests for ide-tape block device strategy routine. | ||
| 1126 | * | ||
| 1127 | * In order to service a character device command, we add special requests to | ||
| 1128 | * the tail of our block device request queue and wait for their completion. | ||
| 1129 | */ | ||
| 1130 | enum { | ||
| 1131 | REQ_IDETAPE_PC1 = (1 << 0), /* packet command (first stage) */ | ||
| 1132 | REQ_IDETAPE_PC2 = (1 << 1), /* packet command (second stage) */ | ||
| 1133 | REQ_IDETAPE_READ = (1 << 2), | ||
| 1134 | REQ_IDETAPE_WRITE = (1 << 3), | ||
| 1135 | }; | ||
| 1136 | |||
| 1137 | void ide_queue_pc_head(ide_drive_t *, struct gendisk *, struct ide_atapi_pc *, | ||
| 1138 | struct request *); | ||
| 1139 | |||
| 1124 | ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc, | 1140 | ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc, |
| 1125 | ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry, | 1141 | ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry, |
| 1126 | void (*update_buffers)(ide_drive_t *, struct ide_atapi_pc *), | 1142 | void (*update_buffers)(ide_drive_t *, struct ide_atapi_pc *), |
