diff options
Diffstat (limited to 'drivers/ide')
-rw-r--r-- | drivers/ide/ide-tape.c | 62 |
1 files changed, 32 insertions, 30 deletions
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 8b6af1e0ed2d..73f06c859301 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -184,11 +184,13 @@ enum { | |||
184 | /* | 184 | /* |
185 | * For general magnetic tape device compatibility. | 185 | * For general magnetic tape device compatibility. |
186 | */ | 186 | */ |
187 | typedef enum { | 187 | |
188 | idetape_direction_none, | 188 | /* tape directions */ |
189 | idetape_direction_read, | 189 | enum { |
190 | idetape_direction_write | 190 | IDETAPE_DIR_NONE = (1 << 0), |
191 | } idetape_chrdev_direction_t; | 191 | IDETAPE_DIR_READ = (1 << 1), |
192 | IDETAPE_DIR_WRITE = (1 << 2), | ||
193 | }; | ||
192 | 194 | ||
193 | struct idetape_bh { | 195 | struct idetape_bh { |
194 | u32 b_size; | 196 | u32 b_size; |
@@ -324,7 +326,7 @@ typedef struct ide_tape_obj { | |||
324 | /* device name */ | 326 | /* device name */ |
325 | char name[4]; | 327 | char name[4]; |
326 | /* Current character device data transfer direction */ | 328 | /* Current character device data transfer direction */ |
327 | idetape_chrdev_direction_t chrdev_direction; | 329 | u8 chrdev_dir; |
328 | 330 | ||
329 | /* | 331 | /* |
330 | * Device information | 332 | * Device information |
@@ -1916,7 +1918,7 @@ static void idetape_init_merge_stage (idetape_tape_t *tape) | |||
1916 | struct idetape_bh *bh = tape->merge_stage->bh; | 1918 | struct idetape_bh *bh = tape->merge_stage->bh; |
1917 | 1919 | ||
1918 | tape->bh = bh; | 1920 | tape->bh = bh; |
1919 | if (tape->chrdev_direction == idetape_direction_write) | 1921 | if (tape->chrdev_dir == IDETAPE_DIR_WRITE) |
1920 | atomic_set(&bh->b_count, 0); | 1922 | atomic_set(&bh->b_count, 0); |
1921 | else { | 1923 | else { |
1922 | tape->b_data = bh->b_data; | 1924 | tape->b_data = bh->b_data; |
@@ -2186,7 +2188,7 @@ static int __idetape_discard_read_pipeline (ide_drive_t *drive) | |||
2186 | unsigned long flags; | 2188 | unsigned long flags; |
2187 | int cnt; | 2189 | int cnt; |
2188 | 2190 | ||
2189 | if (tape->chrdev_direction != idetape_direction_read) | 2191 | if (tape->chrdev_dir != IDETAPE_DIR_READ) |
2190 | return 0; | 2192 | return 0; |
2191 | 2193 | ||
2192 | /* Remove merge stage. */ | 2194 | /* Remove merge stage. */ |
@@ -2201,7 +2203,7 @@ static int __idetape_discard_read_pipeline (ide_drive_t *drive) | |||
2201 | 2203 | ||
2202 | /* Clear pipeline flags. */ | 2204 | /* Clear pipeline flags. */ |
2203 | clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags); | 2205 | clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags); |
2204 | tape->chrdev_direction = idetape_direction_none; | 2206 | tape->chrdev_dir = IDETAPE_DIR_NONE; |
2205 | 2207 | ||
2206 | /* Remove pipeline stages. */ | 2208 | /* Remove pipeline stages. */ |
2207 | if (tape->first_stage == NULL) | 2209 | if (tape->first_stage == NULL) |
@@ -2241,7 +2243,7 @@ static int idetape_position_tape (ide_drive_t *drive, unsigned int block, u8 par | |||
2241 | int retval; | 2243 | int retval; |
2242 | idetape_pc_t pc; | 2244 | idetape_pc_t pc; |
2243 | 2245 | ||
2244 | if (tape->chrdev_direction == idetape_direction_read) | 2246 | if (tape->chrdev_dir == IDETAPE_DIR_READ) |
2245 | __idetape_discard_read_pipeline(drive); | 2247 | __idetape_discard_read_pipeline(drive); |
2246 | idetape_wait_ready(drive, 60 * 5 * HZ); | 2248 | idetape_wait_ready(drive, 60 * 5 * HZ); |
2247 | idetape_create_locate_cmd(drive, &pc, block, partition, skip); | 2249 | idetape_create_locate_cmd(drive, &pc, block, partition, skip); |
@@ -2468,7 +2470,7 @@ static void idetape_empty_write_pipeline (ide_drive_t *drive) | |||
2468 | int blocks, min; | 2470 | int blocks, min; |
2469 | struct idetape_bh *bh; | 2471 | struct idetape_bh *bh; |
2470 | 2472 | ||
2471 | if (tape->chrdev_direction != idetape_direction_write) { | 2473 | if (tape->chrdev_dir != IDETAPE_DIR_WRITE) { |
2472 | printk(KERN_ERR "ide-tape: bug: Trying to empty write pipeline, but we are not writing.\n"); | 2474 | printk(KERN_ERR "ide-tape: bug: Trying to empty write pipeline, but we are not writing.\n"); |
2473 | return; | 2475 | return; |
2474 | } | 2476 | } |
@@ -2511,7 +2513,7 @@ static void idetape_empty_write_pipeline (ide_drive_t *drive) | |||
2511 | tape->merge_stage = NULL; | 2513 | tape->merge_stage = NULL; |
2512 | } | 2514 | } |
2513 | clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags); | 2515 | clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags); |
2514 | tape->chrdev_direction = idetape_direction_none; | 2516 | tape->chrdev_dir = IDETAPE_DIR_NONE; |
2515 | 2517 | ||
2516 | /* | 2518 | /* |
2517 | * On the next backup, perform the feedback loop again. | 2519 | * On the next backup, perform the feedback loop again. |
@@ -2555,8 +2557,8 @@ static int idetape_initiate_read (ide_drive_t *drive, int max_stages) | |||
2555 | u16 blocks = *(u16 *)&tape->caps[12]; | 2557 | u16 blocks = *(u16 *)&tape->caps[12]; |
2556 | 2558 | ||
2557 | /* Initialize read operation */ | 2559 | /* Initialize read operation */ |
2558 | if (tape->chrdev_direction != idetape_direction_read) { | 2560 | if (tape->chrdev_dir != IDETAPE_DIR_READ) { |
2559 | if (tape->chrdev_direction == idetape_direction_write) { | 2561 | if (tape->chrdev_dir == IDETAPE_DIR_WRITE) { |
2560 | idetape_empty_write_pipeline(drive); | 2562 | idetape_empty_write_pipeline(drive); |
2561 | idetape_flush_tape_buffers(drive); | 2563 | idetape_flush_tape_buffers(drive); |
2562 | } | 2564 | } |
@@ -2566,7 +2568,7 @@ static int idetape_initiate_read (ide_drive_t *drive, int max_stages) | |||
2566 | } | 2568 | } |
2567 | if ((tape->merge_stage = __idetape_kmalloc_stage(tape, 0, 0)) == NULL) | 2569 | if ((tape->merge_stage = __idetape_kmalloc_stage(tape, 0, 0)) == NULL) |
2568 | return -ENOMEM; | 2570 | return -ENOMEM; |
2569 | tape->chrdev_direction = idetape_direction_read; | 2571 | tape->chrdev_dir = IDETAPE_DIR_READ; |
2570 | 2572 | ||
2571 | /* | 2573 | /* |
2572 | * Issue a read 0 command to ensure that DSC handshake | 2574 | * Issue a read 0 command to ensure that DSC handshake |
@@ -2580,7 +2582,7 @@ static int idetape_initiate_read (ide_drive_t *drive, int max_stages) | |||
2580 | if (bytes_read < 0) { | 2582 | if (bytes_read < 0) { |
2581 | __idetape_kfree_stage(tape->merge_stage); | 2583 | __idetape_kfree_stage(tape->merge_stage); |
2582 | tape->merge_stage = NULL; | 2584 | tape->merge_stage = NULL; |
2583 | tape->chrdev_direction = idetape_direction_none; | 2585 | tape->chrdev_dir = IDETAPE_DIR_NONE; |
2584 | return bytes_read; | 2586 | return bytes_read; |
2585 | } | 2587 | } |
2586 | } | 2588 | } |
@@ -2801,7 +2803,7 @@ static int idetape_space_over_filemarks (ide_drive_t *drive,short mt_op,int mt_c | |||
2801 | mt_count = - mt_count; | 2803 | mt_count = - mt_count; |
2802 | } | 2804 | } |
2803 | 2805 | ||
2804 | if (tape->chrdev_direction == idetape_direction_read) { | 2806 | if (tape->chrdev_dir == IDETAPE_DIR_READ) { |
2805 | /* | 2807 | /* |
2806 | * We have a read-ahead buffer. Scan it for crossed | 2808 | * We have a read-ahead buffer. Scan it for crossed |
2807 | * filemarks. | 2809 | * filemarks. |
@@ -2891,7 +2893,7 @@ static ssize_t idetape_chrdev_read (struct file *file, char __user *buf, | |||
2891 | 2893 | ||
2892 | debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count); | 2894 | debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count); |
2893 | 2895 | ||
2894 | if (tape->chrdev_direction != idetape_direction_read) { | 2896 | if (tape->chrdev_dir != IDETAPE_DIR_READ) { |
2895 | if (test_bit(IDETAPE_DETECT_BS, &tape->flags)) | 2897 | if (test_bit(IDETAPE_DETECT_BS, &tape->flags)) |
2896 | if (count > tape->tape_block_size && | 2898 | if (count > tape->tape_block_size && |
2897 | (count % tape->tape_block_size) == 0) | 2899 | (count % tape->tape_block_size) == 0) |
@@ -2956,8 +2958,8 @@ static ssize_t idetape_chrdev_write (struct file *file, const char __user *buf, | |||
2956 | debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count); | 2958 | debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count); |
2957 | 2959 | ||
2958 | /* Initialize write operation */ | 2960 | /* Initialize write operation */ |
2959 | if (tape->chrdev_direction != idetape_direction_write) { | 2961 | if (tape->chrdev_dir != IDETAPE_DIR_WRITE) { |
2960 | if (tape->chrdev_direction == idetape_direction_read) | 2962 | if (tape->chrdev_dir == IDETAPE_DIR_READ) |
2961 | idetape_discard_read_pipeline(drive, 1); | 2963 | idetape_discard_read_pipeline(drive, 1); |
2962 | if (tape->merge_stage || tape->merge_stage_size) { | 2964 | if (tape->merge_stage || tape->merge_stage_size) { |
2963 | printk(KERN_ERR "ide-tape: merge_stage_size " | 2965 | printk(KERN_ERR "ide-tape: merge_stage_size " |
@@ -2966,7 +2968,7 @@ static ssize_t idetape_chrdev_write (struct file *file, const char __user *buf, | |||
2966 | } | 2968 | } |
2967 | if ((tape->merge_stage = __idetape_kmalloc_stage(tape, 0, 0)) == NULL) | 2969 | if ((tape->merge_stage = __idetape_kmalloc_stage(tape, 0, 0)) == NULL) |
2968 | return -ENOMEM; | 2970 | return -ENOMEM; |
2969 | tape->chrdev_direction = idetape_direction_write; | 2971 | tape->chrdev_dir = IDETAPE_DIR_WRITE; |
2970 | idetape_init_merge_stage(tape); | 2972 | idetape_init_merge_stage(tape); |
2971 | 2973 | ||
2972 | /* | 2974 | /* |
@@ -2981,7 +2983,7 @@ static ssize_t idetape_chrdev_write (struct file *file, const char __user *buf, | |||
2981 | if (retval < 0) { | 2983 | if (retval < 0) { |
2982 | __idetape_kfree_stage(tape->merge_stage); | 2984 | __idetape_kfree_stage(tape->merge_stage); |
2983 | tape->merge_stage = NULL; | 2985 | tape->merge_stage = NULL; |
2984 | tape->chrdev_direction = idetape_direction_none; | 2986 | tape->chrdev_dir = IDETAPE_DIR_NONE; |
2985 | return retval; | 2987 | return retval; |
2986 | } | 2988 | } |
2987 | } | 2989 | } |
@@ -3187,7 +3189,7 @@ static int idetape_chrdev_ioctl(struct inode *inode, struct file *file, | |||
3187 | debug_log(DBG_CHRDEV, "Enter %s, cmd=%u\n", __func__, cmd); | 3189 | debug_log(DBG_CHRDEV, "Enter %s, cmd=%u\n", __func__, cmd); |
3188 | 3190 | ||
3189 | tape->restart_speed_control_req = 1; | 3191 | tape->restart_speed_control_req = 1; |
3190 | if (tape->chrdev_direction == idetape_direction_write) { | 3192 | if (tape->chrdev_dir == IDETAPE_DIR_WRITE) { |
3191 | idetape_empty_write_pipeline(drive); | 3193 | idetape_empty_write_pipeline(drive); |
3192 | idetape_flush_tape_buffers(drive); | 3194 | idetape_flush_tape_buffers(drive); |
3193 | } | 3195 | } |
@@ -3218,7 +3220,7 @@ static int idetape_chrdev_ioctl(struct inode *inode, struct file *file, | |||
3218 | return -EFAULT; | 3220 | return -EFAULT; |
3219 | return 0; | 3221 | return 0; |
3220 | default: | 3222 | default: |
3221 | if (tape->chrdev_direction == idetape_direction_read) | 3223 | if (tape->chrdev_dir == IDETAPE_DIR_READ) |
3222 | idetape_discard_read_pipeline(drive, 1); | 3224 | idetape_discard_read_pipeline(drive, 1); |
3223 | return idetape_blkdev_ioctl(drive, cmd, arg); | 3225 | return idetape_blkdev_ioctl(drive, cmd, arg); |
3224 | } | 3226 | } |
@@ -3296,7 +3298,7 @@ static int idetape_chrdev_open (struct inode *inode, struct file *filp) | |||
3296 | if (!test_bit(IDETAPE_ADDRESS_VALID, &tape->flags)) | 3298 | if (!test_bit(IDETAPE_ADDRESS_VALID, &tape->flags)) |
3297 | (void)idetape_rewind_tape(drive); | 3299 | (void)idetape_rewind_tape(drive); |
3298 | 3300 | ||
3299 | if (tape->chrdev_direction != idetape_direction_read) | 3301 | if (tape->chrdev_dir != IDETAPE_DIR_READ) |
3300 | clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags); | 3302 | clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags); |
3301 | 3303 | ||
3302 | /* Read block size and write protect status from drive. */ | 3304 | /* Read block size and write protect status from drive. */ |
@@ -3321,7 +3323,7 @@ static int idetape_chrdev_open (struct inode *inode, struct file *filp) | |||
3321 | /* | 3323 | /* |
3322 | * Lock the tape drive door so user can't eject. | 3324 | * Lock the tape drive door so user can't eject. |
3323 | */ | 3325 | */ |
3324 | if (tape->chrdev_direction == idetape_direction_none) { | 3326 | if (tape->chrdev_dir == IDETAPE_DIR_NONE) { |
3325 | if (idetape_create_prevent_cmd(drive, &pc, 1)) { | 3327 | if (idetape_create_prevent_cmd(drive, &pc, 1)) { |
3326 | if (!idetape_queue_pc_tail(drive, &pc)) { | 3328 | if (!idetape_queue_pc_tail(drive, &pc)) { |
3327 | if (tape->door_locked != DOOR_EXPLICITLY_LOCKED) | 3329 | if (tape->door_locked != DOOR_EXPLICITLY_LOCKED) |
@@ -3369,9 +3371,9 @@ static int idetape_chrdev_release (struct inode *inode, struct file *filp) | |||
3369 | 3371 | ||
3370 | debug_log(DBG_CHRDEV, "Enter %s\n", __func__); | 3372 | debug_log(DBG_CHRDEV, "Enter %s\n", __func__); |
3371 | 3373 | ||
3372 | if (tape->chrdev_direction == idetape_direction_write) | 3374 | if (tape->chrdev_dir == IDETAPE_DIR_WRITE) |
3373 | idetape_write_release(drive, minor); | 3375 | idetape_write_release(drive, minor); |
3374 | if (tape->chrdev_direction == idetape_direction_read) { | 3376 | if (tape->chrdev_dir == IDETAPE_DIR_READ) { |
3375 | if (minor < 128) | 3377 | if (minor < 128) |
3376 | idetape_discard_read_pipeline(drive, 1); | 3378 | idetape_discard_read_pipeline(drive, 1); |
3377 | else | 3379 | else |
@@ -3383,7 +3385,7 @@ static int idetape_chrdev_release (struct inode *inode, struct file *filp) | |||
3383 | } | 3385 | } |
3384 | if (minor < 128 && test_bit(IDETAPE_MEDIUM_PRESENT, &tape->flags)) | 3386 | if (minor < 128 && test_bit(IDETAPE_MEDIUM_PRESENT, &tape->flags)) |
3385 | (void) idetape_rewind_tape(drive); | 3387 | (void) idetape_rewind_tape(drive); |
3386 | if (tape->chrdev_direction == idetape_direction_none) { | 3388 | if (tape->chrdev_dir == IDETAPE_DIR_NONE) { |
3387 | if (tape->door_locked == DOOR_LOCKED) { | 3389 | if (tape->door_locked == DOOR_LOCKED) { |
3388 | if (idetape_create_prevent_cmd(drive, &pc, 0)) { | 3390 | if (idetape_create_prevent_cmd(drive, &pc, 0)) { |
3389 | if (!idetape_queue_pc_tail(drive, &pc)) | 3391 | if (!idetape_queue_pc_tail(drive, &pc)) |
@@ -3577,7 +3579,7 @@ static void idetape_setup (ide_drive_t *drive, idetape_tape_t *tape, int minor) | |||
3577 | tape->name[0] = 'h'; | 3579 | tape->name[0] = 'h'; |
3578 | tape->name[1] = 't'; | 3580 | tape->name[1] = 't'; |
3579 | tape->name[2] = '0' + minor; | 3581 | tape->name[2] = '0' + minor; |
3580 | tape->chrdev_direction = idetape_direction_none; | 3582 | tape->chrdev_dir = IDETAPE_DIR_NONE; |
3581 | tape->pc = tape->pc_stack; | 3583 | tape->pc = tape->pc_stack; |
3582 | tape->max_insert_speed = 10000; | 3584 | tape->max_insert_speed = 10000; |
3583 | tape->speed_control = 1; | 3585 | tape->speed_control = 1; |