diff options
Diffstat (limited to 'drivers/ide')
-rw-r--r-- | drivers/ide/ide-tape.c | 142 |
1 files changed, 56 insertions, 86 deletions
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 3d15e8e729ef..6fa6a38d8116 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -260,47 +260,6 @@ typedef struct idetape_packet_command_s { | |||
260 | #define PC_WRITING 5 | 260 | #define PC_WRITING 5 |
261 | 261 | ||
262 | /* | 262 | /* |
263 | * Capabilities and Mechanical Status Page | ||
264 | */ | ||
265 | typedef struct { | ||
266 | unsigned page_code :6; /* Page code - Should be 0x2a */ | ||
267 | __u8 reserved0_6 :1; | ||
268 | __u8 ps :1; /* parameters saveable */ | ||
269 | __u8 page_length; /* Page Length - Should be 0x12 */ | ||
270 | __u8 reserved2, reserved3; | ||
271 | unsigned ro :1; /* Read Only Mode */ | ||
272 | unsigned reserved4_1234 :4; | ||
273 | unsigned sprev :1; /* Supports SPACE in the reverse direction */ | ||
274 | unsigned reserved4_67 :2; | ||
275 | unsigned reserved5_012 :3; | ||
276 | unsigned efmt :1; /* Supports ERASE command initiated formatting */ | ||
277 | unsigned reserved5_4 :1; | ||
278 | unsigned qfa :1; /* Supports the QFA two partition formats */ | ||
279 | unsigned reserved5_67 :2; | ||
280 | unsigned lock :1; /* Supports locking the volume */ | ||
281 | unsigned locked :1; /* The volume is locked */ | ||
282 | unsigned prevent :1; /* The device defaults in the prevent state after power up */ | ||
283 | unsigned eject :1; /* The device can eject the volume */ | ||
284 | __u8 disconnect :1; /* The device can break request > ctl */ | ||
285 | __u8 reserved6_5 :1; | ||
286 | unsigned ecc :1; /* Supports error correction */ | ||
287 | unsigned cmprs :1; /* Supports data compression */ | ||
288 | unsigned reserved7_0 :1; | ||
289 | unsigned blk512 :1; /* Supports 512 bytes block size */ | ||
290 | unsigned blk1024 :1; /* Supports 1024 bytes block size */ | ||
291 | unsigned reserved7_3_6 :4; | ||
292 | unsigned blk32768 :1; /* slowb - the device restricts the byte count for PIO */ | ||
293 | /* transfers for slow buffer memory ??? */ | ||
294 | /* Also 32768 block size in some cases */ | ||
295 | __u16 max_speed; /* Maximum speed supported in KBps */ | ||
296 | __u8 reserved10, reserved11; | ||
297 | __u16 ctl; /* Continuous Transfer Limit in blocks */ | ||
298 | __u16 speed; /* Current Speed, in KBps */ | ||
299 | __u16 buffer_size; /* Buffer Size, in 512 bytes */ | ||
300 | __u8 reserved18, reserved19; | ||
301 | } idetape_capabilities_page_t; | ||
302 | |||
303 | /* | ||
304 | * Block Size Page | 263 | * Block Size Page |
305 | */ | 264 | */ |
306 | typedef struct { | 265 | typedef struct { |
@@ -417,8 +376,9 @@ typedef struct ide_tape_obj { | |||
417 | /* Usually 512 or 1024 bytes */ | 376 | /* Usually 512 or 1024 bytes */ |
418 | unsigned short tape_block_size; | 377 | unsigned short tape_block_size; |
419 | int user_bs_factor; | 378 | int user_bs_factor; |
379 | |||
420 | /* Copy of the tape's Capabilities and Mechanical Page */ | 380 | /* Copy of the tape's Capabilities and Mechanical Page */ |
421 | idetape_capabilities_page_t capabilities; | 381 | u8 caps[20]; |
422 | 382 | ||
423 | /* | 383 | /* |
424 | * Active data transfer request parameters. | 384 | * Active data transfer request parameters. |
@@ -2464,7 +2424,8 @@ static int idetape_create_prevent_cmd (ide_drive_t *drive, idetape_pc_t *pc, int | |||
2464 | { | 2424 | { |
2465 | idetape_tape_t *tape = drive->driver_data; | 2425 | idetape_tape_t *tape = drive->driver_data; |
2466 | 2426 | ||
2467 | if (!tape->capabilities.lock) | 2427 | /* device supports locking according to capabilities page */ |
2428 | if (!(tape->caps[6] & 0x01)) | ||
2468 | return 0; | 2429 | return 0; |
2469 | 2430 | ||
2470 | idetape_init_pc(pc); | 2431 | idetape_init_pc(pc); |
@@ -2850,7 +2811,7 @@ static int idetape_initiate_read (ide_drive_t *drive, int max_stages) | |||
2850 | idetape_stage_t *new_stage; | 2811 | idetape_stage_t *new_stage; |
2851 | struct request rq; | 2812 | struct request rq; |
2852 | int bytes_read; | 2813 | int bytes_read; |
2853 | int blocks = tape->capabilities.ctl; | 2814 | u16 blocks = *(u16 *)&tape->caps[12]; |
2854 | 2815 | ||
2855 | /* Initialize read operation */ | 2816 | /* Initialize read operation */ |
2856 | if (tape->chrdev_direction != idetape_direction_read) { | 2817 | if (tape->chrdev_direction != idetape_direction_read) { |
@@ -3090,11 +3051,12 @@ static int idetape_space_over_filemarks (ide_drive_t *drive,short mt_op,int mt_c | |||
3090 | idetape_pc_t pc; | 3051 | idetape_pc_t pc; |
3091 | unsigned long flags; | 3052 | unsigned long flags; |
3092 | int retval,count=0; | 3053 | int retval,count=0; |
3054 | int sprev = !!(tape->caps[4] & 0x20); | ||
3093 | 3055 | ||
3094 | if (mt_count == 0) | 3056 | if (mt_count == 0) |
3095 | return 0; | 3057 | return 0; |
3096 | if (MTBSF == mt_op || MTBSFM == mt_op) { | 3058 | if (MTBSF == mt_op || MTBSFM == mt_op) { |
3097 | if (!tape->capabilities.sprev) | 3059 | if (!sprev) |
3098 | return -EIO; | 3060 | return -EIO; |
3099 | mt_count = - mt_count; | 3061 | mt_count = - mt_count; |
3100 | } | 3062 | } |
@@ -3148,7 +3110,7 @@ static int idetape_space_over_filemarks (ide_drive_t *drive,short mt_op,int mt_c | |||
3148 | return (idetape_queue_pc_tail(drive, &pc)); | 3110 | return (idetape_queue_pc_tail(drive, &pc)); |
3149 | case MTFSFM: | 3111 | case MTFSFM: |
3150 | case MTBSFM: | 3112 | case MTBSFM: |
3151 | if (!tape->capabilities.sprev) | 3113 | if (!sprev) |
3152 | return (-EIO); | 3114 | return (-EIO); |
3153 | retval = idetape_space_over_filemarks(drive, MTFSF, mt_count-count); | 3115 | retval = idetape_space_over_filemarks(drive, MTFSF, mt_count-count); |
3154 | if (retval) return (retval); | 3116 | if (retval) return (retval); |
@@ -3185,6 +3147,7 @@ static ssize_t idetape_chrdev_read (struct file *file, char __user *buf, | |||
3185 | ide_drive_t *drive = tape->drive; | 3147 | ide_drive_t *drive = tape->drive; |
3186 | ssize_t bytes_read,temp, actually_read = 0, rc; | 3148 | ssize_t bytes_read,temp, actually_read = 0, rc; |
3187 | ssize_t ret = 0; | 3149 | ssize_t ret = 0; |
3150 | u16 ctl = *(u16 *)&tape->caps[12]; | ||
3188 | 3151 | ||
3189 | #if IDETAPE_DEBUG_LOG | 3152 | #if IDETAPE_DEBUG_LOG |
3190 | if (tape->debug_level >= 3) | 3153 | if (tape->debug_level >= 3) |
@@ -3210,7 +3173,7 @@ static ssize_t idetape_chrdev_read (struct file *file, char __user *buf, | |||
3210 | count -= actually_read; | 3173 | count -= actually_read; |
3211 | } | 3174 | } |
3212 | while (count >= tape->stage_size) { | 3175 | while (count >= tape->stage_size) { |
3213 | bytes_read = idetape_add_chrdev_read_request(drive, tape->capabilities.ctl); | 3176 | bytes_read = idetape_add_chrdev_read_request(drive, ctl); |
3214 | if (bytes_read <= 0) | 3177 | if (bytes_read <= 0) |
3215 | goto finish; | 3178 | goto finish; |
3216 | if (idetape_copy_stage_to_user(tape, buf, tape->merge_stage, bytes_read)) | 3179 | if (idetape_copy_stage_to_user(tape, buf, tape->merge_stage, bytes_read)) |
@@ -3220,7 +3183,7 @@ static ssize_t idetape_chrdev_read (struct file *file, char __user *buf, | |||
3220 | actually_read += bytes_read; | 3183 | actually_read += bytes_read; |
3221 | } | 3184 | } |
3222 | if (count) { | 3185 | if (count) { |
3223 | bytes_read = idetape_add_chrdev_read_request(drive, tape->capabilities.ctl); | 3186 | bytes_read = idetape_add_chrdev_read_request(drive, ctl); |
3224 | if (bytes_read <= 0) | 3187 | if (bytes_read <= 0) |
3225 | goto finish; | 3188 | goto finish; |
3226 | temp = min((unsigned long)count, (unsigned long)bytes_read); | 3189 | temp = min((unsigned long)count, (unsigned long)bytes_read); |
@@ -3249,6 +3212,7 @@ static ssize_t idetape_chrdev_write (struct file *file, const char __user *buf, | |||
3249 | ide_drive_t *drive = tape->drive; | 3212 | ide_drive_t *drive = tape->drive; |
3250 | ssize_t actually_written = 0; | 3213 | ssize_t actually_written = 0; |
3251 | ssize_t ret = 0; | 3214 | ssize_t ret = 0; |
3215 | u16 ctl = *(u16 *)&tape->caps[12]; | ||
3252 | 3216 | ||
3253 | /* The drive is write protected. */ | 3217 | /* The drive is write protected. */ |
3254 | if (tape->write_prot) | 3218 | if (tape->write_prot) |
@@ -3310,7 +3274,7 @@ static ssize_t idetape_chrdev_write (struct file *file, const char __user *buf, | |||
3310 | if (tape->merge_stage_size == tape->stage_size) { | 3274 | if (tape->merge_stage_size == tape->stage_size) { |
3311 | ssize_t retval; | 3275 | ssize_t retval; |
3312 | tape->merge_stage_size = 0; | 3276 | tape->merge_stage_size = 0; |
3313 | retval = idetape_add_chrdev_write_request(drive, tape->capabilities.ctl); | 3277 | retval = idetape_add_chrdev_write_request(drive, ctl); |
3314 | if (retval <= 0) | 3278 | if (retval <= 0) |
3315 | return (retval); | 3279 | return (retval); |
3316 | } | 3280 | } |
@@ -3321,7 +3285,7 @@ static ssize_t idetape_chrdev_write (struct file *file, const char __user *buf, | |||
3321 | ret = -EFAULT; | 3285 | ret = -EFAULT; |
3322 | buf += tape->stage_size; | 3286 | buf += tape->stage_size; |
3323 | count -= tape->stage_size; | 3287 | count -= tape->stage_size; |
3324 | retval = idetape_add_chrdev_write_request(drive, tape->capabilities.ctl); | 3288 | retval = idetape_add_chrdev_write_request(drive, ctl); |
3325 | actually_written += tape->stage_size; | 3289 | actually_written += tape->stage_size; |
3326 | if (retval <= 0) | 3290 | if (retval <= 0) |
3327 | return (retval); | 3291 | return (retval); |
@@ -3821,46 +3785,52 @@ static void idetape_get_inquiry_results (ide_drive_t *drive) | |||
3821 | } | 3785 | } |
3822 | 3786 | ||
3823 | /* | 3787 | /* |
3824 | * idetape_get_mode_sense_results asks the tape about its various | 3788 | * Ask the tape about its various parameters. In particular, we will adjust our |
3825 | * parameters. In particular, we will adjust our data transfer buffer | 3789 | * data transfer buffer size to the recommended value as returned by the tape. |
3826 | * size to the recommended value as returned by the tape. | ||
3827 | */ | 3790 | */ |
3828 | static void idetape_get_mode_sense_results (ide_drive_t *drive) | 3791 | static void idetape_get_mode_sense_results (ide_drive_t *drive) |
3829 | { | 3792 | { |
3830 | idetape_tape_t *tape = drive->driver_data; | 3793 | idetape_tape_t *tape = drive->driver_data; |
3831 | idetape_pc_t pc; | 3794 | idetape_pc_t pc; |
3832 | idetape_capabilities_page_t *capabilities; | 3795 | u8 *caps; |
3796 | u8 speed, max_speed; | ||
3833 | 3797 | ||
3834 | idetape_create_mode_sense_cmd(&pc, IDETAPE_CAPABILITIES_PAGE); | 3798 | idetape_create_mode_sense_cmd(&pc, IDETAPE_CAPABILITIES_PAGE); |
3835 | if (idetape_queue_pc_tail(drive, &pc)) { | 3799 | if (idetape_queue_pc_tail(drive, &pc)) { |
3836 | printk(KERN_ERR "ide-tape: Can't get tape parameters - assuming some default values\n"); | 3800 | printk(KERN_ERR "ide-tape: Can't get tape parameters - assuming" |
3801 | " some default values\n"); | ||
3837 | tape->tape_block_size = 512; | 3802 | tape->tape_block_size = 512; |
3838 | tape->capabilities.ctl = 52; | 3803 | put_unaligned(52, (u16 *)&tape->caps[12]); |
3839 | tape->capabilities.speed = 450; | 3804 | put_unaligned(540, (u16 *)&tape->caps[14]); |
3840 | tape->capabilities.buffer_size = 6 * 52; | 3805 | put_unaligned(6*52, (u16 *)&tape->caps[16]); |
3841 | return; | 3806 | return; |
3842 | } | 3807 | } |
3843 | capabilities = (idetape_capabilities_page_t *) | 3808 | caps = pc.buffer + 4 + pc.buffer[3]; |
3844 | (pc.buffer + 4 + pc.buffer[3]); | 3809 | |
3810 | /* convert to host order and save for later use */ | ||
3811 | speed = be16_to_cpu(*(u16 *)&caps[14]); | ||
3812 | max_speed = be16_to_cpu(*(u16 *)&caps[8]); | ||
3845 | 3813 | ||
3846 | capabilities->max_speed = ntohs(capabilities->max_speed); | 3814 | put_unaligned(max_speed, (u16 *)&caps[8]); |
3847 | capabilities->ctl = ntohs(capabilities->ctl); | 3815 | put_unaligned(be16_to_cpu(*(u16 *)&caps[12]), (u16 *)&caps[12]); |
3848 | capabilities->speed = ntohs(capabilities->speed); | 3816 | put_unaligned(speed, (u16 *)&caps[14]); |
3849 | capabilities->buffer_size = ntohs(capabilities->buffer_size); | 3817 | put_unaligned(be16_to_cpu(*(u16 *)&caps[16]), (u16 *)&caps[16]); |
3850 | 3818 | ||
3851 | if (!capabilities->speed) { | 3819 | if (!speed) { |
3852 | printk(KERN_INFO "ide-tape: %s: overriding capabilities->speed (assuming 650KB/sec)\n", drive->name); | 3820 | printk(KERN_INFO "ide-tape: %s: invalid tape speed " |
3853 | capabilities->speed = 650; | 3821 | "(assuming 650KB/sec)\n", drive->name); |
3822 | put_unaligned(650, (u16 *)&caps[14]); | ||
3854 | } | 3823 | } |
3855 | if (!capabilities->max_speed) { | 3824 | if (!max_speed) { |
3856 | printk(KERN_INFO "ide-tape: %s: overriding capabilities->max_speed (assuming 650KB/sec)\n", drive->name); | 3825 | printk(KERN_INFO "ide-tape: %s: invalid max_speed " |
3857 | capabilities->max_speed = 650; | 3826 | "(assuming 650KB/sec)\n", drive->name); |
3827 | put_unaligned(650, (u16 *)&caps[8]); | ||
3858 | } | 3828 | } |
3859 | 3829 | ||
3860 | tape->capabilities = *capabilities; /* Save us a copy */ | 3830 | memcpy(&tape->caps, caps, 20); |
3861 | if (capabilities->blk512) | 3831 | if (caps[7] & 0x02) |
3862 | tape->tape_block_size = 512; | 3832 | tape->tape_block_size = 512; |
3863 | else if (capabilities->blk1024) | 3833 | else if (caps[7] & 0x04) |
3864 | tape->tape_block_size = 1024; | 3834 | tape->tape_block_size = 1024; |
3865 | } | 3835 | } |
3866 | 3836 | ||
@@ -3897,13 +3867,15 @@ static void idetape_add_settings (ide_drive_t *drive) | |||
3897 | /* | 3867 | /* |
3898 | * drive setting name read/write data type min max mul_factor div_factor data pointer set function | 3868 | * drive setting name read/write data type min max mul_factor div_factor data pointer set function |
3899 | */ | 3869 | */ |
3900 | ide_add_setting(drive, "buffer", SETTING_READ, TYPE_SHORT, 0, 0xffff, 1, 2, &tape->capabilities.buffer_size, NULL); | 3870 | ide_add_setting(drive, "buffer", SETTING_READ, TYPE_SHORT, 0, 0xffff, |
3871 | 1, 2, (u16 *)&tape->caps[16], NULL); | ||
3901 | ide_add_setting(drive, "pipeline_min", SETTING_RW, TYPE_INT, 1, 0xffff, tape->stage_size / 1024, 1, &tape->min_pipeline, NULL); | 3872 | ide_add_setting(drive, "pipeline_min", SETTING_RW, TYPE_INT, 1, 0xffff, tape->stage_size / 1024, 1, &tape->min_pipeline, NULL); |
3902 | ide_add_setting(drive, "pipeline", SETTING_RW, TYPE_INT, 1, 0xffff, tape->stage_size / 1024, 1, &tape->max_stages, NULL); | 3873 | ide_add_setting(drive, "pipeline", SETTING_RW, TYPE_INT, 1, 0xffff, tape->stage_size / 1024, 1, &tape->max_stages, NULL); |
3903 | ide_add_setting(drive, "pipeline_max", SETTING_RW, TYPE_INT, 1, 0xffff, tape->stage_size / 1024, 1, &tape->max_pipeline, NULL); | 3874 | ide_add_setting(drive, "pipeline_max", SETTING_RW, TYPE_INT, 1, 0xffff, tape->stage_size / 1024, 1, &tape->max_pipeline, NULL); |
3904 | ide_add_setting(drive, "pipeline_used", SETTING_READ, TYPE_INT, 0, 0xffff, tape->stage_size / 1024, 1, &tape->nr_stages, NULL); | 3875 | ide_add_setting(drive, "pipeline_used", SETTING_READ, TYPE_INT, 0, 0xffff, tape->stage_size / 1024, 1, &tape->nr_stages, NULL); |
3905 | ide_add_setting(drive, "pipeline_pending", SETTING_READ, TYPE_INT, 0, 0xffff, tape->stage_size / 1024, 1, &tape->nr_pending_stages, NULL); | 3876 | ide_add_setting(drive, "pipeline_pending", SETTING_READ, TYPE_INT, 0, 0xffff, tape->stage_size / 1024, 1, &tape->nr_pending_stages, NULL); |
3906 | ide_add_setting(drive, "speed", SETTING_READ, TYPE_SHORT, 0, 0xffff, 1, 1, &tape->capabilities.speed, NULL); | 3877 | ide_add_setting(drive, "speed", SETTING_READ, TYPE_SHORT, 0, 0xffff, |
3878 | 1, 1, (u16 *)&tape->caps[14], NULL); | ||
3907 | ide_add_setting(drive, "stage", SETTING_READ, TYPE_INT, 0, 0xffff, 1, 1024, &tape->stage_size, NULL); | 3879 | ide_add_setting(drive, "stage", SETTING_READ, TYPE_INT, 0, 0xffff, 1, 1024, &tape->stage_size, NULL); |
3908 | ide_add_setting(drive, "tdsc", SETTING_RW, TYPE_INT, IDETAPE_DSC_RW_MIN, IDETAPE_DSC_RW_MAX, 1000, HZ, &tape->best_dsc_rw_frequency, NULL); | 3880 | ide_add_setting(drive, "tdsc", SETTING_RW, TYPE_INT, IDETAPE_DSC_RW_MIN, IDETAPE_DSC_RW_MAX, 1000, HZ, &tape->best_dsc_rw_frequency, NULL); |
3909 | ide_add_setting(drive, "dsc_overlap", SETTING_RW, TYPE_BYTE, 0, 1, 1, 1, &drive->dsc_overlap, NULL); | 3881 | ide_add_setting(drive, "dsc_overlap", SETTING_RW, TYPE_BYTE, 0, 1, 1, 1, &drive->dsc_overlap, NULL); |
@@ -3935,6 +3907,7 @@ static void idetape_setup (ide_drive_t *drive, idetape_tape_t *tape, int minor) | |||
3935 | struct idetape_id_gcw gcw; | 3907 | struct idetape_id_gcw gcw; |
3936 | int stage_size; | 3908 | int stage_size; |
3937 | struct sysinfo si; | 3909 | struct sysinfo si; |
3910 | u16 *ctl = (u16 *)&tape->caps[12]; | ||
3938 | 3911 | ||
3939 | spin_lock_init(&tape->spinlock); | 3912 | spin_lock_init(&tape->spinlock); |
3940 | drive->dsc_overlap = 1; | 3913 | drive->dsc_overlap = 1; |
@@ -3964,11 +3937,11 @@ static void idetape_setup (ide_drive_t *drive, idetape_tape_t *tape, int minor) | |||
3964 | idetape_get_mode_sense_results(drive); | 3937 | idetape_get_mode_sense_results(drive); |
3965 | idetape_get_blocksize_from_block_descriptor(drive); | 3938 | idetape_get_blocksize_from_block_descriptor(drive); |
3966 | tape->user_bs_factor = 1; | 3939 | tape->user_bs_factor = 1; |
3967 | tape->stage_size = tape->capabilities.ctl * tape->tape_block_size; | 3940 | tape->stage_size = *ctl * tape->tape_block_size; |
3968 | while (tape->stage_size > 0xffff) { | 3941 | while (tape->stage_size > 0xffff) { |
3969 | printk(KERN_NOTICE "ide-tape: decreasing stage size\n"); | 3942 | printk(KERN_NOTICE "ide-tape: decreasing stage size\n"); |
3970 | tape->capabilities.ctl /= 2; | 3943 | *ctl /= 2; |
3971 | tape->stage_size = tape->capabilities.ctl * tape->tape_block_size; | 3944 | tape->stage_size = *ctl * tape->tape_block_size; |
3972 | } | 3945 | } |
3973 | stage_size = tape->stage_size; | 3946 | stage_size = tape->stage_size; |
3974 | tape->pages_per_stage = stage_size / PAGE_SIZE; | 3947 | tape->pages_per_stage = stage_size / PAGE_SIZE; |
@@ -3977,11 +3950,8 @@ static void idetape_setup (ide_drive_t *drive, idetape_tape_t *tape, int minor) | |||
3977 | tape->excess_bh_size = PAGE_SIZE - stage_size % PAGE_SIZE; | 3950 | tape->excess_bh_size = PAGE_SIZE - stage_size % PAGE_SIZE; |
3978 | } | 3951 | } |
3979 | 3952 | ||
3980 | /* | 3953 | /* Select the "best" DSC read/write polling freq and pipeline size. */ |
3981 | * Select the "best" DSC read/write polling frequency | 3954 | speed = max(*(u16 *)&tape->caps[14], *(u16 *)&tape->caps[8]); |
3982 | * and pipeline size. | ||
3983 | */ | ||
3984 | speed = max(tape->capabilities.speed, tape->capabilities.max_speed); | ||
3985 | 3955 | ||
3986 | tape->max_stages = speed * 1000 * 10 / tape->stage_size; | 3956 | tape->max_stages = speed * 1000 * 10 / tape->stage_size; |
3987 | 3957 | ||
@@ -3998,7 +3968,7 @@ static void idetape_setup (ide_drive_t *drive, idetape_tape_t *tape, int minor) | |||
3998 | tape->max_stages = tape->min_pipeline = tape->max_pipeline = 1; | 3968 | tape->max_stages = tape->min_pipeline = tape->max_pipeline = 1; |
3999 | 3969 | ||
4000 | t1 = (tape->stage_size * HZ) / (speed * 1000); | 3970 | t1 = (tape->stage_size * HZ) / (speed * 1000); |
4001 | tmid = (tape->capabilities.buffer_size * 32 * HZ) / (speed * 125); | 3971 | tmid = (*(u16 *)&tape->caps[16] * 32 * HZ) / (speed * 125); |
4002 | tn = (IDETAPE_FIFO_THRESHOLD * tape->stage_size * HZ) / (speed * 1000); | 3972 | tn = (IDETAPE_FIFO_THRESHOLD * tape->stage_size * HZ) / (speed * 1000); |
4003 | 3973 | ||
4004 | if (tape->max_stages) | 3974 | if (tape->max_stages) |
@@ -4013,8 +3983,8 @@ static void idetape_setup (ide_drive_t *drive, idetape_tape_t *tape, int minor) | |||
4013 | tape->best_dsc_rw_frequency = max_t(unsigned long, min_t(unsigned long, t, IDETAPE_DSC_RW_MAX), IDETAPE_DSC_RW_MIN); | 3983 | tape->best_dsc_rw_frequency = max_t(unsigned long, min_t(unsigned long, t, IDETAPE_DSC_RW_MAX), IDETAPE_DSC_RW_MIN); |
4014 | printk(KERN_INFO "ide-tape: %s <-> %s: %dKBps, %d*%dkB buffer, " | 3984 | printk(KERN_INFO "ide-tape: %s <-> %s: %dKBps, %d*%dkB buffer, " |
4015 | "%dkB pipeline, %lums tDSC%s\n", | 3985 | "%dkB pipeline, %lums tDSC%s\n", |
4016 | drive->name, tape->name, tape->capabilities.speed, | 3986 | drive->name, tape->name, *(u16 *)&tape->caps[14], |
4017 | (tape->capabilities.buffer_size * 512) / tape->stage_size, | 3987 | (*(u16 *)&tape->caps[16] * 512) / tape->stage_size, |
4018 | tape->stage_size / 1024, | 3988 | tape->stage_size / 1024, |
4019 | tape->max_stages * tape->stage_size / 1024, | 3989 | tape->max_stages * tape->stage_size / 1024, |
4020 | tape->best_dsc_rw_frequency * 1000 / HZ, | 3990 | tape->best_dsc_rw_frequency * 1000 / HZ, |