OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [ide/] [ide-tape.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 * linux/drivers/ide/ide-tape.c         Version 1.17c   Sep, 2003
3
 *
4
 * Copyright (C) 1995 - 1999 Gadi Oxman <gadio@netvision.net.il>
5
 *
6
 * $Header: /home/marcus/revision_ctrl_test/oc_cvs/cvs/or1k/linux/linux-2.4/drivers/ide/ide-tape.c,v 1.1.1.1 2004-04-15 01:38:53 phoenix Exp $
7
 *
8
 * This driver was constructed as a student project in the software laboratory
9
 * of the faculty of electrical engineering in the Technion - Israel's
10
 * Institute Of Technology, with the guide of Avner Lottem and Dr. Ilana David.
11
 *
12
 * It is hereby placed under the terms of the GNU general public license.
13
 * (See linux/COPYING).
14
 */
15
 
16
/*
17
 * IDE ATAPI streaming tape driver.
18
 *
19
 * This driver is a part of the Linux ide driver and works in co-operation
20
 * with linux/drivers/block/ide.c.
21
 *
22
 * The driver, in co-operation with ide.c, basically traverses the
23
 * request-list for the block device interface. The character device
24
 * interface, on the other hand, creates new requests, adds them
25
 * to the request-list of the block device, and waits for their completion.
26
 *
27
 * Pipelined operation mode is now supported on both reads and writes.
28
 *
29
 * The block device major and minor numbers are determined from the
30
 * tape's relative position in the ide interfaces, as explained in ide.c.
31
 *
32
 * The character device interface consists of the following devices:
33
 *
34
 * ht0          major 37, minor 0       first  IDE tape, rewind on close.
35
 * ht1          major 37, minor 1       second IDE tape, rewind on close.
36
 * ...
37
 * nht0         major 37, minor 128     first  IDE tape, no rewind on close.
38
 * nht1         major 37, minor 129     second IDE tape, no rewind on close.
39
 * ...
40
 *
41
 * Run linux/scripts/MAKEDEV.ide to create the above entries.
42
 *
43
 * The general magnetic tape commands compatible interface, as defined by
44
 * include/linux/mtio.h, is accessible through the character device.
45
 *
46
 * General ide driver configuration options, such as the interrupt-unmask
47
 * flag, can be configured by issuing an ioctl to the block device interface,
48
 * as any other ide device.
49
 *
50
 * Our own ide-tape ioctl's can be issued to either the block device or
51
 * the character device interface.
52
 *
53
 * Maximal throughput with minimal bus load will usually be achieved in the
54
 * following scenario:
55
 *
56
 *      1.      ide-tape is operating in the pipelined operation mode.
57
 *      2.      No buffering is performed by the user backup program.
58
 *
59
 * Testing was done with a 2 GB CONNER CTMA 4000 IDE ATAPI Streaming Tape Drive.
60
 *
61
 * Ver 0.1   Nov  1 95   Pre-working code :-)
62
 * Ver 0.2   Nov 23 95   A short backup (few megabytes) and restore procedure
63
 *                        was successful ! (Using tar cvf ... on the block
64
 *                        device interface).
65
 *                       A longer backup resulted in major swapping, bad
66
 *                        overall Linux performance and eventually failed as
67
 *                        we received non serial read-ahead requests from the
68
 *                        buffer cache.
69
 * Ver 0.3   Nov 28 95   Long backups are now possible, thanks to the
70
 *                        character device interface. Linux's responsiveness
71
 *                        and performance doesn't seem to be much affected
72
 *                        from the background backup procedure.
73
 *                       Some general mtio.h magnetic tape operations are
74
 *                        now supported by our character device. As a result,
75
 *                        popular tape utilities are starting to work with
76
 *                        ide tapes :-)
77
 *                       The following configurations were tested:
78
 *                              1. An IDE ATAPI TAPE shares the same interface
79
 *                                 and irq with an IDE ATAPI CDROM.
80
 *                              2. An IDE ATAPI TAPE shares the same interface
81
 *                                 and irq with a normal IDE disk.
82
 *                        Both configurations seemed to work just fine !
83
 *                        However, to be on the safe side, it is meanwhile
84
 *                        recommended to give the IDE TAPE its own interface
85
 *                        and irq.
86
 *                       The one thing which needs to be done here is to
87
 *                        add a "request postpone" feature to ide.c,
88
 *                        so that we won't have to wait for the tape to finish
89
 *                        performing a long media access (DSC) request (such
90
 *                        as a rewind) before we can access the other device
91
 *                        on the same interface. This effect doesn't disturb
92
 *                        normal operation most of the time because read/write
93
 *                        requests are relatively fast, and once we are
94
 *                        performing one tape r/w request, a lot of requests
95
 *                        from the other device can be queued and ide.c will
96
 *                        service all of them after this single tape request.
97
 * Ver 1.0   Dec 11 95   Integrated into Linux 1.3.46 development tree.
98
 *                       On each read / write request, we now ask the drive
99
 *                        if we can transfer a constant number of bytes
100
 *                        (a parameter of the drive) only to its buffers,
101
 *                        without causing actual media access. If we can't,
102
 *                        we just wait until we can by polling the DSC bit.
103
 *                        This ensures that while we are not transferring
104
 *                        more bytes than the constant referred to above, the
105
 *                        interrupt latency will not become too high and
106
 *                        we won't cause an interrupt timeout, as happened
107
 *                        occasionally in the previous version.
108
 *                       While polling for DSC, the current request is
109
 *                        postponed and ide.c is free to handle requests from
110
 *                        the other device. This is handled transparently to
111
 *                        ide.c. The hwgroup locking method which was used
112
 *                        in the previous version was removed.
113
 *                       Use of new general features which are provided by
114
 *                        ide.c for use with atapi devices.
115
 *                        (Programming done by Mark Lord)
116
 *                       Few potential bug fixes (Again, suggested by Mark)
117
 *                       Single character device data transfers are now
118
 *                        not limited in size, as they were before.
119
 *                       We are asking the tape about its recommended
120
 *                        transfer unit and send a larger data transfer
121
 *                        as several transfers of the above size.
122
 *                        For best results, use an integral number of this
123
 *                        basic unit (which is shown during driver
124
 *                        initialization). I will soon add an ioctl to get
125
 *                        this important parameter.
126
 *                       Our data transfer buffer is allocated on startup,
127
 *                        rather than before each data transfer. This should
128
 *                        ensure that we will indeed have a data buffer.
129
 * Ver 1.1   Dec 14 95   Fixed random problems which occurred when the tape
130
 *                        shared an interface with another device.
131
 *                        (poll_for_dsc was a complete mess).
132
 *                       Removed some old (non-active) code which had
133
 *                        to do with supporting buffer cache originated
134
 *                        requests.
135
 *                       The block device interface can now be opened, so
136
 *                        that general ide driver features like the unmask
137
 *                        interrupts flag can be selected with an ioctl.
138
 *                        This is the only use of the block device interface.
139
 *                       New fast pipelined operation mode (currently only on
140
 *                        writes). When using the pipelined mode, the
141
 *                        throughput can potentially reach the maximum
142
 *                        tape supported throughput, regardless of the
143
 *                        user backup program. On my tape drive, it sometimes
144
 *                        boosted performance by a factor of 2. Pipelined
145
 *                        mode is enabled by default, but since it has a few
146
 *                        downfalls as well, you may want to disable it.
147
 *                        A short explanation of the pipelined operation mode
148
 *                        is available below.
149
 * Ver 1.2   Jan  1 96   Eliminated pipelined mode race condition.
150
 *                       Added pipeline read mode. As a result, restores
151
 *                        are now as fast as backups.
152
 *                       Optimized shared interface behavior. The new behavior
153
 *                        typically results in better IDE bus efficiency and
154
 *                        higher tape throughput.
155
 *                       Pre-calculation of the expected read/write request
156
 *                        service time, based on the tape's parameters. In
157
 *                        the pipelined operation mode, this allows us to
158
 *                        adjust our polling frequency to a much lower value,
159
 *                        and thus to dramatically reduce our load on Linux,
160
 *                        without any decrease in performance.
161
 *                       Implemented additional mtio.h operations.
162
 *                       The recommended user block size is returned by
163
 *                        the MTIOCGET ioctl.
164
 *                       Additional minor changes.
165
 * Ver 1.3   Feb  9 96   Fixed pipelined read mode bug which prevented the
166
 *                        use of some block sizes during a restore procedure.
167
 *                       The character device interface will now present a
168
 *                        continuous view of the media - any mix of block sizes
169
 *                        during a backup/restore procedure is supported. The
170
 *                        driver will buffer the requests internally and
171
 *                        convert them to the tape's recommended transfer
172
 *                        unit, making performance almost independent of the
173
 *                        chosen user block size.
174
 *                       Some improvements in error recovery.
175
 *                       By cooperating with ide-dma.c, bus mastering DMA can
176
 *                        now sometimes be used with IDE tape drives as well.
177
 *                        Bus mastering DMA has the potential to dramatically
178
 *                        reduce the CPU's overhead when accessing the device,
179
 *                        and can be enabled by using hdparm -d1 on the tape's
180
 *                        block device interface. For more info, read the
181
 *                        comments in ide-dma.c.
182
 * Ver 1.4   Mar 13 96   Fixed serialize support.
183
 * Ver 1.5   Apr 12 96   Fixed shared interface operation, broken in 1.3.85.
184
 *                       Fixed pipelined read mode inefficiency.
185
 *                       Fixed nasty null dereferencing bug.
186
 * Ver 1.6   Aug 16 96   Fixed FPU usage in the driver.
187
 *                       Fixed end of media bug.
188
 * Ver 1.7   Sep 10 96   Minor changes for the CONNER CTT8000-A model.
189
 * Ver 1.8   Sep 26 96   Attempt to find a better balance between good
190
 *                        interactive response and high system throughput.
191
 * Ver 1.9   Nov  5 96   Automatically cross encountered filemarks rather
192
 *                        than requiring an explicit FSF command.
193
 *                       Abort pending requests at end of media.
194
 *                       MTTELL was sometimes returning incorrect results.
195
 *                       Return the real block size in the MTIOCGET ioctl.
196
 *                       Some error recovery bug fixes.
197
 * Ver 1.10  Nov  5 96   Major reorganization.
198
 *                       Reduced CPU overhead a bit by eliminating internal
199
 *                        bounce buffers.
200
 *                       Added module support.
201
 *                       Added multiple tape drives support.
202
 *                       Added partition support.
203
 *                       Rewrote DSC handling.
204
 *                       Some portability fixes.
205
 *                       Removed ide-tape.h.
206
 *                       Additional minor changes.
207
 * Ver 1.11  Dec  2 96   Bug fix in previous DSC timeout handling.
208
 *                       Use ide_stall_queue() for DSC overlap.
209
 *                       Use the maximum speed rather than the current speed
210
 *                        to compute the request service time.
211
 * Ver 1.12  Dec  7 97   Fix random memory overwriting and/or last block data
212
 *                        corruption, which could occur if the total number
213
 *                        of bytes written to the tape was not an integral
214
 *                        number of tape blocks.
215
 *                       Add support for INTERRUPT DRQ devices.
216
 * Ver 1.13  Jan  2 98   Add "speed == 0" work-around for HP COLORADO 5GB
217
 * Ver 1.14  Dec 30 98   Partial fixes for the Sony/AIWA tape drives.
218
 *                       Replace cli()/sti() with hwgroup spinlocks.
219
 * Ver 1.15  Mar 25 99   Fix SMP race condition by replacing hwgroup
220
 *                        spinlock with private per-tape spinlock.
221
 * Ver 1.16  Sep  1 99   Add OnStream tape support.
222
 *                       Abort read pipeline on EOD.
223
 *                       Wait for the tape to become ready in case it returns
224
 *                        "in the process of becoming ready" on open().
225
 *                       Fix zero padding of the last written block in
226
 *                        case the tape block size is larger than PAGE_SIZE.
227
 *                       Decrease the default disconnection time to tn.
228
 * Ver 1.16e Oct  3 99   Minor fixes.
229
 * Ver 1.16e1 Oct 13 99  Patches by Arnold Niessen,
230
 *                          niessen@iae.nl / arnold.niessen@philips.com
231
 *                   GO-1)  Undefined code in idetape_read_position
232
 *                              according to Gadi's email
233
 *                   AJN-1) Minor fix asc == 11 should be asc == 0x11
234
 *                               in idetape_issue_packet_command (did effect
235
 *                               debugging output only)
236
 *                   AJN-2) Added more debugging output, and
237
 *                              added ide-tape: where missing. I would also
238
 *                              like to add tape->name where possible
239
 *                   AJN-3) Added different debug_level's
240
 *                              via /proc/ide/hdc/settings
241
 *                              "debug_level" determines amount of debugging output;
242
 *                              can be changed using /proc/ide/hdx/settings
243
 *                              0 : almost no debugging output
244
 *                              1 : 0+output errors only
245
 *                              2 : 1+output all sensekey/asc
246
 *                              3 : 2+follow all chrdev related procedures
247
 *                              4 : 3+follow all procedures
248
 *                              5 : 4+include pc_stack rq_stack info
249
 *                              6 : 5+USE_COUNT updates
250
 *                   AJN-4) Fixed timeout for retension in idetape_queue_pc_tail
251
 *                              from 5 to 10 minutes
252
 *                   AJN-5) Changed maximum number of blocks to skip when
253
 *                              reading tapes with multiple consecutive write
254
 *                              errors from 100 to 1000 in idetape_get_logical_blk
255
 *                   Proposed changes to code:
256
 *                   1) output "logical_blk_num" via /proc
257
 *                   2) output "current_operation" via /proc
258
 *                   3) Either solve or document the fact that `mt rewind' is
259
 *                      required after reading from /dev/nhtx to be
260
 *                      able to rmmod the idetape module;
261
 *                      Also, sometimes an application finishes but the
262
 *                      device remains `busy' for some time. Same cause ?
263
 *                   Proposed changes to release-notes:
264
 *                   4) write a simple `quickstart' section in the
265
 *                      release notes; I volunteer if you don't want to
266
 *                   5) include a pointer to video4linux in the doc
267
 *                      to stimulate video applications
268
 *                   6) release notes lines 331 and 362: explain what happens
269
 *                      if the application data rate is higher than 1100 KB/s;
270
 *                      similar approach to lower-than-500 kB/s ?
271
 *                   7) 6.6 Comparison; wouldn't it be better to allow different
272
 *                      strategies for read and write ?
273
 *                      Wouldn't it be better to control the tape buffer
274
 *                      contents instead of the bandwidth ?
275
 *                   8) line 536: replace will by would (if I understand
276
 *                      this section correctly, a hypothetical and unwanted situation
277
 *                       is being described)
278
 * Ver 1.16f Dec 15 99   Change place of the secondary OnStream header frames.
279
 * Ver 1.17  Nov 2000 / Jan 2001  Marcel Mol, marcel@mesa.nl
280
 *                      - Add idetape_onstream_mode_sense_tape_parameter_page
281
 *                        function to get tape capacity in frames: tape->capacity.
282
 *                      - Add support for DI-50 drives( or any DI- drive).
283
 *                      - 'workaround' for read error/blank block arround block 3000.
284
 *                      - Implement Early warning for end of media for Onstream.
285
 *                      - Cosmetic code changes for readability.
286
 *                      - Idetape_position_tape should not use SKIP bit during
287
 *                        Onstream read recovery.
288
 *                      - Add capacity, logical_blk_num and first/last_frame_position
289
 *                        to /proc/ide/hd?/settings.
290
 *                      - Module use count was gone in the Linux 2.4 driver.
291
 * Ver 1.17a Apr 2001 Willem Riede osst@riede.org
292
 *                      - Get drive's actual block size from mode sense block descriptor
293
 *                      - Limit size of pipeline
294
 * Ver 1.17b Dec 2002   Alan Stern <stern@rowland.harvard.edu>
295
 *                      Changed IDETAPE_MIN_PIPELINE_STAGES to 1 and actually used
296
 *                       it in the code!
297
 *                      Actually removed aborted stages in idetape_abort_pipeline
298
 *                       instead of just changing the command code.
299
 *                      Made the transfer byte count for Request Sense equal to the
300
 *                       actual length of the data transfer.
301
 *                      Changed handling of partial data transfers: they do not
302
 *                       cause DMA errors.
303
 *                      Moved initiation of DMA transfers to the correct place.
304
 *                      Removed reference to unallocated memory.
305
 *                      Made __idetape_discard_read_pipeline return the number of
306
 *                       sectors skipped, not the number of stages.
307
 *                      Replaced errant kfree() calls with __idetape_kfree_stage().
308
 *                      Fixed off-by-one error in testing the pipeline length.
309
 *                      Fixed handling of filemarks in the read pipeline.
310
 *                      Small code optimization for MTBSF and MTBSFM ioctls.
311
 *                      Don't try to unlock the door during device close if is
312
 *                       already unlocked!
313
 *                      Cosmetic fixes to miscellaneous debugging output messages.
314
 *                      Set the minimum /proc/ide/hd?/settings values for "pipeline",
315
 *                       "pipeline_min", and "pipeline_max" to 1.
316
 * Ver 1.17c Sep 2003   Stuart Hayes <stuart_hayes@dell.com>
317
 *                      Initialized "feature" in idetape_issue_packet_command
318
 *                       (this was causing lockups on certain systems)
319
 *
320
 * Here are some words from the first releases of hd.c, which are quoted
321
 * in ide.c and apply here as well:
322
 *
323
 * | Special care is recommended.  Have Fun!
324
 *
325
 */
326
 
327
/*
328
 * An overview of the pipelined operation mode.
329
 *
330
 * In the pipelined write mode, we will usually just add requests to our
331
 * pipeline and return immediately, before we even start to service them. The
332
 * user program will then have enough time to prepare the next request while
333
 * we are still busy servicing previous requests. In the pipelined read mode,
334
 * the situation is similar - we add read-ahead requests into the pipeline,
335
 * before the user even requested them.
336
 *
337
 * The pipeline can be viewed as a "safety net" which will be activated when
338
 * the system load is high and prevents the user backup program from keeping up
339
 * with the current tape speed. At this point, the pipeline will get
340
 * shorter and shorter but the tape will still be streaming at the same speed.
341
 * Assuming we have enough pipeline stages, the system load will hopefully
342
 * decrease before the pipeline is completely empty, and the backup program
343
 * will be able to "catch up" and refill the pipeline again.
344
 *
345
 * When using the pipelined mode, it would be best to disable any type of
346
 * buffering done by the user program, as ide-tape already provides all the
347
 * benefits in the kernel, where it can be done in a more efficient way.
348
 * As we will usually not block the user program on a request, the most
349
 * efficient user code will then be a simple read-write-read-... cycle.
350
 * Any additional logic will usually just slow down the backup process.
351
 *
352
 * Using the pipelined mode, I get a constant over 400 KBps throughput,
353
 * which seems to be the maximum throughput supported by my tape.
354
 *
355
 * However, there are some downfalls:
356
 *
357
 *      1.      We use memory (for data buffers) in proportional to the number
358
 *              of pipeline stages (each stage is about 26 KB with my tape).
359
 *      2.      In the pipelined write mode, we cheat and postpone error codes
360
 *              to the user task. In read mode, the actual tape position
361
 *              will be a bit further than the last requested block.
362
 *
363
 * Concerning (1):
364
 *
365
 *      1.      We allocate stages dynamically only when we need them. When
366
 *              we don't need them, we don't consume additional memory. In
367
 *              case we can't allocate stages, we just manage without them
368
 *              (at the expense of decreased throughput) so when Linux is
369
 *              tight in memory, we will not pose additional difficulties.
370
 *
371
 *      2.      The maximum number of stages (which is, in fact, the maximum
372
 *              amount of memory) which we allocate is limited by the compile
373
 *              time parameter IDETAPE_MAX_PIPELINE_STAGES.
374
 *
375
 *      3.      The maximum number of stages is a controlled parameter - We
376
 *              don't start from the user defined maximum number of stages
377
 *              but from the lower IDETAPE_MIN_PIPELINE_STAGES (again, we
378
 *              will not even allocate this amount of stages if the user
379
 *              program can't handle the speed). We then implement a feedback
380
 *              loop which checks if the pipeline is empty, and if it is, we
381
 *              increase the maximum number of stages as necessary until we
382
 *              reach the optimum value which just manages to keep the tape
383
 *              busy with minimum allocated memory or until we reach
384
 *              IDETAPE_MAX_PIPELINE_STAGES.
385
 *
386
 * Concerning (2):
387
 *
388
 *      In pipelined write mode, ide-tape can not return accurate error codes
389
 *      to the user program since we usually just add the request to the
390
 *      pipeline without waiting for it to be serviced. In case an error
391
 *      occurs, I will report it on the next user request.
392
 *
393
 *      In the pipelined read mode, subsequent read requests or forward
394
 *      filemark spacing will perform correctly, as we preserve all blocks
395
 *      and filemarks which we encountered during our excess read-ahead.
396
 *
397
 *      For accurate tape positioning and error reporting, disabling
398
 *      pipelined mode might be the best option.
399
 *
400
 * You can enable/disable/tune the pipelined operation mode by adjusting
401
 * the compile time parameters below.
402
 */
403
 
404
/*
405
 *      Possible improvements.
406
 *
407
 *      1.      Support for the ATAPI overlap protocol.
408
 *
409
 *              In order to maximize bus throughput, we currently use the DSC
410
 *              overlap method which enables ide.c to service requests from the
411
 *              other device while the tape is busy executing a command. The
412
 *              DSC overlap method involves polling the tape's status register
413
 *              for the DSC bit, and servicing the other device while the tape
414
 *              isn't ready.
415
 *
416
 *              In the current QIC development standard (December 1995),
417
 *              it is recommended that new tape drives will *in addition*
418
 *              implement the ATAPI overlap protocol, which is used for the
419
 *              same purpose - efficient use of the IDE bus, but is interrupt
420
 *              driven and thus has much less CPU overhead.
421
 *
422
 *              ATAPI overlap is likely to be supported in most new ATAPI
423
 *              devices, including new ATAPI cdroms, and thus provides us
424
 *              a method by which we can achieve higher throughput when
425
 *              sharing a (fast) ATA-2 disk with any (slow) new ATAPI device.
426
 */
427
 
428
#define IDETAPE_VERSION "1.17c"
429
 
430
#include <linux/config.h>
431
#include <linux/module.h>
432
#include <linux/types.h>
433
#include <linux/string.h>
434
#include <linux/kernel.h>
435
#include <linux/delay.h>
436
#include <linux/timer.h>
437
#include <linux/mm.h>
438
#include <linux/interrupt.h>
439
#include <linux/major.h>
440
#include <linux/devfs_fs_kernel.h>
441
#include <linux/errno.h>
442
#include <linux/genhd.h>
443
#include <linux/slab.h>
444
#include <linux/ide.h>
445
#include <linux/smp_lock.h>
446
#include <linux/completion.h>
447
 
448
#include <asm/byteorder.h>
449
#include <asm/irq.h>
450
#include <asm/uaccess.h>
451
#include <asm/io.h>
452
#include <asm/unaligned.h>
453
#include <asm/bitops.h>
454
 
455
 
456
/*
457
 *      OnStream support
458
 */
459
#define ONSTREAM_DEBUG          (0)
460
#define OS_CONFIG_PARTITION     (0xff)
461
#define OS_DATA_PARTITION       (0)
462
#define OS_PARTITION_VERSION    (1)
463
#define OS_EW                   300
464
#define OS_ADR_MINREV           2
465
 
466
#define OS_DATA_STARTFRAME1     20
467
#define OS_DATA_ENDFRAME1       2980
468
/*
469
 * partition
470
 */
471
typedef struct os_partition_s {
472
        __u8    partition_num;
473
        __u8    par_desc_ver;
474
        __u16   wrt_pass_cntr;
475
        __u32   first_frame_addr;
476
        __u32   last_frame_addr;
477
        __u32   eod_frame_addr;
478
} os_partition_t;
479
 
480
/*
481
 * DAT entry
482
 */
483
typedef struct os_dat_entry_s {
484
        __u32   blk_sz;
485
        __u16   blk_cnt;
486
        __u8    flags;
487
        __u8    reserved;
488
} os_dat_entry_t;
489
 
490
/*
491
 * DAT
492
 */
493
#define OS_DAT_FLAGS_DATA       (0xc)
494
#define OS_DAT_FLAGS_MARK       (0x1)
495
 
496
typedef struct os_dat_s {
497
        __u8            dat_sz;
498
        __u8            reserved1;
499
        __u8            entry_cnt;
500
        __u8            reserved3;
501
        os_dat_entry_t  dat_list[16];
502
} os_dat_t;
503
 
504
/*
505
 * Frame types
506
 */
507
#define OS_FRAME_TYPE_FILL      (0)
508
#define OS_FRAME_TYPE_EOD       (1 << 0)
509
#define OS_FRAME_TYPE_MARKER    (1 << 1)
510
#define OS_FRAME_TYPE_HEADER    (1 << 3)
511
#define OS_FRAME_TYPE_DATA      (1 << 7)
512
 
513
/*
514
 * AUX
515
 */
516
typedef struct os_aux_s {
517
        __u32           format_id;              /* hardware compability AUX is based on */
518
        char            application_sig[4];     /* driver used to write this media */
519
        __u32           hdwr;                   /* reserved */
520
        __u32           update_frame_cntr;      /* for configuration frame */
521
        __u8            frame_type;
522
        __u8            frame_type_reserved;
523
        __u8            reserved_18_19[2];
524
        os_partition_t  partition;
525
        __u8            reserved_36_43[8];
526
        __u32           frame_seq_num;
527
        __u32           logical_blk_num_high;
528
        __u32           logical_blk_num;
529
        os_dat_t        dat;
530
        __u8            reserved188_191[4];
531
        __u32           filemark_cnt;
532
        __u32           phys_fm;
533
        __u32           last_mark_addr;
534
        __u8            reserved204_223[20];
535
 
536
        /*
537
         * __u8         app_specific[32];
538
         *
539
         * Linux specific fields:
540
         */
541
         __u32          next_mark_addr;         /* when known, points to next marker */
542
         __u8           linux_specific[28];
543
 
544
        __u8            reserved_256_511[256];
545
} os_aux_t;
546
 
547
typedef struct os_header_s {
548
        char            ident_str[8];
549
        __u8            major_rev;
550
        __u8            minor_rev;
551
        __u8            reserved10_15[6];
552
        __u8            par_num;
553
        __u8            reserved1_3[3];
554
        os_partition_t  partition;
555
} os_header_t;
556
 
557
/*
558
 *      OnStream Tape Parameters Page
559
 */
560
typedef struct {
561
        unsigned        page_code       :6;     /* Page code - Should be 0x2b */
562
        unsigned        reserved1_6     :1;
563
        unsigned        ps              :1;
564
        __u8            reserved2;
565
        __u8            density;                /* kbpi */
566
        __u8            reserved3,reserved4;
567
        __u16           segtrk;                 /* segment of per track */
568
        __u16           trks;                   /* tracks per tape */
569
        __u8            reserved5,reserved6,reserved7,reserved8,reserved9,reserved10;
570
} onstream_tape_paramtr_page_t;
571
 
572
/*
573
 * OnStream ADRL frame
574
 */
575
#define OS_FRAME_SIZE   (32 * 1024 + 512)
576
#define OS_DATA_SIZE    (32 * 1024)
577
#define OS_AUX_SIZE     (512)
578
 
579
/*
580
 * internal error codes for onstream
581
 */
582
#define OS_PART_ERROR    2
583
#define OS_WRITE_ERROR   1
584
 
585
#include <linux/mtio.h>
586
 
587
/**************************** Tunable parameters *****************************/
588
 
589
 
590
/*
591
 *      Pipelined mode parameters.
592
 *
593
 *      We try to use the minimum number of stages which is enough to
594
 *      keep the tape constantly streaming. To accomplish that, we implement
595
 *      a feedback loop around the maximum number of stages:
596
 *
597
 *      We start from MIN maximum stages (we will not even use MIN stages
598
 *      if we don't need them), increment it by RATE*(MAX-MIN)
599
 *      whenever we sense that the pipeline is empty, until we reach
600
 *      the optimum value or until we reach MAX.
601
 *
602
 *      Setting the following parameter to 0 is illegal: the pipelined mode
603
 *      cannot be disabled (calculate_speeds() divides by tape->max_stages.)
604
 */
605
#define IDETAPE_MIN_PIPELINE_STAGES       1
606
#define IDETAPE_MAX_PIPELINE_STAGES     400
607
#define IDETAPE_INCREASE_STAGES_RATE     20
608
 
609
/*
610
 *      The following are used to debug the driver:
611
 *
612
 *      Setting IDETAPE_DEBUG_INFO to 1 will report device capabilities.
613
 *      Setting IDETAPE_DEBUG_LOG to 1 will log driver flow control.
614
 *      Setting IDETAPE_DEBUG_BUGS to 1 will enable self-sanity checks in
615
 *      some places.
616
 *
617
 *      Setting them to 0 will restore normal operation mode:
618
 *
619
 *              1.      Disable logging normal successful operations.
620
 *              2.      Disable self-sanity checks.
621
 *              3.      Errors will still be logged, of course.
622
 *
623
 *      All the #if DEBUG code will be removed some day, when the driver
624
 *      is verified to be stable enough. This will make it much more
625
 *      esthetic.
626
 */
627
#define IDETAPE_DEBUG_INFO              0
628
#define IDETAPE_DEBUG_LOG               0
629
#define IDETAPE_DEBUG_LOG_VERBOSE       0
630
#define IDETAPE_DEBUG_BUGS              1
631
 
632
/*
633
 *      After each failed packet command we issue a request sense command
634
 *      and retry the packet command IDETAPE_MAX_PC_RETRIES times.
635
 *
636
 *      Setting IDETAPE_MAX_PC_RETRIES to 0 will disable retries.
637
 */
638
#define IDETAPE_MAX_PC_RETRIES          3
639
 
640
/*
641
 *      With each packet command, we allocate a buffer of
642
 *      IDETAPE_PC_BUFFER_SIZE bytes. This is used for several packet
643
 *      commands (Not for READ/WRITE commands).
644
 */
645
#define IDETAPE_PC_BUFFER_SIZE          256
646
 
647
/*
648
 *      In various places in the driver, we need to allocate storage
649
 *      for packet commands and requests, which will remain valid while
650
 *      we leave the driver to wait for an interrupt or a timeout event.
651
 */
652
#define IDETAPE_PC_STACK                (10 + IDETAPE_MAX_PC_RETRIES)
653
 
654
/*
655
 *      Some tape drives require a long irq timeout
656
 */
657
#define IDETAPE_WAIT_CMD                (60*HZ)
658
 
659
/*
660
 *      The following parameter is used to select the point in the internal
661
 *      tape fifo in which we will start to refill the buffer. Decreasing
662
 *      the following parameter will improve the system's latency and
663
 *      interactive response, while using a high value might improve sytem
664
 *      throughput.
665
 */
666
#define IDETAPE_FIFO_THRESHOLD          2
667
 
668
/*
669
 *      DSC polling parameters.
670
 *
671
 *      Polling for DSC (a single bit in the status register) is a very
672
 *      important function in ide-tape. There are two cases in which we
673
 *      poll for DSC:
674
 *
675
 *      1.      Before a read/write packet command, to ensure that we
676
 *              can transfer data from/to the tape's data buffers, without
677
 *              causing an actual media access. In case the tape is not
678
 *              ready yet, we take out our request from the device
679
 *              request queue, so that ide.c will service requests from
680
 *              the other device on the same interface meanwhile.
681
 *
682
 *      2.      After the successful initialization of a "media access
683
 *              packet command", which is a command which can take a long
684
 *              time to complete (it can be several seconds or even an hour).
685
 *
686
 *              Again, we postpone our request in the middle to free the bus
687
 *              for the other device. The polling frequency here should be
688
 *              lower than the read/write frequency since those media access
689
 *              commands are slow. We start from a "fast" frequency -
690
 *              IDETAPE_DSC_MA_FAST (one second), and if we don't receive DSC
691
 *              after IDETAPE_DSC_MA_THRESHOLD (5 minutes), we switch it to a
692
 *              lower frequency - IDETAPE_DSC_MA_SLOW (1 minute).
693
 *
694
 *      We also set a timeout for the timer, in case something goes wrong.
695
 *      The timeout should be longer then the maximum execution time of a
696
 *      tape operation.
697
 */
698
 
699
/*
700
 *      DSC timings.
701
 */
702
#define IDETAPE_DSC_RW_MIN              5*HZ/100        /* 50 msec */
703
#define IDETAPE_DSC_RW_MAX              40*HZ/100       /* 400 msec */
704
#define IDETAPE_DSC_RW_TIMEOUT          2*60*HZ         /* 2 minutes */
705
#define IDETAPE_DSC_MA_FAST             2*HZ            /* 2 seconds */
706
#define IDETAPE_DSC_MA_THRESHOLD        5*60*HZ         /* 5 minutes */
707
#define IDETAPE_DSC_MA_SLOW             30*HZ           /* 30 seconds */
708
#define IDETAPE_DSC_MA_TIMEOUT          2*60*60*HZ      /* 2 hours */
709
 
710
/*************************** End of tunable parameters ***********************/
711
 
712
/*
713
 *      Debugging/Performance analysis
714
 *
715
 *      I/O trace support
716
 */
717
#define USE_IOTRACE     0
718
#if USE_IOTRACE
719
#include <linux/io_trace.h>
720
#define IO_IDETAPE_FIFO 500
721
#endif
722
 
723
/*
724
 *      Read/Write error simulation
725
 */
726
#define SIMULATE_ERRORS                 0
727
 
728
/*
729
 *      For general magnetic tape device compatibility.
730
 */
731
typedef enum {
732
        idetape_direction_none,
733
        idetape_direction_read,
734
        idetape_direction_write
735
} idetape_chrdev_direction_t;
736
 
737
/*
738
 *      Our view of a packet command.
739
 */
740
typedef struct idetape_packet_command_s {
741
        u8 c[12];                               /* Actual packet bytes */
742
        int retries;                            /* On each retry, we increment retries */
743
        int error;                              /* Error code */
744
        int request_transfer;                   /* Bytes to transfer */
745
        int actually_transferred;               /* Bytes actually transferred */
746
        int buffer_size;                        /* Size of our data buffer */
747
        struct buffer_head *bh;
748
        char *b_data;
749
        int b_count;
750
        u8 *buffer;                             /* Data buffer */
751
        u8 *current_position;                   /* Pointer into the above buffer */
752
        ide_startstop_t (*callback) (ide_drive_t *);    /* Called when this packet command is completed */
753
        u8 pc_buffer[IDETAPE_PC_BUFFER_SIZE];   /* Temporary buffer */
754
        unsigned long flags;                    /* Status/Action bit flags: long for set_bit */
755
} idetape_pc_t;
756
 
757
/*
758
 *      Packet command flag bits.
759
 */
760
/* Set when an error is considered normal - We won't retry */
761
#define PC_ABORT                        0
762
/* 1 When polling for DSC on a media access command */
763
#define PC_WAIT_FOR_DSC                 1
764
/* 1 when we prefer to use DMA if possible */
765
#define PC_DMA_RECOMMENDED              2
766
/* 1 while DMA in progress */
767
#define PC_DMA_IN_PROGRESS              3
768
/* 1 when encountered problem during DMA */
769
#define PC_DMA_ERROR                    4
770
/* Data direction */
771
#define PC_WRITING                      5
772
 
773
/*
774
 *      Capabilities and Mechanical Status Page
775
 */
776
typedef struct {
777
        unsigned        page_code       :6;     /* Page code - Should be 0x2a */
778
        __u8            reserved0_6     :1;
779
        __u8            ps              :1;     /* parameters saveable */
780
        __u8            page_length;            /* Page Length - Should be 0x12 */
781
        __u8            reserved2, reserved3;
782
        unsigned        ro              :1;     /* Read Only Mode */
783
        unsigned        reserved4_1234  :4;
784
        unsigned        sprev           :1;     /* Supports SPACE in the reverse direction */
785
        unsigned        reserved4_67    :2;
786
        unsigned        reserved5_012   :3;
787
        unsigned        efmt            :1;     /* Supports ERASE command initiated formatting */
788
        unsigned        reserved5_4     :1;
789
        unsigned        qfa             :1;     /* Supports the QFA two partition formats */
790
        unsigned        reserved5_67    :2;
791
        unsigned        lock            :1;     /* Supports locking the volume */
792
        unsigned        locked          :1;     /* The volume is locked */
793
        unsigned        prevent         :1;     /* The device defaults in the prevent state after power up */
794
        unsigned        eject           :1;     /* The device can eject the volume */
795
        __u8            disconnect      :1;     /* The device can break request > ctl */
796
        __u8            reserved6_5     :1;
797
        unsigned        ecc             :1;     /* Supports error correction */
798
        unsigned        cmprs           :1;     /* Supports data compression */
799
        unsigned        reserved7_0     :1;
800
        unsigned        blk512          :1;     /* Supports 512 bytes block size */
801
        unsigned        blk1024         :1;     /* Supports 1024 bytes block size */
802
        unsigned        reserved7_3_6   :4;
803
        unsigned        blk32768        :1;     /* slowb - the device restricts the byte count for PIO */
804
                                                /* transfers for slow buffer memory ??? */
805
                                                /* Also 32768 block size in some cases */
806
        __u16           max_speed;              /* Maximum speed supported in KBps */
807
        __u8            reserved10, reserved11;
808
        __u16           ctl;                    /* Continuous Transfer Limit in blocks */
809
        __u16           speed;                  /* Current Speed, in KBps */
810
        __u16           buffer_size;            /* Buffer Size, in 512 bytes */
811
        __u8            reserved18, reserved19;
812
} idetape_capabilities_page_t;
813
 
814
/*
815
 *      Block Size Page
816
 */
817
typedef struct {
818
        unsigned        page_code       :6;     /* Page code - Should be 0x30 */
819
        unsigned        reserved1_6     :1;
820
        unsigned        ps              :1;
821
        __u8            page_length;            /* Page Length - Should be 2 */
822
        __u8            reserved2;
823
        unsigned        play32          :1;
824
        unsigned        play32_5        :1;
825
        unsigned        reserved2_23    :2;
826
        unsigned        record32        :1;
827
        unsigned        record32_5      :1;
828
        unsigned        reserved2_6     :1;
829
        unsigned        one             :1;
830
} idetape_block_size_page_t;
831
 
832
/*
833
 *      A pipeline stage.
834
 */
835
typedef struct idetape_stage_s {
836
        struct request rq;                      /* The corresponding request */
837
        struct buffer_head *bh;                 /* The data buffers */
838
        struct idetape_stage_s *next;           /* Pointer to the next stage */
839
        os_aux_t *aux;                          /* OnStream aux ptr */
840
} idetape_stage_t;
841
 
842
/*
843
 *      REQUEST SENSE packet command result - Data Format.
844
 */
845
typedef struct {
846
#if defined(__LITTLE_ENDIAN_BITFIELD)
847
        unsigned        error_code      :7;     /* Current of deferred errors */
848
        unsigned        valid           :1;     /* The information field conforms to QIC-157C */
849
        __u8            reserved1       :8;     /* Segment Number - Reserved */
850
        unsigned        sense_key       :4;     /* Sense Key */
851
        unsigned        reserved2_4     :1;     /* Reserved */
852
        unsigned        ili             :1;     /* Incorrect Length Indicator */
853
        unsigned        eom             :1;     /* End Of Medium */
854
        unsigned        filemark        :1;     /* Filemark */
855
#elif defined(__BIG_ENDIAN_BITFIELD)
856
        unsigned        valid           :1;
857
        unsigned        error_code      :7;
858
        __u8            reserved1       :8;
859
        unsigned        filemark        :1;
860
        unsigned        eom             :1;
861
        unsigned        ili             :1;
862
        unsigned        reserved2_4     :1;
863
        unsigned        sense_key       :4;
864
#else
865
#error "Please fix <asm/byteorder.h>"
866
#endif
867
        __u32           information __attribute__ ((packed));
868
        __u8            asl;                    /* Additional sense length (n-7) */
869
        __u32           command_specific;       /* Additional command specific information */
870
        __u8            asc;                    /* Additional Sense Code */
871
        __u8            ascq;                   /* Additional Sense Code Qualifier */
872
        __u8            replaceable_unit_code;  /* Field Replaceable Unit Code */
873
        unsigned        sk_specific1    :7;     /* Sense Key Specific */
874
        unsigned        sksv            :1;     /* Sense Key Specific information is valid */
875
        __u8            sk_specific2;           /* Sense Key Specific */
876
        __u8            sk_specific3;           /* Sense Key Specific */
877
        __u8            pad[2];                 /* Padding to 20 bytes */
878
} idetape_request_sense_result_t;
879
 
880
 
881
/*
882
 *      Most of our global data which we need to save even as we leave the
883
 *      driver due to an interrupt or a timer event is stored in a variable
884
 *      of type idetape_tape_t, defined below.
885
 */
886
typedef struct {
887
        ide_drive_t *drive;
888
        devfs_handle_t de_r, de_n;
889
 
890
        /*
891
         *      Since a typical character device operation requires more
892
         *      than one packet command, we provide here enough memory
893
         *      for the maximum of interconnected packet commands.
894
         *      The packet commands are stored in the circular array pc_stack.
895
         *      pc_stack_index points to the last used entry, and warps around
896
         *      to the start when we get to the last array entry.
897
         *
898
         *      pc points to the current processed packet command.
899
         *
900
         *      failed_pc points to the last failed packet command, or contains
901
         *      NULL if we do not need to retry any packet command. This is
902
         *      required since an additional packet command is needed before the
903
         *      retry, to get detailed information on what went wrong.
904
         */
905
        /* Current packet command */
906
        idetape_pc_t *pc;
907
        /* Last failed packet command */
908
        idetape_pc_t *failed_pc;
909
        /* Packet command stack */
910
        idetape_pc_t pc_stack[IDETAPE_PC_STACK];
911
        /* Next free packet command storage space */
912
        int pc_stack_index;
913
        struct request rq_stack[IDETAPE_PC_STACK];
914
        /* We implement a circular array */
915
        int rq_stack_index;
916
 
917
        /*
918
         *      DSC polling variables.
919
         *
920
         *      While polling for DSC we use postponed_rq to postpone the
921
         *      current request so that ide.c will be able to service
922
         *      pending requests on the other device. Note that at most
923
         *      we will have only one DSC (usually data transfer) request
924
         *      in the device request queue. Additional requests can be
925
         *      queued in our internal pipeline, but they will be visible
926
         *      to ide.c only one at a time.
927
         */
928
        struct request *postponed_rq;
929
        /* The time in which we started polling for DSC */
930
        unsigned long dsc_polling_start;
931
        /* Timer used to poll for dsc */
932
        struct timer_list dsc_timer;
933
        /* Read/Write dsc polling frequency */
934
        unsigned long best_dsc_rw_frequency;
935
        /* The current polling frequency */
936
        unsigned long dsc_polling_frequency;
937
        /* Maximum waiting time */
938
        unsigned long dsc_timeout;
939
 
940
        /*
941
         *      Read position information
942
         */
943
        u8 partition;
944
        /* Current block */
945
        unsigned int first_frame_position;
946
        unsigned int last_frame_position;
947
        unsigned int blocks_in_buffer;
948
 
949
        /*
950
         *      Last error information
951
         */
952
        u8 sense_key, asc, ascq;
953
 
954
        /*
955
         *      Character device operation
956
         */
957
        unsigned int minor;
958
        /* device name */
959
        char name[4];
960
        /* Current character device data transfer direction */
961
        idetape_chrdev_direction_t chrdev_direction;
962
 
963
        /*
964
         *      Device information
965
         */
966
        /* Usually 512 or 1024 bytes */
967
        unsigned short tape_block_size;
968
        int user_bs_factor;
969
        /* Copy of the tape's Capabilities and Mechanical Page */
970
        idetape_capabilities_page_t capabilities;
971
 
972
        /*
973
         *      Active data transfer request parameters.
974
         *
975
         *      At most, there is only one ide-tape originated data transfer
976
         *      request in the device request queue. This allows ide.c to
977
         *      easily service requests from the other device when we
978
         *      postpone our active request. In the pipelined operation
979
         *      mode, we use our internal pipeline structure to hold
980
         *      more data requests.
981
         *
982
         *      The data buffer size is chosen based on the tape's
983
         *      recommendation.
984
         */
985
        /* Pointer to the request, waiting in the device request queue */
986
        struct request *active_data_request;
987
        /* Data buffer size (chosen based on the tape's recommendation */
988
        int stage_size;
989
        idetape_stage_t *merge_stage;
990
        int merge_stage_size;
991
        struct buffer_head *bh;
992
        char *b_data;
993
        int b_count;
994
 
995
        /*
996
         *      Pipeline parameters.
997
         *
998
         *      To accomplish non-pipelined mode, we simply set the following
999
         *      variables to zero (or NULL, where appropriate).
1000
         */
1001
        /* Number of currently used stages */
1002
        int nr_stages;
1003
        /* Number of pending stages */
1004
        int nr_pending_stages;
1005
        /* We will not allocate more than this number of stages */
1006
        int max_stages, min_pipeline, max_pipeline;
1007
        /* The first stage which will be removed from the pipeline */
1008
        idetape_stage_t *first_stage;
1009
        /* The currently active stage */
1010
        idetape_stage_t *active_stage;
1011
        /* Will be serviced after the currently active request */
1012
        idetape_stage_t *next_stage;
1013
        /* New requests will be added to the pipeline here */
1014
        idetape_stage_t *last_stage;
1015
        /* Optional free stage which we can use */
1016
        idetape_stage_t *cache_stage;
1017
        int pages_per_stage;
1018
        /* Wasted space in each stage */
1019
        int excess_bh_size;
1020
 
1021
        /* Status/Action flags: long for set_bit */
1022
        unsigned long flags;
1023
        /* protects the ide-tape queue */
1024
        spinlock_t spinlock;
1025
 
1026
        /*
1027
         * Measures average tape speed
1028
         */
1029
        unsigned long avg_time;
1030
        int avg_size;
1031
        int avg_speed;
1032
 
1033
        /* last sense information */
1034
        idetape_request_sense_result_t sense;
1035
 
1036
        char vendor_id[10];
1037
        char product_id[18];
1038
        char firmware_revision[6];
1039
        int firmware_revision_num;
1040
 
1041
        /* the door is currently locked */
1042
        int door_locked;
1043
 
1044
        /*
1045
         * OnStream flags
1046
         */
1047
        /* the tape is an OnStream tape */
1048
        int onstream;
1049
        /* OnStream raw access (32.5KB block size) */
1050
        int raw;
1051
        /* current number of frames in internal buffer */
1052
        int cur_frames;
1053
        /* max number of frames in internal buffer */
1054
        int max_frames;
1055
        /* logical block number */
1056
        int logical_blk_num;
1057
        /* write pass counter */
1058
        __u16 wrt_pass_cntr;
1059
        /* update frame counter */
1060
        __u32 update_frame_cntr;
1061
        struct completion *waiting;
1062
        /* write error recovery active */
1063
        int onstream_write_error;
1064
        /* header frame verified ok */
1065
        int header_ok;
1066
        /* reading linux-specifc media */
1067
        int linux_media;
1068
        int linux_media_version;
1069
        /* application signature */
1070
        char application_sig[5];
1071
        int filemark_cnt;
1072
        int first_mark_addr;
1073
        int last_mark_addr;
1074
        int eod_frame_addr;
1075
        unsigned long cmd_start_time;
1076
        unsigned long max_cmd_time;
1077
        unsigned capacity;
1078
 
1079
        /*
1080
         * Optimize the number of "buffer filling"
1081
         * mode sense commands.
1082
         */
1083
        /* last time in which we issued fill cmd */
1084
        unsigned long last_buffer_fill;
1085
        /* buffer fill command requested */
1086
        int req_buffer_fill;
1087
        int writes_since_buffer_fill;
1088
        int reads_since_buffer_fill;
1089
 
1090
        /*
1091
         * Limit the number of times a request can
1092
         * be postponed, to avoid an infinite postpone
1093
         * deadlock.
1094
         */
1095
        /* request postpone count limit */
1096
        int postpone_cnt;
1097
 
1098
        /*
1099
         * Measures number of frames:
1100
         *
1101
         * 1. written/read to/from the driver pipeline (pipeline_head).
1102
         * 2. written/read to/from the tape buffers (buffer_head).
1103
         * 3. written/read by the tape to/from the media (tape_head).
1104
         */
1105
        int pipeline_head;
1106
        int buffer_head;
1107
        int tape_head;
1108
        int last_tape_head;
1109
 
1110
        /*
1111
         * Speed control at the tape buffers input/output
1112
         */
1113
        unsigned long insert_time;
1114
        int insert_size;
1115
        int insert_speed;
1116
        int max_insert_speed;
1117
        int measure_insert_time;
1118
 
1119
        /*
1120
         * Measure tape still time, in milliseconds
1121
         */
1122
        unsigned long tape_still_time_begin;
1123
        int tape_still_time;
1124
 
1125
        /*
1126
         * Speed regulation negative feedback loop
1127
         */
1128
        int speed_control;
1129
        int pipeline_head_speed;
1130
        int controlled_pipeline_head_speed;
1131
        int uncontrolled_pipeline_head_speed;
1132
        int controlled_last_pipeline_head;
1133
        int uncontrolled_last_pipeline_head;
1134
        unsigned long uncontrolled_pipeline_head_time;
1135
        unsigned long controlled_pipeline_head_time;
1136
        int controlled_previous_pipeline_head;
1137
        int uncontrolled_previous_pipeline_head;
1138
        unsigned long controlled_previous_head_time;
1139
        unsigned long uncontrolled_previous_head_time;
1140
        int restart_speed_control_req;
1141
 
1142
        /*
1143
         * Debug_level determines amount of debugging output;
1144
         * can be changed using /proc/ide/hdx/settings
1145
         * 0 : almost no debugging output
1146
         * 1 : 0+output errors only
1147
         * 2 : 1+output all sensekey/asc
1148
         * 3 : 2+follow all chrdev related procedures
1149
         * 4 : 3+follow all procedures
1150
         * 5 : 4+include pc_stack rq_stack info
1151
         * 6 : 5+USE_COUNT updates
1152
         */
1153
         int debug_level;
1154
} idetape_tape_t;
1155
 
1156
/*
1157
 *      Tape door status
1158
 */
1159
#define DOOR_UNLOCKED                   0
1160
#define DOOR_LOCKED                     1
1161
#define DOOR_EXPLICITLY_LOCKED          2
1162
 
1163
/*
1164
 *      Tape flag bits values.
1165
 */
1166
#define IDETAPE_IGNORE_DSC              0
1167
#define IDETAPE_ADDRESS_VALID           1       /* 0 When the tape position is unknown */
1168
#define IDETAPE_BUSY                    2       /* Device already opened */
1169
#define IDETAPE_PIPELINE_ERROR          3       /* Error detected in a pipeline stage */
1170
#define IDETAPE_DETECT_BS               4       /* Attempt to auto-detect the current user block size */
1171
#define IDETAPE_FILEMARK                5       /* Currently on a filemark */
1172
#define IDETAPE_DRQ_INTERRUPT           6       /* DRQ interrupt device */
1173
#define IDETAPE_READ_ERROR              7
1174
#define IDETAPE_PIPELINE_ACTIVE         8       /* pipeline active */
1175
 
1176
/*
1177
 *      Supported ATAPI tape drives packet commands
1178
 */
1179
#define IDETAPE_TEST_UNIT_READY_CMD     0x00
1180
#define IDETAPE_REWIND_CMD              0x01
1181
#define IDETAPE_REQUEST_SENSE_CMD       0x03
1182
#define IDETAPE_READ_CMD                0x08
1183
#define IDETAPE_WRITE_CMD               0x0a
1184
#define IDETAPE_WRITE_FILEMARK_CMD      0x10
1185
#define IDETAPE_SPACE_CMD               0x11
1186
#define IDETAPE_INQUIRY_CMD             0x12
1187
#define IDETAPE_ERASE_CMD               0x19
1188
#define IDETAPE_MODE_SENSE_CMD          0x1a
1189
#define IDETAPE_MODE_SELECT_CMD         0x15
1190
#define IDETAPE_LOAD_UNLOAD_CMD         0x1b
1191
#define IDETAPE_PREVENT_CMD             0x1e
1192
#define IDETAPE_LOCATE_CMD              0x2b
1193
#define IDETAPE_READ_POSITION_CMD       0x34
1194
#define IDETAPE_READ_BUFFER_CMD         0x3c
1195
#define IDETAPE_SET_SPEED_CMD           0xbb
1196
 
1197
/*
1198
 *      Some defines for the READ BUFFER command
1199
 */
1200
#define IDETAPE_RETRIEVE_FAULTY_BLOCK   6
1201
 
1202
/*
1203
 *      Some defines for the SPACE command
1204
 */
1205
#define IDETAPE_SPACE_OVER_FILEMARK     1
1206
#define IDETAPE_SPACE_TO_EOD            3
1207
 
1208
/*
1209
 *      Some defines for the LOAD UNLOAD command
1210
 */
1211
#define IDETAPE_LU_LOAD_MASK            1
1212
#define IDETAPE_LU_RETENSION_MASK       2
1213
#define IDETAPE_LU_EOT_MASK             4
1214
 
1215
/*
1216
 *      Special requests for our block device strategy routine.
1217
 *
1218
 *      In order to service a character device command, we add special
1219
 *      requests to the tail of our block device request queue and wait
1220
 *      for their completion.
1221
 *
1222
 */
1223
#define IDETAPE_FIRST_RQ                90
1224
 
1225
/*
1226
 *      IDETAPE_PC_RQ is used to queue a packet command in the request queue.
1227
 */
1228
#define IDETAPE_PC_RQ1                  90
1229
#define IDETAPE_PC_RQ2                  91
1230
 
1231
/*
1232
 *      IDETAPE_READ_RQ and IDETAPE_WRITE_RQ are used by our
1233
 *      character device interface to request read/write operations from
1234
 *      our block device interface.
1235
 */
1236
#define IDETAPE_READ_RQ                 92
1237
#define IDETAPE_WRITE_RQ                93
1238
#define IDETAPE_ABORTED_WRITE_RQ        94
1239
#define IDETAPE_ABORTED_READ_RQ         95
1240
#define IDETAPE_READ_BUFFER_RQ          96
1241
 
1242
#define IDETAPE_LAST_RQ                 96
1243
 
1244
/*
1245
 *      A macro which can be used to check if a we support a given
1246
 *      request command.
1247
 */
1248
#define IDETAPE_RQ_CMD(cmd)             ((cmd >= IDETAPE_FIRST_RQ) && (cmd <= IDETAPE_LAST_RQ))
1249
 
1250
/*
1251
 *      Error codes which are returned in rq->errors to the higher part
1252
 *      of the driver.
1253
 */
1254
#define IDETAPE_ERROR_GENERAL           101
1255
#define IDETAPE_ERROR_FILEMARK          102
1256
#define IDETAPE_ERROR_EOD               103
1257
 
1258
/*
1259
 *      idetape_chrdev_t provides the link between out character device
1260
 *      interface and our block device interface and the corresponding
1261
 *      ide_drive_t structure.
1262
 */
1263
typedef struct {
1264
        ide_drive_t *drive;
1265
} idetape_chrdev_t;
1266
 
1267
/*
1268
 *      The following is used to format the general configuration word of
1269
 *      the ATAPI IDENTIFY DEVICE command.
1270
 */
1271
struct idetape_id_gcw {
1272
        unsigned packet_size            :2;     /* Packet Size */
1273
        unsigned reserved234            :3;     /* Reserved */
1274
        unsigned drq_type               :2;     /* Command packet DRQ type */
1275
        unsigned removable              :1;     /* Removable media */
1276
        unsigned device_type            :5;     /* Device type */
1277
        unsigned reserved13             :1;     /* Reserved */
1278
        unsigned protocol               :2;     /* Protocol type */
1279
};
1280
 
1281
/*
1282
 *      INQUIRY packet command - Data Format (From Table 6-8 of QIC-157C)
1283
 */
1284
typedef struct {
1285
        unsigned        device_type     :5;     /* Peripheral Device Type */
1286
        unsigned        reserved0_765   :3;     /* Peripheral Qualifier - Reserved */
1287
        unsigned        reserved1_6t0   :7;     /* Reserved */
1288
        unsigned        rmb             :1;     /* Removable Medium Bit */
1289
        unsigned        ansi_version    :3;     /* ANSI Version */
1290
        unsigned        ecma_version    :3;     /* ECMA Version */
1291
        unsigned        iso_version     :2;     /* ISO Version */
1292
        unsigned        response_format :4;     /* Response Data Format */
1293
        unsigned        reserved3_45    :2;     /* Reserved */
1294
        unsigned        reserved3_6     :1;     /* TrmIOP - Reserved */
1295
        unsigned        reserved3_7     :1;     /* AENC - Reserved */
1296
        __u8            additional_length;      /* Additional Length (total_length-4) */
1297
        __u8            rsv5, rsv6, rsv7;       /* Reserved */
1298
        __u8            vendor_id[8];           /* Vendor Identification */
1299
        __u8            product_id[16];         /* Product Identification */
1300
        __u8            revision_level[4];      /* Revision Level */
1301
        __u8            vendor_specific[20];    /* Vendor Specific - Optional */
1302
        __u8            reserved56t95[40];      /* Reserved - Optional */
1303
                                                /* Additional information may be returned */
1304
} idetape_inquiry_result_t;
1305
 
1306
/*
1307
 *      READ POSITION packet command - Data Format (From Table 6-57)
1308
 */
1309
typedef struct {
1310
        unsigned        reserved0_10    :2;     /* Reserved */
1311
        unsigned        bpu             :1;     /* Block Position Unknown */
1312
        unsigned        reserved0_543   :3;     /* Reserved */
1313
        unsigned        eop             :1;     /* End Of Partition */
1314
        unsigned        bop             :1;     /* Beginning Of Partition */
1315
        u8              partition;              /* Partition Number */
1316
        u8              reserved2, reserved3;   /* Reserved */
1317
        u32             first_block;            /* First Block Location */
1318
        u32             last_block;             /* Last Block Location (Optional) */
1319
        u8              reserved12;             /* Reserved */
1320
        u8              blocks_in_buffer[3];    /* Blocks In Buffer - (Optional) */
1321
        u32             bytes_in_buffer;        /* Bytes In Buffer (Optional) */
1322
} idetape_read_position_result_t;
1323
 
1324
/*
1325
 *      Follows structures which are related to the SELECT SENSE / MODE SENSE
1326
 *      packet commands. Those packet commands are still not supported
1327
 *      by ide-tape.
1328
 */
1329
#define IDETAPE_BLOCK_DESCRIPTOR        0
1330
#define IDETAPE_CAPABILITIES_PAGE       0x2a
1331
#define IDETAPE_PARAMTR_PAGE            0x2b   /* Onstream DI-x0 only */
1332
#define IDETAPE_BLOCK_SIZE_PAGE         0x30
1333
#define IDETAPE_BUFFER_FILLING_PAGE     0x33
1334
 
1335
/*
1336
 *      Mode Parameter Header for the MODE SENSE packet command
1337
 */
1338
typedef struct {
1339
        __u8    mode_data_length;       /* Length of the following data transfer */
1340
        __u8    medium_type;            /* Medium Type */
1341
        __u8    dsp;                    /* Device Specific Parameter */
1342
        __u8    bdl;                    /* Block Descriptor Length */
1343
#if 0
1344
        /* data transfer page */
1345
        __u8    page_code       :6;
1346
        __u8    reserved0_6     :1;
1347
        __u8    ps              :1;     /* parameters saveable */
1348
        __u8    page_length;            /* page Length == 0x02 */
1349
        __u8    reserved2;
1350
        __u8    read32k         :1;     /* 32k blk size (data only) */
1351
        __u8    read32k5        :1;     /* 32.5k blk size (data&AUX) */
1352
        __u8    reserved3_23    :2;
1353
        __u8    write32k        :1;     /* 32k blk size (data only) */
1354
        __u8    write32k5       :1;     /* 32.5k blk size (data&AUX) */
1355
        __u8    reserved3_6     :1;
1356
        __u8    streaming       :1;     /* streaming mode enable */
1357
#endif
1358
} idetape_mode_parameter_header_t;
1359
 
1360
/*
1361
 *      Mode Parameter Block Descriptor the MODE SENSE packet command
1362
 *
1363
 *      Support for block descriptors is optional.
1364
 */
1365
typedef struct {
1366
        __u8            density_code;           /* Medium density code */
1367
        __u8            blocks[3];              /* Number of blocks */
1368
        __u8            reserved4;              /* Reserved */
1369
        __u8            length[3];              /* Block Length */
1370
} idetape_parameter_block_descriptor_t;
1371
 
1372
/*
1373
 *      The Data Compression Page, as returned by the MODE SENSE packet command.
1374
 */
1375
typedef struct {
1376
        unsigned        page_code       :6;     /* Page Code - Should be 0xf */
1377
        unsigned        reserved0       :1;     /* Reserved */
1378
        unsigned        ps              :1;
1379
        __u8            page_length;            /* Page Length - Should be 14 */
1380
        unsigned        reserved2       :6;     /* Reserved */
1381
        unsigned        dcc             :1;     /* Data Compression Capable */
1382
        unsigned        dce             :1;     /* Data Compression Enable */
1383
        unsigned        reserved3       :5;     /* Reserved */
1384
        unsigned        red             :2;     /* Report Exception on Decompression */
1385
        unsigned        dde             :1;     /* Data Decompression Enable */
1386
        __u32           ca;                     /* Compression Algorithm */
1387
        __u32           da;                     /* Decompression Algorithm */
1388
        __u8            reserved[4];            /* Reserved */
1389
} idetape_data_compression_page_t;
1390
 
1391
/*
1392
 *      The Medium Partition Page, as returned by the MODE SENSE packet command.
1393
 */
1394
typedef struct {
1395
        unsigned        page_code       :6;     /* Page Code - Should be 0x11 */
1396
        unsigned        reserved1_6     :1;     /* Reserved */
1397
        unsigned        ps              :1;
1398
        __u8            page_length;            /* Page Length - Should be 6 */
1399
        __u8            map;                    /* Maximum Additional Partitions - Should be 0 */
1400
        __u8            apd;                    /* Additional Partitions Defined - Should be 0 */
1401
        unsigned        reserved4_012   :3;     /* Reserved */
1402
        unsigned        psum            :2;     /* Should be 0 */
1403
        unsigned        idp             :1;     /* Should be 0 */
1404
        unsigned        sdp             :1;     /* Should be 0 */
1405
        unsigned        fdp             :1;     /* Fixed Data Partitions */
1406
        __u8            mfr;                    /* Medium Format Recognition */
1407
        __u8            reserved[2];            /* Reserved */
1408
} idetape_medium_partition_page_t;
1409
 
1410
/*
1411
 *      Run time configurable parameters.
1412
 */
1413
typedef struct {
1414
        int     dsc_rw_frequency;
1415
        int     dsc_media_access_frequency;
1416
        int     nr_stages;
1417
} idetape_config_t;
1418
 
1419
/*
1420
 *      The variables below are used for the character device interface.
1421
 *      Additional state variables are defined in our ide_drive_t structure.
1422
 */
1423
static idetape_chrdev_t idetape_chrdevs[MAX_HWIFS * MAX_DRIVES];
1424
static int idetape_chrdev_present = 0;
1425
 
1426
#if IDETAPE_DEBUG_LOG_VERBOSE
1427
 
1428
/*
1429
 * DO NOT REMOVE, BUILDING A VERBOSE DEBUG SCHEME FOR ATAPI
1430
 */
1431
 
1432
char *idetape_sense_key_verbose (u8 idetape_sense_key)
1433
{
1434
        switch (idetape_sense_key) {
1435
                default: {
1436
                        char buf[22];
1437
                        sprintf(buf, "IDETAPE_SENSE (0x%02x)",
1438
                                idetape_sense_key);
1439
                        return(buf);
1440
                }
1441
 
1442
        }
1443
}
1444
 
1445
char *idetape_command_key_verbose (u8 idetape_command_key)
1446
{
1447
        switch (idetape_command_key) {
1448
                case IDETAPE_TEST_UNIT_READY_CMD:
1449
                        return("TEST_UNIT_READY_CMD");
1450
                case IDETAPE_REWIND_CMD:
1451
                        return("REWIND_CMD");
1452
                case IDETAPE_REQUEST_SENSE_CMD:
1453
                        return("REQUEST_SENSE_CMD");
1454
                case IDETAPE_READ_CMD:
1455
                        return("READ_CMD");
1456
                case IDETAPE_WRITE_CMD:
1457
                        return("WRITE_CMD");
1458
                case IDETAPE_WRITE_FILEMARK_CMD:
1459
                        return("WRITE_FILEMARK_CMD");
1460
                case IDETAPE_SPACE_CMD:
1461
                        return("SPACE_CMD");
1462
                case IDETAPE_INQUIRY_CMD:
1463
                        return("INQUIRY_CMD");
1464
                case IDETAPE_ERASE_CMD:
1465
                        return("ERASE_CMD");
1466
                case IDETAPE_MODE_SENSE_CMD:
1467
                        return("MODE_SENSE_CMD");
1468
                case IDETAPE_MODE_SELECT_CMD:
1469
                        return("MODE_SELECT_CMD");
1470
                case IDETAPE_LOAD_UNLOAD_CMD:
1471
                        return("LOAD_UNLOAD_CMD");
1472
                case IDETAPE_PREVENT_CMD:
1473
                        return("PREVENT_CMD");
1474
                case IDETAPE_LOCATE_CMD:
1475
                        return("LOCATE_CMD");
1476
                case IDETAPE_READ_POSITION_CMD:
1477
                        return("READ_POSITION_CMD");
1478
                case IDETAPE_READ_BUFFER_CMD:
1479
                        return("READ_BUFFER_CMD");
1480
                case IDETAPE_SET_SPEED_CMD:
1481
                        return("SET_SPEED_CMD");
1482
                default: {
1483
                                char buf[20];
1484
                                sprintf(buf, "CMD (0x%02x)",
1485
                                        idetape_command_key);
1486
                                return(buf);
1487
                        }
1488
        }
1489
}
1490
#endif /* IDETAPE_DEBUG_LOG_VERBOSE */
1491
 
1492
/*
1493
 *      Function declarations
1494
 *
1495
 */
1496
static void idetape_onstream_mode_sense_tape_parameter_page(ide_drive_t *drive, int debug);
1497
static int idetape_chrdev_release (struct inode *inode, struct file *filp);
1498
static void idetape_write_release (struct inode *inode);
1499
 
1500
/*
1501
 * Too bad. The drive wants to send us data which we are not ready to accept.
1502
 * Just throw it away.
1503
 */
1504
static void idetape_discard_data (ide_drive_t *drive, unsigned int bcount)
1505
{
1506
        while (bcount--)
1507
                (void) HWIF(drive)->INB(IDE_DATA_REG);
1508
}
1509
 
1510
static void idetape_input_buffers (ide_drive_t *drive, idetape_pc_t *pc, unsigned int bcount)
1511
{
1512
        struct buffer_head *bh = pc->bh;
1513
        int count;
1514
 
1515
        while (bcount) {
1516
#if IDETAPE_DEBUG_BUGS
1517
                if (bh == NULL) {
1518
                        printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
1519
                                __FUNCTION__);
1520
                        idetape_discard_data(drive, bcount);
1521
                        return;
1522
                }
1523
#endif /* IDETAPE_DEBUG_BUGS */
1524
                count = IDE_MIN(bh->b_size - atomic_read(&bh->b_count), bcount);
1525
                HWIF(drive)->atapi_input_bytes(drive, bh->b_data + atomic_read(&bh->b_count), count);
1526
                bcount -= count;
1527
                atomic_add(count, &bh->b_count);
1528
                if (atomic_read(&bh->b_count) == bh->b_size) {
1529
                        bh = bh->b_reqnext;
1530
                        if (bh)
1531
                                atomic_set(&bh->b_count, 0);
1532
                }
1533
        }
1534
        pc->bh = bh;
1535
}
1536
 
1537
static void idetape_output_buffers (ide_drive_t *drive, idetape_pc_t *pc, unsigned int bcount)
1538
{
1539
        struct buffer_head *bh = pc->bh;
1540
        int count;
1541
 
1542
        while (bcount) {
1543
#if IDETAPE_DEBUG_BUGS
1544
                if (bh == NULL) {
1545
                        printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
1546
                                __FUNCTION__);
1547
                        return;
1548
                }
1549
#endif /* IDETAPE_DEBUG_BUGS */
1550
                count = IDE_MIN(pc->b_count, bcount);
1551
                HWIF(drive)->atapi_output_bytes(drive, pc->b_data, count);
1552
                bcount -= count;
1553
                pc->b_data += count;
1554
                pc->b_count -= count;
1555
                if (!pc->b_count) {
1556
                        pc->bh = bh = bh->b_reqnext;
1557
                        if (bh) {
1558
                                pc->b_data = bh->b_data;
1559
                                pc->b_count = atomic_read(&bh->b_count);
1560
                        }
1561
                }
1562
        }
1563
}
1564
 
1565
#ifdef CONFIG_BLK_DEV_IDEDMA
1566
static void idetape_update_buffers (idetape_pc_t *pc)
1567
{
1568
        struct buffer_head *bh = pc->bh;
1569
        int count, bcount = pc->actually_transferred;
1570
 
1571
        if (test_bit(PC_WRITING, &pc->flags))
1572
                return;
1573
        while (bcount) {
1574
#if IDETAPE_DEBUG_BUGS
1575
                if (bh == NULL) {
1576
                        printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
1577
                                __FUNCTION__);
1578
                        return;
1579
                }
1580
#endif /* IDETAPE_DEBUG_BUGS */
1581
                count = IDE_MIN(bh->b_size, bcount);
1582
                atomic_set(&bh->b_count, count);
1583
                if (atomic_read(&bh->b_count) == bh->b_size)
1584
                        bh = bh->b_reqnext;
1585
                bcount -= count;
1586
        }
1587
        pc->bh = bh;
1588
}
1589
#endif /* CONFIG_BLK_DEV_IDEDMA */
1590
 
1591
/*
1592
 *      idetape_next_pc_storage returns a pointer to a place in which we can
1593
 *      safely store a packet command, even though we intend to leave the
1594
 *      driver. A storage space for a maximum of IDETAPE_PC_STACK packet
1595
 *      commands is allocated at initialization time.
1596
 */
1597
static idetape_pc_t *idetape_next_pc_storage (ide_drive_t *drive)
1598
{
1599
        idetape_tape_t *tape = drive->driver_data;
1600
 
1601
#if IDETAPE_DEBUG_LOG
1602
        if (tape->debug_level >= 5)
1603
                printk(KERN_INFO "ide-tape: pc_stack_index=%d\n",
1604
                        tape->pc_stack_index);
1605
#endif /* IDETAPE_DEBUG_LOG */
1606
        if (tape->pc_stack_index == IDETAPE_PC_STACK)
1607
                tape->pc_stack_index=0;
1608
        return (&tape->pc_stack[tape->pc_stack_index++]);
1609
}
1610
 
1611
/*
1612
 *      idetape_next_rq_storage is used along with idetape_next_pc_storage.
1613
 *      Since we queue packet commands in the request queue, we need to
1614
 *      allocate a request, along with the allocation of a packet command.
1615
 */
1616
 
1617
/**************************************************************
1618
 *                                                            *
1619
 *  This should get fixed to use kmalloc(.., GFP_ATOMIC)      *
1620
 *  followed later on by kfree().   -ml                       *
1621
 *                                                            *
1622
 **************************************************************/
1623
 
1624
static struct request *idetape_next_rq_storage (ide_drive_t *drive)
1625
{
1626
        idetape_tape_t *tape = drive->driver_data;
1627
 
1628
#if IDETAPE_DEBUG_LOG
1629
        if (tape->debug_level >= 5)
1630
                printk(KERN_INFO "ide-tape: rq_stack_index=%d\n",
1631
                        tape->rq_stack_index);
1632
#endif /* IDETAPE_DEBUG_LOG */
1633
        if (tape->rq_stack_index == IDETAPE_PC_STACK)
1634
                tape->rq_stack_index=0;
1635
        return (&tape->rq_stack[tape->rq_stack_index++]);
1636
}
1637
 
1638
/*
1639
 *      idetape_init_pc initializes a packet command.
1640
 */
1641
static void idetape_init_pc (idetape_pc_t *pc)
1642
{
1643
        memset(pc->c, 0, 12);
1644
        pc->retries = 0;
1645
        pc->flags = 0;
1646
        pc->request_transfer = 0;
1647
        pc->buffer = pc->pc_buffer;
1648
        pc->buffer_size = IDETAPE_PC_BUFFER_SIZE;
1649
        pc->bh = NULL;
1650
        pc->b_data = NULL;
1651
}
1652
 
1653
/*
1654
 *      idetape_analyze_error is called on each failed packet command retry
1655
 *      to analyze the request sense. We currently do not utilize this
1656
 *      information.
1657
 */
1658
static void idetape_analyze_error (ide_drive_t *drive, idetape_request_sense_result_t *result)
1659
{
1660
        idetape_tape_t *tape = drive->driver_data;
1661
        idetape_pc_t *pc = tape->failed_pc;
1662
 
1663
        tape->sense     = *result;
1664
        tape->sense_key = result->sense_key;
1665
        tape->asc       = result->asc;
1666
        tape->ascq      = result->ascq;
1667
#if IDETAPE_DEBUG_LOG
1668
        /*
1669
         *      Without debugging, we only log an error if we decided to
1670
         *      give up retrying.
1671
         */
1672
        if (tape->debug_level >= 1)
1673
                printk(KERN_INFO "ide-tape: pc = %x, sense key = %x, "
1674
                        "asc = %x, ascq = %x\n",
1675
                        pc->c[0], result->sense_key,
1676
                        result->asc, result->ascq);
1677
#if IDETAPE_DEBUG_LOG_VERBOSE
1678
        if (tape->debug_level >= 1)
1679
                printk (KERN_INFO "ide-tape: pc = %s, sense key = %x, "
1680
                        "asc = %x, ascq = %x\n",
1681
                        idetape_command_key_verbose((u8) pc->c[0]),
1682
                        result->sense_key,
1683
                        result->asc,
1684
                        result->ascq);
1685
#endif /* IDETAPE_DEBUG_LOG_VERBOSE */
1686
#endif /* IDETAPE_DEBUG_LOG */
1687
 
1688
        if (tape->onstream && result->sense_key == 2 &&
1689
            result->asc == 0x53 && result->ascq == 2) {
1690
                clear_bit(PC_DMA_ERROR, &pc->flags);
1691
                ide_stall_queue(drive, HZ / 2);
1692
                return;
1693
        }
1694
#ifdef CONFIG_BLK_DEV_IDEDMA
1695
 
1696
        /*
1697
         *      Correct pc->actually_transferred by asking the tape.
1698
         */
1699
        if (test_bit(PC_DMA_ERROR, &pc->flags)) {
1700
                pc->actually_transferred = pc->request_transfer - tape->tape_block_size * ntohl(get_unaligned (&result->information));
1701
                idetape_update_buffers(pc);
1702
        }
1703
#endif /* CONFIG_BLK_DEV_IDEDMA */
1704
        if (pc->c[0] == IDETAPE_READ_CMD && result->filemark) {
1705
                pc->error = IDETAPE_ERROR_FILEMARK;
1706
                set_bit(PC_ABORT, &pc->flags);
1707
        }
1708
        if (pc->c[0] == IDETAPE_WRITE_CMD) {
1709
                if (result->eom || (result->sense_key == 0xd &&
1710
                    result->asc == 0x0 && result->ascq == 0x2)) {
1711
                        pc->error = IDETAPE_ERROR_EOD;
1712
                        set_bit(PC_ABORT, &pc->flags);
1713
                }
1714
        }
1715
        if (pc->c[0] == IDETAPE_READ_CMD || pc->c[0] == IDETAPE_WRITE_CMD) {
1716
                if (result->sense_key == 8) {
1717
                        pc->error = IDETAPE_ERROR_EOD;
1718
                        set_bit(PC_ABORT, &pc->flags);
1719
                }
1720
                if (!test_bit(PC_ABORT, &pc->flags) &&
1721
                    (tape->onstream || pc->actually_transferred))
1722
                        pc->retries = IDETAPE_MAX_PC_RETRIES + 1;
1723
        }
1724
}
1725
 
1726
/*
1727
 *      idetape_active_next_stage will declare the next stage as "active".
1728
 */
1729
static void idetape_active_next_stage (ide_drive_t *drive)
1730
{
1731
        idetape_tape_t *tape = drive->driver_data;
1732
        idetape_stage_t *stage = tape->next_stage;
1733
        struct request *rq = &stage->rq;
1734
 
1735
#if IDETAPE_DEBUG_LOG
1736
        if (tape->debug_level >= 4)
1737
                printk(KERN_INFO "ide-tape: Reached %s\n", __FUNCTION__);
1738
#endif /* IDETAPE_DEBUG_LOG */
1739
#if IDETAPE_DEBUG_BUGS
1740
        if (stage == NULL) {
1741
                printk(KERN_ERR "ide-tape: bug: Trying to activate a "
1742
                        "non existing stage\n");
1743
                return;
1744
        }
1745
#endif /* IDETAPE_DEBUG_BUGS */ 
1746
 
1747
        rq->buffer = NULL;
1748
        rq->bh = stage->bh;
1749
        tape->active_data_request = rq;
1750
        tape->active_stage = stage;
1751
        tape->next_stage = stage->next;
1752
}
1753
 
1754
/*
1755
 *      idetape_increase_max_pipeline_stages is a part of the feedback
1756
 *      loop which tries to find the optimum number of stages. In the
1757
 *      feedback loop, we are starting from a minimum maximum number of
1758
 *      stages, and if we sense that the pipeline is empty, we try to
1759
 *      increase it, until we reach the user compile time memory limit.
1760
 */
1761
static void idetape_increase_max_pipeline_stages (ide_drive_t *drive)
1762
{
1763
        idetape_tape_t *tape = drive->driver_data;
1764
        int increase = (tape->max_pipeline - tape->min_pipeline) / 10;
1765
 
1766
#if IDETAPE_DEBUG_LOG
1767
        if (tape->debug_level >= 4)
1768
                printk (KERN_INFO "ide-tape: Reached %s\n", __FUNCTION__);
1769
#endif /* IDETAPE_DEBUG_LOG */
1770
 
1771
        tape->max_stages += IDE_MAX(increase, 1);
1772
        tape->max_stages = IDE_MAX(tape->max_stages, tape->min_pipeline);
1773
        tape->max_stages = IDE_MIN(tape->max_stages, tape->max_pipeline);
1774
}
1775
 
1776
/*
1777
 *      idetape_kfree_stage calls kfree to completely free a stage, along with
1778
 *      its related buffers.
1779
 */
1780
static void __idetape_kfree_stage (idetape_stage_t *stage)
1781
{
1782
        struct buffer_head *prev_bh, *bh = stage->bh;
1783
        int size;
1784
 
1785
        while (bh != NULL) {
1786
                if (bh->b_data != NULL) {
1787
                        size = (int) bh->b_size;
1788
                        while (size > 0) {
1789
                                free_page((unsigned long) bh->b_data);
1790
                                size -= PAGE_SIZE;
1791
                                bh->b_data += PAGE_SIZE;
1792
                        }
1793
                }
1794
                prev_bh = bh;
1795
                bh = bh->b_reqnext;
1796
                kfree(prev_bh);
1797
        }
1798
        kfree(stage);
1799
}
1800
 
1801
static void idetape_kfree_stage (idetape_tape_t *tape, idetape_stage_t *stage)
1802
{
1803
        __idetape_kfree_stage(stage);
1804
}
1805
 
1806
/*
1807
 *      idetape_remove_stage_head removes tape->first_stage from the pipeline.
1808
 *      The caller should avoid race conditions.
1809
 */
1810
static void idetape_remove_stage_head (ide_drive_t *drive)
1811
{
1812
        idetape_tape_t *tape = drive->driver_data;
1813
        idetape_stage_t *stage;
1814
 
1815
#if IDETAPE_DEBUG_LOG
1816
        if (tape->debug_level >= 4)
1817
                printk(KERN_INFO "ide-tape: Reached %s\n", __FUNCTION__);
1818
#endif /* IDETAPE_DEBUG_LOG */
1819
#if IDETAPE_DEBUG_BUGS
1820
        if (tape->first_stage == NULL) {
1821
                printk(KERN_ERR "ide-tape: bug: tape->first_stage is NULL\n");
1822
                return;
1823
        }
1824
        if (tape->active_stage == tape->first_stage) {
1825
                printk(KERN_ERR "ide-tape: bug: Trying to free our "
1826
                        "active pipeline stage\n");
1827
                return;
1828
        }
1829
#endif /* IDETAPE_DEBUG_BUGS */
1830
        stage = tape->first_stage;
1831
        tape->first_stage = stage->next;
1832
        idetape_kfree_stage(tape, stage);
1833
        tape->nr_stages--;
1834
        if (tape->first_stage == NULL) {
1835
                tape->last_stage = NULL;
1836
#if IDETAPE_DEBUG_BUGS
1837
                if (tape->next_stage != NULL)
1838
                        printk(KERN_ERR "ide-tape: bug: "
1839
                                "tape->next_stage != NULL\n");
1840
                if (tape->nr_stages)
1841
                        printk(KERN_ERR "ide-tape: bug: nr_stages should "
1842
                                "be 0 now\n");
1843
#endif /* IDETAPE_DEBUG_BUGS */
1844
        }
1845
}
1846
 
1847
static void idetape_abort_pipeline (ide_drive_t *drive, idetape_stage_t *last_stage)
1848
{
1849
        idetape_tape_t *tape = drive->driver_data;
1850
        idetape_stage_t *stage = tape->next_stage;
1851
        idetape_stage_t *nstage;
1852
 
1853
#if IDETAPE_DEBUG_LOG
1854
        if (tape->debug_level >= 4)
1855
                printk(KERN_INFO "ide-tape: %s: %s called\n",
1856
                        tape->name, __FUNCTION__);
1857
#endif
1858
        while (stage) {
1859
                nstage = stage->next;
1860
                idetape_kfree_stage(tape, stage);
1861
                --tape->nr_stages;
1862
                --tape->nr_pending_stages;
1863
                stage = nstage;
1864
        }
1865
        tape->last_stage = last_stage;
1866
        if (last_stage)
1867
                last_stage->next = NULL;
1868
        tape->next_stage = NULL;
1869
}
1870
 
1871
/*
1872
 *      idetape_end_request is used to finish servicing a request, and to
1873
 *      insert a pending pipeline request into the main device queue.
1874
 */
1875
static int idetape_end_request (ide_drive_t *drive, int uptodate)
1876
{
1877
        struct request *rq = HWGROUP(drive)->rq;
1878
        idetape_tape_t *tape = drive->driver_data;
1879
        unsigned long flags;
1880
        int error;
1881
        int remove_stage = 0;
1882
        idetape_stage_t *active_stage;
1883
#if ONSTREAM_DEBUG
1884
        idetape_stage_t *stage;
1885
        os_aux_t *aux;
1886
        unsigned char *p;
1887
#endif
1888
 
1889
#if IDETAPE_DEBUG_LOG
1890
        if (tape->debug_level >= 4)
1891
                printk (KERN_INFO "ide-tape: Reached %s\n", __FUNCTION__);
1892
#endif /* IDETAPE_DEBUG_LOG */
1893
 
1894
        switch (uptodate) {
1895
                case 0:  error = IDETAPE_ERROR_GENERAL; break;
1896
                case 1: error = 0; break;
1897
                default: error = uptodate;
1898
        }
1899
        rq->errors = error;
1900
        if (error)
1901
                tape->failed_pc = NULL;
1902
 
1903
        spin_lock_irqsave(&tape->spinlock, flags);
1904
        if (tape->active_data_request == rq) {
1905
                /* The request was a pipelined data transfer request */
1906
                active_stage = tape->active_stage;
1907
                tape->active_stage = NULL;
1908
                tape->active_data_request = NULL;
1909
                tape->nr_pending_stages--;
1910
                if (rq->cmd == IDETAPE_WRITE_RQ) {
1911
#if ONSTREAM_DEBUG
1912
                        if (tape->debug_level >= 2) {
1913
                                if (tape->onstream) {
1914
                                        stage = tape->first_stage;
1915
                                        aux = stage->aux;
1916
                                        p = stage->bh->b_data;
1917
                                        if (ntohl(aux->logical_blk_num) < 11300 && ntohl(aux->logical_blk_num) > 11100)
1918
                                                printk(KERN_INFO "ide-tape: finished writing logical blk %u (data %x %x %x %x)\n", ntohl(aux->logical_blk_num), *p++, *p++, *p++, *p++);
1919
                                }
1920
                        }
1921
#endif
1922
                        if (tape->onstream && !tape->raw) {
1923
                                if (tape->first_frame_position == OS_DATA_ENDFRAME1) {
1924
#if ONSTREAM_DEBUG
1925
                                        if (tape->debug_level >= 2)
1926
                                                printk("ide-tape: %s: skipping over config partition.\n", tape->name);
1927
#endif
1928
                                        tape->onstream_write_error = OS_PART_ERROR;
1929
                                        if (tape->waiting) {
1930
                                                rq->waiting = NULL;
1931
                                                complete(tape->waiting);
1932
                                        }
1933
                                }
1934
                        }
1935
                        remove_stage = 1;
1936
                        if (error) {
1937
                                set_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
1938
                                if (error == IDETAPE_ERROR_EOD)
1939
                                        idetape_abort_pipeline(drive, active_stage);
1940
                                if (tape->onstream && !tape->raw &&
1941
                                    error == IDETAPE_ERROR_GENERAL &&
1942
                                    tape->sense.sense_key == 3) {
1943
                                        clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
1944
                                        printk(KERN_ERR "ide-tape: %s: write error, enabling error recovery\n", tape->name);
1945
                                        tape->onstream_write_error = OS_WRITE_ERROR;
1946
                                        remove_stage = 0;
1947
                                        tape->nr_pending_stages++;
1948
                                        tape->next_stage = tape->first_stage;
1949
                                        rq->current_nr_sectors = rq->nr_sectors;
1950
                                        if (tape->waiting) {
1951
                                                rq->waiting = NULL;
1952
                                                complete(tape->waiting);
1953
                                        }
1954
                                }
1955
                        }
1956
                } else if (rq->cmd == IDETAPE_READ_RQ) {
1957
                        if (error == IDETAPE_ERROR_EOD) {
1958
                                set_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
1959
                                idetape_abort_pipeline(drive, active_stage);
1960
                        }
1961
                }
1962
                if (tape->next_stage != NULL && !tape->onstream_write_error) {
1963
                        idetape_active_next_stage (drive);
1964
 
1965
                        /*
1966
                         *      Insert the next request into the request queue.
1967
                         */
1968
                        (void) ide_do_drive_cmd(drive, tape->active_data_request, ide_end);
1969
                } else if (!error) {
1970
                        if (!tape->onstream)
1971
                                idetape_increase_max_pipeline_stages(drive);
1972
                }
1973
        }
1974
        ide_end_drive_cmd(drive, 0, 0);
1975
        if (remove_stage)
1976
                idetape_remove_stage_head(drive);
1977
        if (tape->active_data_request == NULL)
1978
                clear_bit(IDETAPE_PIPELINE_ACTIVE, &tape->flags);
1979
        spin_unlock_irqrestore(&tape->spinlock, flags);
1980
        return 0;
1981
}
1982
 
1983
static ide_startstop_t idetape_request_sense_callback (ide_drive_t *drive)
1984
{
1985
        idetape_tape_t *tape = drive->driver_data;
1986
 
1987
#if IDETAPE_DEBUG_LOG
1988
        if (tape->debug_level >= 4)
1989
                printk(KERN_INFO "ide-tape: Reached %s\n", __FUNCTION__);
1990
#endif /* IDETAPE_DEBUG_LOG */
1991
        if (!tape->pc->error) {
1992
                idetape_analyze_error(drive, (idetape_request_sense_result_t *) tape->pc->buffer);
1993
                idetape_end_request(drive, 1);
1994
        } else {
1995
                printk(KERN_ERR "ide-tape: Error in REQUEST SENSE "
1996
                        "itself - Aborting request!\n");
1997
                idetape_end_request(drive, 0);
1998
        }
1999
        return ide_stopped;
2000
}
2001
 
2002
static void idetape_create_request_sense_cmd (idetape_pc_t *pc)
2003
{
2004
        idetape_init_pc(pc);
2005
        pc->c[0] = IDETAPE_REQUEST_SENSE_CMD;
2006
        pc->c[4] = 20;
2007
        pc->request_transfer = 20;
2008
        pc->callback = &idetape_request_sense_callback;
2009
}
2010
 
2011
/*
2012
 *      idetape_queue_pc_head generates a new packet command request in front
2013
 *      of the request queue, before the current request, so that it will be
2014
 *      processed immediately, on the next pass through the driver.
2015
 *
2016
 *      idetape_queue_pc_head is called from the request handling part of
2017
 *      the driver (the "bottom" part). Safe storage for the request should
2018
 *      be allocated with idetape_next_pc_storage and idetape_next_rq_storage
2019
 *      before calling idetape_queue_pc_head.
2020
 *
2021
 *      Memory for those requests is pre-allocated at initialization time, and
2022
 *      is limited to IDETAPE_PC_STACK requests. We assume that we have enough
2023
 *      space for the maximum possible number of inter-dependent packet commands.
2024
 *
2025
 *      The higher level of the driver - The ioctl handler and the character
2026
 *      device handling functions should queue request to the lower level part
2027
 *      and wait for their completion using idetape_queue_pc_tail or
2028
 *      idetape_queue_rw_tail.
2029
 */
2030
static void idetape_queue_pc_head (ide_drive_t *drive,idetape_pc_t *pc,struct request *rq)
2031
{
2032
        ide_init_drive_cmd(rq);
2033
        rq->buffer = (char *) pc;
2034
        rq->cmd = IDETAPE_PC_RQ1;
2035
        (void) ide_do_drive_cmd(drive, rq, ide_preempt);
2036
}
2037
 
2038
/*
2039
 *      idetape_retry_pc is called when an error was detected during the
2040
 *      last packet command. We queue a request sense packet command in
2041
 *      the head of the request list.
2042
 */
2043
static ide_startstop_t idetape_retry_pc (ide_drive_t *drive)
2044
{
2045
        idetape_tape_t *tape = drive->driver_data;
2046
        idetape_pc_t *pc;
2047
        struct request *rq;
2048
        atapi_error_t error;
2049
 
2050
        error.all = HWIF(drive)->INB(IDE_ERROR_REG);
2051
        pc = idetape_next_pc_storage (drive);
2052
        rq = idetape_next_rq_storage (drive);
2053
        idetape_create_request_sense_cmd(pc);
2054
        set_bit(IDETAPE_IGNORE_DSC, &tape->flags);
2055
        idetape_queue_pc_head(drive, pc, rq);
2056
        return ide_stopped;
2057
}
2058
 
2059
/*
2060
 *      idetape_postpone_request postpones the current request so that
2061
 *      ide.c will be able to service requests from another device on
2062
 *      the same hwgroup while we are polling for DSC.
2063
 */
2064
static void idetape_postpone_request (ide_drive_t *drive)
2065
{
2066
        idetape_tape_t *tape = drive->driver_data;
2067
 
2068
#if IDETAPE_DEBUG_LOG
2069
        if (tape->debug_level >= 4)
2070
                printk(KERN_INFO "ide-tape: idetape_postpone_request\n");
2071
#endif
2072
        tape->postponed_rq = HWGROUP(drive)->rq;
2073
        ide_stall_queue(drive, tape->dsc_polling_frequency);
2074
}
2075
 
2076
/*
2077
 *      idetape_pc_intr is the usual interrupt handler which will be called
2078
 *      during a packet command. We will transfer some of the data (as
2079
 *      requested by the drive) and will re-point interrupt handler to us.
2080
 *      When data transfer is finished, we will act according to the
2081
 *      algorithm described before idetape_issue_packet_command.
2082
 *
2083
 */
2084
static ide_startstop_t idetape_pc_intr (ide_drive_t *drive)
2085
{
2086
        idetape_tape_t *tape = drive->driver_data;
2087
        atapi_status_t status;
2088
        atapi_bcount_t bcount;
2089
        atapi_ireason_t ireason;
2090
        idetape_pc_t *pc = tape->pc;
2091
 
2092
        unsigned int temp;
2093
        unsigned long cmd_time;
2094
#if SIMULATE_ERRORS
2095
        static int error_sim_count = 0;
2096
#endif
2097
 
2098
#if IDETAPE_DEBUG_LOG
2099
        if (tape->debug_level >= 4)
2100
                printk(KERN_INFO "ide-tape: Reached idetape_pc_intr "
2101
                                "interrupt handler\n");
2102
#endif /* IDETAPE_DEBUG_LOG */  
2103
 
2104
        /* Clear the interrupt */
2105
        status.all = HWIF(drive)->INB(IDE_STATUS_REG);
2106
 
2107
#ifdef CONFIG_BLK_DEV_IDEDMA
2108
        if (test_bit(PC_DMA_IN_PROGRESS, &pc->flags)) {
2109
                if (HWIF(drive)->ide_dma_end(drive) || status.b.check) {
2110
                        /*
2111
                         * A DMA error is sometimes expected. For example,
2112
                         * if the tape is crossing a filemark during a
2113
                         * READ command, it will issue an irq and position
2114
                         * itself before the filemark, so that only a partial
2115
                         * data transfer will occur (which causes the DMA
2116
                         * error). In that case, we will later ask the tape
2117
                         * how much bytes of the original request were
2118
                         * actually transferred (we can't receive that
2119
                         * information from the DMA engine on most chipsets).
2120
                         */
2121
 
2122
                        /*
2123
                         * On the contrary, a DMA error is never expected;
2124
                         * it usually indicates a hardware error or abort.
2125
                         * If the tape crosses a filemark during a READ
2126
                         * command, it will issue an irq and position itself
2127
                         * after the filemark (not before). Only a partial
2128
                         * data transfer will occur, but no DMA error.
2129
                         * (AS, 19 Apr 2001)
2130
                         */
2131
                        set_bit (PC_DMA_ERROR, &pc->flags);
2132
                } else {
2133
                        pc->actually_transferred = pc->request_transfer;
2134
                        idetape_update_buffers (pc);
2135
                }
2136
#if IDETAPE_DEBUG_LOG
2137
                if (tape->debug_level >= 4)
2138
                        printk (KERN_INFO "ide-tape: DMA finished\n");
2139
#endif /* IDETAPE_DEBUG_LOG */
2140
        }
2141
#endif /* CONFIG_BLK_DEV_IDEDMA */
2142
 
2143
        if (!status.b.drq) {                    /* No more interrupts */
2144
                cmd_time = (jiffies - tape->cmd_start_time) * 1000 / HZ;
2145
                tape->max_cmd_time = IDE_MAX(cmd_time, tape->max_cmd_time);
2146
#if IDETAPE_DEBUG_LOG
2147
                if (tape->debug_level >= 2)
2148
                        printk(KERN_INFO "ide-tape: Packet command completed, "
2149
                                "%d bytes transferred\n",
2150
                                pc->actually_transferred);
2151
#endif /* IDETAPE_DEBUG_LOG */
2152
                clear_bit(PC_DMA_IN_PROGRESS, &pc->flags);
2153
 
2154
                local_irq_enable();
2155
 
2156
#if SIMULATE_ERRORS
2157
                if ((pc->c[0] == IDETAPE_WRITE_CMD ||
2158
                     pc->c[0] == IDETAPE_READ_CMD) &&
2159
                    (++error_sim_count % 100) == 0) {
2160
                        printk(KERN_INFO "ide-tape: %s: simulating error\n",
2161
                                tape->name);
2162
                        status.b.check = 1;
2163
                }
2164
#endif
2165
                if (status.b.check && pc->c[0] == IDETAPE_REQUEST_SENSE_CMD)
2166
                        status.b.check = 0;
2167
                if (status.b.check || test_bit(PC_DMA_ERROR, &pc->flags)) {
2168
                        /* Error detected */
2169
                        if (pc->c[0] == IDETAPE_REQUEST_SENSE_CMD) {
2170
                                printk(KERN_ERR "ide-tape: I/O error in "
2171
                                        "request sense command\n");
2172
                                return ide_do_reset(drive);
2173
                        }
2174
#if IDETAPE_DEBUG_LOG
2175
                        if (tape->debug_level >= 1)
2176
                                printk(KERN_INFO "ide-tape: [cmd %x]: check "
2177
                                        "condition\n", pc->c[0]);
2178
#endif
2179
                        /* Retry operation */
2180
                        return idetape_retry_pc(drive);
2181
                }
2182
                pc->error = 0;
2183
                if (!tape->onstream &&
2184
                    test_bit(PC_WAIT_FOR_DSC, &pc->flags) &&
2185
                    !status.b.dsc) {
2186
                        /* Media access command */
2187
                        tape->dsc_polling_start = jiffies;
2188
                        tape->dsc_polling_frequency = IDETAPE_DSC_MA_FAST;
2189
                        tape->dsc_timeout = jiffies + IDETAPE_DSC_MA_TIMEOUT;
2190
                        /* Allow ide.c to handle other requests */
2191
                        idetape_postpone_request(drive);
2192
                        return ide_stopped;
2193
                }
2194
                if (tape->failed_pc == pc)
2195
                        tape->failed_pc = NULL;
2196
                /* Command finished - Call the callback function */
2197
                return pc->callback(drive);
2198
        }
2199
#ifdef CONFIG_BLK_DEV_IDEDMA
2200
        if (test_and_clear_bit(PC_DMA_IN_PROGRESS, &pc->flags)) {
2201
                printk(KERN_ERR "ide-tape: The tape wants to issue more "
2202
                                "interrupts in DMA mode\n");
2203
                printk(KERN_ERR "ide-tape: DMA disabled, reverting to PIO\n");
2204
                (void) HWIF(drive)->ide_dma_off(drive);
2205
                return ide_do_reset(drive);
2206
        }
2207
#endif /* CONFIG_BLK_DEV_IDEDMA */
2208
        /* Get the number of bytes to transfer */
2209
        bcount.b.high   = HWIF(drive)->INB(IDE_BCOUNTH_REG);
2210
        bcount.b.low    = HWIF(drive)->INB(IDE_BCOUNTL_REG);
2211
        /* on this interrupt */
2212
        ireason.all     = HWIF(drive)->INB(IDE_IREASON_REG);
2213
 
2214
        if (ireason.b.cod) {
2215
                printk(KERN_ERR "ide-tape: CoD != 0 in idetape_pc_intr\n");
2216
                return ide_do_reset(drive);
2217
        }
2218
        if (ireason.b.io == test_bit(PC_WRITING, &pc->flags)) {
2219
                /* Hopefully, we will never get here */
2220
                printk(KERN_ERR "ide-tape: We wanted to %s, ",
2221
                        ireason.b.io ? "Write":"Read");
2222
                printk(KERN_ERR "ide-tape: but the tape wants us to %s !\n",
2223
                        ireason.b.io ? "Read":"Write");
2224
                return ide_do_reset(drive);
2225
        }
2226
        if (!test_bit(PC_WRITING, &pc->flags)) {
2227
                /* Reading - Check that we have enough space */
2228
                temp = pc->actually_transferred + bcount.all;
2229
                if (temp > pc->request_transfer) {
2230
                        if (temp > pc->buffer_size) {
2231
                                printk(KERN_ERR "ide-tape: The tape wants to "
2232
                                        "send us more data than expected "
2233
                                        "- discarding data\n");
2234
                                idetape_discard_data(drive, bcount.all);
2235
                                if (HWGROUP(drive)->handler != NULL)
2236
                                        BUG();
2237
                                ide_set_handler(drive,
2238
                                                &idetape_pc_intr,
2239
                                                IDETAPE_WAIT_CMD,
2240
                                                NULL);
2241
                                return ide_started;
2242
                        }
2243
#if IDETAPE_DEBUG_LOG
2244
                        if (tape->debug_level >= 2)
2245
                                printk(KERN_NOTICE "ide-tape: The tape wants "
2246
                                        "to send us more data than expected "
2247
                                        "- allowing transfer\n");
2248
#endif /* IDETAPE_DEBUG_LOG */
2249
                }
2250
        }
2251
        if (test_bit(PC_WRITING, &pc->flags)) {
2252
                if (pc->bh != NULL)
2253
                        idetape_output_buffers(drive, pc, bcount.all);
2254
                else
2255
                        /* Write the current buffer */
2256
                        HWIF(drive)->atapi_output_bytes(drive,pc->current_position,bcount.all);
2257
        } else {
2258
                if (pc->bh != NULL)
2259
                        idetape_input_buffers(drive, pc, bcount.all);
2260
                else
2261
                        /* Read the current buffer */
2262
                        HWIF(drive)->atapi_input_bytes(drive,pc->current_position,bcount.all);
2263
        }
2264
        /* Update the current position */
2265
        pc->actually_transferred += bcount.all;
2266
        pc->current_position += bcount.all;
2267
#if IDETAPE_DEBUG_LOG
2268
        if (tape->debug_level >= 2)
2269
                printk(KERN_INFO "ide-tape: [cmd %x] done %d\n"
2270
                        pc->c[0], bcount.all);
2271
#endif
2272
        if (HWGROUP(drive)->handler != NULL)
2273
                BUG();
2274
        /* And set the interrupt handler again */
2275
        ide_set_handler (drive, &idetape_pc_intr, IDETAPE_WAIT_CMD, NULL);
2276
        return ide_started;
2277
}
2278
 
2279
/*
2280
 *      Packet Command Interface
2281
 *
2282
 *      The current Packet Command is available in tape->pc, and will not
2283
 *      change until we finish handling it. Each packet command is associated
2284
 *      with a callback function that will be called when the command is
2285
 *      finished.
2286
 *
2287
 *      The handling will be done in three stages:
2288
 *
2289
 *      1.      idetape_issue_packet_command will send the packet command to the
2290
 *              drive, and will set the interrupt handler to idetape_pc_intr.
2291
 *
2292
 *      2.      On each interrupt, idetape_pc_intr will be called. This step
2293
 *              will be repeated until the device signals us that no more
2294
 *              interrupts will be issued.
2295
 *
2296
 *      3.      ATAPI Tape media access commands have immediate status with a
2297
 *              delayed process. In case of a successful initiation of a
2298
 *              media access packet command, the DSC bit will be set when the
2299
 *              actual execution of the command is finished.
2300
 *              Since the tape drive will not issue an interrupt, we have to
2301
 *              poll for this event. In this case, we define the request as
2302
 *              "low priority request" by setting rq_status to
2303
 *              IDETAPE_RQ_POSTPONED,   set a timer to poll for DSC and exit
2304
 *              the driver.
2305
 *
2306
 *              ide.c will then give higher priority to requests which
2307
 *              originate from the other device, until will change rq_status
2308
 *              to RQ_ACTIVE.
2309
 *
2310
 *      4.      When the packet command is finished, it will be checked for errors.
2311
 *
2312
 *      5.      In case an error was found, we queue a request sense packet
2313
 *              command in front of the request queue and retry the operation
2314
 *              upto IDETAPE_MAX_PC_RETRIES times.
2315
 *
2316
 *      6.      In case no error was found, or we decided to give up and not
2317
 *              to retry again, the callback function will be called and then
2318
 *              we will handle the next request.
2319
 *
2320
 */
2321
static ide_startstop_t idetape_transfer_pc(ide_drive_t *drive)
2322
{
2323
        idetape_tape_t *tape = drive->driver_data;
2324
        idetape_pc_t *pc = tape->pc;
2325
        atapi_ireason_t ireason;
2326
        int retries = 100;
2327
        ide_startstop_t startstop;
2328
 
2329
        if (ide_wait_stat(&startstop,drive,DRQ_STAT,BUSY_STAT,WAIT_READY)) {
2330
                printk(KERN_ERR "ide-tape: Strange, packet command "
2331
                        "initiated yet DRQ isn't asserted\n");
2332
                return startstop;
2333
        }
2334
        ireason.all = HWIF(drive)->INB(IDE_IREASON_REG);
2335
        while (retries-- && (!ireason.b.cod || ireason.b.io)) {
2336
                printk(KERN_ERR "ide-tape: (IO,CoD != (0,1) while issuing "
2337
                                "a packet command, retrying\n");
2338
                udelay(100);
2339
                ireason.all = HWIF(drive)->INB(IDE_IREASON_REG);
2340
                if (retries == 0) {
2341
                        printk(KERN_ERR "ide-tape: (IO,CoD != (0,1) while "
2342
                                        "issuing a packet command, ignoring\n");
2343
                        ireason.b.cod = 1;
2344
                        ireason.b.io = 0;
2345
                }
2346
        }
2347
        if (!ireason.b.cod || ireason.b.io) {
2348
                printk(KERN_ERR "ide-tape: (IO,CoD) != (0,1) while issuing "
2349
                                "a packet command\n");
2350
                return ide_do_reset(drive);
2351
        }
2352
        tape->cmd_start_time = jiffies;
2353
        if (HWGROUP(drive)->handler != NULL)    /* paranoia check */
2354
                BUG();
2355
        /* Set the interrupt routine */
2356
        ide_set_handler(drive, &idetape_pc_intr, IDETAPE_WAIT_CMD, NULL);
2357
#ifdef CONFIG_BLK_DEV_IDEDMA
2358
        /* Begin DMA, if necessary */
2359
        if (test_bit(PC_DMA_IN_PROGRESS, &pc->flags))
2360
                (void) (HWIF(drive)->ide_dma_begin(drive));
2361
#endif
2362
        /* Send the actual packet */
2363
        HWIF(drive)->atapi_output_bytes(drive, pc->c, 12);
2364
        return ide_started;
2365
}
2366
 
2367
static ide_startstop_t idetape_issue_packet_command (ide_drive_t *drive, idetape_pc_t *pc)
2368
{
2369
        idetape_tape_t *tape = drive->driver_data;
2370
        atapi_feature_t feature;
2371
        atapi_bcount_t bcount;
2372
 
2373
        feature.all = 0;
2374
 
2375
#if IDETAPE_DEBUG_BUGS
2376
        if (tape->pc->c[0] == IDETAPE_REQUEST_SENSE_CMD &&
2377
            pc->c[0] == IDETAPE_REQUEST_SENSE_CMD) {
2378
                printk(KERN_ERR "ide-tape: possible ide-tape.c bug - "
2379
                        "Two request sense in serial were issued\n");
2380
        }
2381
#endif /* IDETAPE_DEBUG_BUGS */
2382
 
2383
        if (tape->failed_pc == NULL && pc->c[0] != IDETAPE_REQUEST_SENSE_CMD)
2384
                tape->failed_pc = pc;
2385
        /* Set the current packet command */
2386
        tape->pc = pc;
2387
 
2388
        if (pc->retries > IDETAPE_MAX_PC_RETRIES ||
2389
            test_bit(PC_ABORT, &pc->flags)) {
2390
                /*
2391
                 *      We will "abort" retrying a packet command in case
2392
                 *      a legitimate error code was received (crossing a
2393
                 *      filemark, or end of the media, for example).
2394
                 */
2395
                if (!test_bit (PC_ABORT, &pc->flags)) {
2396
                        if (!(pc->c[0] == IDETAPE_TEST_UNIT_READY_CMD &&
2397
                              tape->sense_key == 2 && tape->asc == 4 &&
2398
                             (tape->ascq == 1 || tape->ascq == 8))) {
2399
                                printk(KERN_ERR "ide-tape: %s: I/O error, "
2400
                                                "pc = %2x, key = %2x, "
2401
                                                "asc = %2x, ascq = %2x\n",
2402
                                                tape->name, pc->c[0],
2403
                                                tape->sense_key, tape->asc,
2404
                                                tape->ascq);
2405
                                if (tape->onstream &&
2406
                                    pc->c[0] == IDETAPE_READ_CMD &&
2407
                                    tape->sense_key == 3 &&
2408
                                    tape->asc == 0x11)
2409
                                        /* AJN-1: 11 should be 0x11 */
2410
                                        printk(KERN_ERR "ide-tape: %s: enabling read error recovery\n", tape->name);
2411
                        }
2412
                        /* Giving up */
2413
                        pc->error = IDETAPE_ERROR_GENERAL;
2414
                }
2415
                tape->failed_pc = NULL;
2416
                return pc->callback(drive);
2417
        }
2418
#if IDETAPE_DEBUG_LOG
2419
        if (tape->debug_level >= 2)
2420
                printk(KERN_INFO "ide-tape: Retry number - %d, cmd = %02X\n",
2421
                                pc->retries, pc->c[0]);
2422
#endif /* IDETAPE_DEBUG_LOG */
2423
 
2424
        pc->retries++;
2425
        /* We haven't transferred any data yet */
2426
        pc->actually_transferred = 0;
2427
        pc->current_position = pc->buffer;
2428
        /* Request to transfer the entire buffer at once */
2429
        bcount.all = pc->request_transfer;
2430
 
2431
#ifdef CONFIG_BLK_DEV_IDEDMA
2432
        if (test_and_clear_bit(PC_DMA_ERROR, &pc->flags)) {
2433
                printk(KERN_WARNING "ide-tape: DMA disabled, "
2434
                                "reverting to PIO\n");
2435
                (void) HWIF(drive)->ide_dma_off(drive);
2436
        }
2437
        if (test_bit(PC_DMA_RECOMMENDED, &pc->flags) && drive->using_dma) {
2438
                if (test_bit(PC_WRITING, &pc->flags)) {
2439
                        feature.b.dma = !HWIF(drive)->ide_dma_write(drive);
2440
                } else {
2441
                        feature.b.dma = !HWIF(drive)->ide_dma_read(drive);
2442
                }
2443
        }
2444
#endif /* CONFIG_BLK_DEV_IDEDMA */
2445
 
2446
        if (IDE_CONTROL_REG)
2447
                HWIF(drive)->OUTB(drive->ctl, IDE_CONTROL_REG);
2448
        /* Use PIO/DMA */
2449
        HWIF(drive)->OUTB(feature.all, IDE_FEATURE_REG);
2450
        HWIF(drive)->OUTB(bcount.b.high, IDE_BCOUNTH_REG);
2451
        HWIF(drive)->OUTB(bcount.b.low, IDE_BCOUNTL_REG);
2452
        HWIF(drive)->OUTB(drive->select.all, IDE_SELECT_REG);
2453
#ifdef CONFIG_BLK_DEV_IDEDMA
2454
        if (feature.b.dma)              /* Will begin DMA later */
2455
                set_bit(PC_DMA_IN_PROGRESS, &pc->flags);
2456
#endif /* CONFIG_BLK_DEV_IDEDMA */
2457
        if (test_bit(IDETAPE_DRQ_INTERRUPT, &tape->flags)) {
2458
                ide_execute_command(drive, WIN_PACKETCMD,
2459
                                &idetape_transfer_pc,
2460
                                IDETAPE_WAIT_CMD,
2461
                                NULL);
2462
                return ide_started;
2463
        } else {
2464
                HWIF(drive)->OUTB(WIN_PACKETCMD, IDE_COMMAND_REG);
2465
                return idetape_transfer_pc(drive);
2466
        }
2467
}
2468
 
2469
/*
2470
 *      General packet command callback function.
2471
 */
2472
static ide_startstop_t idetape_pc_callback (ide_drive_t *drive)
2473
{
2474
        idetape_tape_t *tape = drive->driver_data;
2475
 
2476
#if IDETAPE_DEBUG_LOG
2477
        if (tape->debug_level >= 4)
2478
                printk (KERN_INFO "ide-tape: Reached idetape_pc_callback\n");
2479
#endif /* IDETAPE_DEBUG_LOG */
2480
 
2481
        idetape_end_request(drive, tape->pc->error ? 0 : 1);
2482
        return ide_stopped;
2483
}
2484
 
2485
/*
2486
 *      A mode sense command is used to "sense" tape parameters.
2487
 */
2488
static void idetape_create_mode_sense_cmd (idetape_pc_t *pc, u8 page_code)
2489
{
2490
        idetape_init_pc (pc);
2491
        pc->c[0] = IDETAPE_MODE_SENSE_CMD;
2492
        if (page_code != IDETAPE_BLOCK_DESCRIPTOR)
2493
                pc->c[1] = 8;   /* DBD = 1 - Don't return block descriptors */
2494
        pc->c[2] = page_code;
2495
        pc->c[3] = 255;         /* Don't limit the returned information */
2496
        pc->c[4] = 255;         /* (We will just discard data in that case) */
2497
        if (page_code == IDETAPE_BLOCK_DESCRIPTOR)
2498
                pc->request_transfer = 12;
2499
        else if (page_code == IDETAPE_CAPABILITIES_PAGE)
2500
                pc->request_transfer = 24;
2501
        else
2502
                pc->request_transfer = 50;
2503
        pc->callback = &idetape_pc_callback;
2504
}
2505
 
2506
static ide_startstop_t idetape_onstream_buffer_fill_callback (ide_drive_t *drive)
2507
{
2508
        idetape_tape_t *tape = drive->driver_data;
2509
 
2510
        tape->max_frames = tape->pc->buffer[4 + 2];
2511
        tape->cur_frames = tape->pc->buffer[4 + 3];
2512
        if (tape->chrdev_direction == idetape_direction_write)
2513
                tape->tape_head = tape->buffer_head - tape->cur_frames;
2514
        else
2515
                tape->tape_head = tape->buffer_head + tape->cur_frames;
2516
        if (tape->tape_head != tape->last_tape_head) {
2517
                tape->last_tape_head = tape->tape_head;
2518
                tape->tape_still_time_begin = jiffies;
2519
                if (tape->tape_still_time > 200)
2520
                        tape->measure_insert_time = 1;
2521
        }
2522
        tape->tape_still_time = (jiffies - tape->tape_still_time_begin) * 1000 / HZ;
2523
#if USE_IOTRACE
2524
        IO_trace(IO_IDETAPE_FIFO, tape->pipeline_head, tape->buffer_head,
2525
                        tape->tape_head, tape->minor);
2526
#endif
2527
#if IDETAPE_DEBUG_LOG
2528
        if (tape->debug_level >= 1)
2529
                printk(KERN_INFO "ide-tape: buffer fill callback, %d/%d\n",
2530
                        tape->cur_frames, tape->max_frames);
2531
#endif
2532
        idetape_end_request(drive, tape->pc->error ? 0 : 1);
2533
        return ide_stopped;
2534
}
2535
 
2536
static void idetape_queue_onstream_buffer_fill (ide_drive_t *drive)
2537
{
2538
        idetape_pc_t *pc;
2539
        struct request *rq;
2540
 
2541
        pc = idetape_next_pc_storage (drive);
2542
        rq = idetape_next_rq_storage (drive);
2543
        idetape_create_mode_sense_cmd (pc, IDETAPE_BUFFER_FILLING_PAGE);
2544
        pc->callback = idetape_onstream_buffer_fill_callback;
2545
        idetape_queue_pc_head (drive, pc, rq);
2546
}
2547
 
2548
static void calculate_speeds(ide_drive_t *drive)
2549
{
2550
        idetape_tape_t *tape = drive->driver_data;
2551
        int full = 125, empty = 75;
2552
 
2553
        if (time_after(jiffies, tape->controlled_pipeline_head_time + 120 * HZ)) {
2554
                tape->controlled_previous_pipeline_head = tape->controlled_last_pipeline_head;
2555
                tape->controlled_previous_head_time = tape->controlled_pipeline_head_time;
2556
                tape->controlled_last_pipeline_head = tape->pipeline_head;
2557
                tape->controlled_pipeline_head_time = jiffies;
2558
        }
2559
        if (time_after(jiffies, tape->controlled_pipeline_head_time + 60 * HZ))
2560
                tape->controlled_pipeline_head_speed = (tape->pipeline_head - tape->controlled_last_pipeline_head) * 32 * HZ / (jiffies - tape->controlled_pipeline_head_time);
2561
        else if (time_after(jiffies, tape->controlled_previous_head_time))
2562
                tape->controlled_pipeline_head_speed = (tape->pipeline_head - tape->controlled_previous_pipeline_head) * 32 * HZ / (jiffies - tape->controlled_previous_head_time);
2563
 
2564
        if (tape->nr_pending_stages < tape->max_stages /*- 1 */) {
2565
                /* -1 for read mode error recovery */
2566
                if (time_after(jiffies, tape->uncontrolled_previous_head_time + 10 * HZ)) {
2567
                        tape->uncontrolled_pipeline_head_time = jiffies;
2568
                        tape->uncontrolled_pipeline_head_speed = (tape->pipeline_head - tape->uncontrolled_previous_pipeline_head) * 32 * HZ / (jiffies - tape->uncontrolled_previous_head_time);
2569
                }
2570
        } else {
2571
                tape->uncontrolled_previous_head_time = jiffies;
2572
                tape->uncontrolled_previous_pipeline_head = tape->pipeline_head;
2573
                if (time_after(jiffies, tape->uncontrolled_pipeline_head_time + 30 * HZ)) {
2574
                        tape->uncontrolled_pipeline_head_time = jiffies;
2575
                }
2576
        }
2577
        tape->pipeline_head_speed = IDE_MAX(tape->uncontrolled_pipeline_head_speed, tape->controlled_pipeline_head_speed);
2578
        if (tape->speed_control == 0) {
2579
                tape->max_insert_speed = 5000;
2580
        } else if (tape->speed_control == 1) {
2581
                if (tape->nr_pending_stages >= tape->max_stages / 2)
2582
                        tape->max_insert_speed = tape->pipeline_head_speed +
2583
                                (1100 - tape->pipeline_head_speed) * 2 * (tape->nr_pending_stages - tape->max_stages / 2) / tape->max_stages;
2584
                else
2585
                        tape->max_insert_speed = 500 +
2586
                                (tape->pipeline_head_speed - 500) * 2 * tape->nr_pending_stages / tape->max_stages;
2587
                if (tape->nr_pending_stages >= tape->max_stages * 99 / 100)
2588
                        tape->max_insert_speed = 5000;
2589
        } else if (tape->speed_control == 2) {
2590
                tape->max_insert_speed = tape->pipeline_head_speed * empty / 100 +
2591
                        (tape->pipeline_head_speed * full / 100 - tape->pipeline_head_speed * empty / 100) * tape->nr_pending_stages / tape->max_stages;
2592
        } else
2593
                tape->max_insert_speed = tape->speed_control;
2594
        tape->max_insert_speed = IDE_MAX(tape->max_insert_speed, 500);
2595
}
2596
 
2597
static ide_startstop_t idetape_media_access_finished (ide_drive_t *drive)
2598
{
2599
        idetape_tape_t *tape = drive->driver_data;
2600
        idetape_pc_t *pc = tape->pc;
2601
        atapi_status_t status;
2602
 
2603
        if (tape->onstream)
2604
                printk(KERN_INFO "ide-tape: bug: "
2605
                        "onstream, media_access_finished\n");
2606
 
2607
        status.all = HWIF(drive)->INB(IDE_STATUS_REG);
2608
 
2609
        if (status.b.dsc) {
2610
                if (status.b.check) {
2611
                        /* Error detected */
2612
                        printk(KERN_ERR "ide-tape: %s: I/O error: "
2613
                            "pc = %2x, key = %2x, asc = %2x, ascq = %2x\n",
2614
                            tape->name, pc->c[0],
2615
                            tape->sense_key, tape->asc, tape->ascq);
2616
 
2617
                        /* Retry operation */
2618
                        return idetape_retry_pc(drive);
2619
                }
2620
                pc->error = 0;
2621
                if (tape->failed_pc == pc)
2622
                        tape->failed_pc = NULL;
2623
        } else {
2624
                pc->error = IDETAPE_ERROR_GENERAL;
2625
                tape->failed_pc = NULL;
2626
        }
2627
        return pc->callback (drive);
2628
}
2629
 
2630
static ide_startstop_t idetape_rw_callback (ide_drive_t *drive)
2631
{
2632
        idetape_tape_t *tape = drive->driver_data;
2633
        struct request *rq = HWGROUP(drive)->rq;
2634
        int blocks = tape->pc->actually_transferred / tape->tape_block_size;
2635
 
2636
        tape->avg_size += blocks * tape->tape_block_size;
2637
        tape->insert_size += blocks * tape->tape_block_size;
2638
        if (tape->insert_size > 1024 * 1024)
2639
                tape->measure_insert_time = 1;
2640
        if (tape->measure_insert_time) {
2641
                tape->measure_insert_time = 0;
2642
                tape->insert_time = jiffies;
2643
                tape->insert_size = 0;
2644
        }
2645
        if (time_after(jiffies, tape->insert_time))
2646
                tape->insert_speed = tape->insert_size / 1024 * HZ / (jiffies - tape->insert_time);
2647
        if (jiffies - tape->avg_time >= HZ) {
2648
                tape->avg_speed = tape->avg_size * HZ / (jiffies - tape->avg_time) / 1024;
2649
                tape->avg_size = 0;
2650
                tape->avg_time = jiffies;
2651
        }
2652
 
2653
#if IDETAPE_DEBUG_LOG   
2654
        if (tape->debug_level >= 4)
2655
                printk(KERN_INFO "ide-tape: Reached idetape_rw_callback\n");
2656
#endif /* IDETAPE_DEBUG_LOG */
2657
 
2658
        tape->first_frame_position += blocks;
2659
        rq->current_nr_sectors -= blocks;
2660
 
2661
        if (!tape->pc->error)
2662
                idetape_end_request(drive, 1);
2663
        else
2664
                idetape_end_request(drive, tape->pc->error);
2665
        return ide_stopped;
2666
}
2667
 
2668
static void idetape_create_read_cmd (idetape_tape_t *tape, idetape_pc_t *pc, unsigned int length, struct buffer_head *bh)
2669
{
2670
        struct buffer_head *p = bh;
2671
        idetape_init_pc (pc);
2672
        pc->c[0] = IDETAPE_READ_CMD;
2673
        put_unaligned(htonl (length), (unsigned int *) &pc->c[1]);
2674
        pc->c[1] = 1;
2675
        pc->callback = &idetape_rw_callback;
2676
        pc->bh = bh;
2677
        atomic_set(&bh->b_count, 0);
2678
        pc->buffer = NULL;
2679
        if (tape->onstream) {
2680
                while (p) {
2681
                        atomic_set(&p->b_count, 0);
2682
                        p = p->b_reqnext;
2683
                }
2684
        }
2685
        if (!tape->onstream) {
2686
                pc->request_transfer = pc->buffer_size = length * tape->tape_block_size;
2687
                if (pc->request_transfer == tape->stage_size)
2688
                        set_bit(PC_DMA_RECOMMENDED, &pc->flags);
2689
        } else  {
2690
                if (length) {
2691
                        pc->request_transfer = pc->buffer_size = 32768 + 512;
2692
                        set_bit(PC_DMA_RECOMMENDED, &pc->flags);
2693
                } else
2694
                        pc->request_transfer = 0;
2695
        }
2696
}
2697
 
2698
static void idetape_create_read_buffer_cmd(idetape_tape_t *tape, idetape_pc_t *pc, unsigned int length, struct buffer_head *bh)
2699
{
2700
        int size = 32768;
2701
 
2702
        struct buffer_head *p = bh;
2703
        idetape_init_pc(pc);
2704
        pc->c[0] = IDETAPE_READ_BUFFER_CMD;
2705
        pc->c[1] = IDETAPE_RETRIEVE_FAULTY_BLOCK;
2706
        pc->c[7] = size >> 8;
2707
        pc->c[8] = size & 0xff;
2708
        pc->callback = &idetape_pc_callback;
2709
        pc->bh = bh;
2710
        atomic_set(&bh->b_count, 0);
2711
        pc->buffer = NULL;
2712
        while (p) {
2713
                atomic_set(&p->b_count, 0);
2714
                p = p->b_reqnext;
2715
        }
2716
        pc->request_transfer = pc->buffer_size = size;
2717
}
2718
 
2719
static void idetape_create_write_cmd (idetape_tape_t *tape, idetape_pc_t *pc, unsigned int length, struct buffer_head *bh)
2720
{
2721
        struct buffer_head *p = bh;
2722
        idetape_init_pc(pc);
2723
        pc->c[0] = IDETAPE_WRITE_CMD;
2724
        put_unaligned(htonl (length), (unsigned int *) &pc->c[1]);
2725
        pc->c[1] = 1;
2726
        pc->callback = &idetape_rw_callback;
2727
        set_bit (PC_WRITING, &pc->flags);
2728
        if (tape->onstream) {
2729
                while (p) {
2730
                        atomic_set(&p->b_count, p->b_size);
2731
                        p = p->b_reqnext;
2732
                }
2733
        }
2734
        pc->bh = bh;
2735
        pc->b_data = bh->b_data;
2736
        pc->b_count = atomic_read(&bh->b_count);
2737
        pc->buffer = NULL;
2738
        if (!tape->onstream) {
2739
                pc->request_transfer = pc->buffer_size = length * tape->tape_block_size;
2740
                if (pc->request_transfer == tape->stage_size)
2741
                        set_bit(PC_DMA_RECOMMENDED, &pc->flags);
2742
        } else  {
2743
                if (length) {
2744
                        pc->request_transfer = pc->buffer_size = 32768 + 512;
2745
                        set_bit(PC_DMA_RECOMMENDED, &pc->flags);
2746
                } else
2747
                        pc->request_transfer = 0;
2748
        }
2749
}
2750
 
2751
/*
2752
 * This is our end_request replacement function.
2753
 */
2754
static int idetape_do_end_request (ide_drive_t *drive, int uptodate)
2755
{
2756
        struct request *rq;
2757
        unsigned long flags;
2758
        int ret = 1;
2759
 
2760
        spin_lock_irqsave(&io_request_lock, flags);
2761
        rq = HWGROUP(drive)->rq;
2762
 
2763
        /*
2764
         * decide whether to reenable DMA -- 3 is a random magic for now,
2765
         * if we DMA timeout more than 3 times, just stay in PIO
2766
         */
2767
        if (drive->state == DMA_PIO_RETRY && drive->retry_pio <= 3) {
2768
                drive->state = 0;
2769
                HWGROUP(drive)->hwif->ide_dma_on(drive);
2770
        }
2771
 
2772
        if (!end_that_request_first(rq, uptodate, drive->name)) {
2773
                add_blkdev_randomness(MAJOR(rq->rq_dev));
2774
                blkdev_dequeue_request(rq);
2775
                HWGROUP(drive)->rq = NULL;
2776
                end_that_request_last(rq);
2777
                ret = 0;
2778
        }
2779
        spin_unlock_irqrestore(&io_request_lock, flags);
2780
        return ret;
2781
}
2782
 
2783
/*
2784
 *      idetape_do_request is our request handling function.
2785
 */
2786
static ide_startstop_t idetape_do_request (ide_drive_t *drive, struct request *rq, unsigned long block)
2787
{
2788
        idetape_tape_t *tape = drive->driver_data;
2789
        idetape_pc_t *pc;
2790
        struct request *postponed_rq = tape->postponed_rq;
2791
        atapi_status_t status;
2792
 
2793
#if IDETAPE_DEBUG_LOG
2794
        if (tape->debug_level >= 5)
2795
                printk(KERN_INFO "ide-tape: rq_status: %d, "
2796
                        "rq_dev: %u, cmd: %d, errors: %d\n", rq->rq_status,
2797
                        (unsigned int) rq->rq_dev, rq->cmd, rq->errors);
2798
        if (tape->debug_level >= 2)
2799
                printk(KERN_INFO "ide-tape: sector: %ld, "
2800
                        "nr_sectors: %ld, current_nr_sectors: %ld\n",
2801
                        rq->sector, rq->nr_sectors, rq->current_nr_sectors);
2802
#endif /* IDETAPE_DEBUG_LOG */
2803
 
2804
        if (!IDETAPE_RQ_CMD(rq->cmd)) {
2805
                /*
2806
                 *      We do not support buffer cache originated requests.
2807
                 */
2808
                printk(KERN_NOTICE "ide-tape: %s: Unsupported command in "
2809
                        "request queue (%d)\n", drive->name, rq->cmd);
2810
                idetape_do_end_request(drive, 0);
2811
                return ide_stopped;
2812
        }
2813
 
2814
        /*
2815
         *      Retry a failed packet command
2816
         */
2817
        if (tape->failed_pc != NULL &&
2818
            tape->pc->c[0] == IDETAPE_REQUEST_SENSE_CMD) {
2819
                return idetape_issue_packet_command(drive, tape->failed_pc);
2820
        }
2821
#if IDETAPE_DEBUG_BUGS
2822
        if (postponed_rq != NULL)
2823
                if (rq != postponed_rq) {
2824
                        printk(KERN_ERR "ide-tape: ide-tape.c bug - "
2825
                                        "Two DSC requests were queued\n");
2826
                        idetape_end_request(drive, 0);
2827
                        return ide_stopped;
2828
                }
2829
#endif /* IDETAPE_DEBUG_BUGS */
2830
 
2831
        tape->postponed_rq = NULL;
2832
 
2833
        /*
2834
         *      If the tape is still busy, postpone our request and service
2835
         *      the other device meanwhile.
2836
         */
2837
        status.all = HWIF(drive)->INB(IDE_STATUS_REG);
2838
 
2839
        /*
2840
         * The OnStream tape drive doesn't support DSC. Assume
2841
         * that DSC is always set.
2842
         */
2843
        if (tape->onstream)
2844
                status.b.dsc = 1;
2845
        if (!drive->dsc_overlap && rq->cmd != IDETAPE_PC_RQ2)
2846
                set_bit(IDETAPE_IGNORE_DSC, &tape->flags);
2847
 
2848
        /*
2849
         * For the OnStream tape, check the current status of the tape
2850
         * internal buffer using data gathered from the buffer fill
2851
         * mode page, and postpone our request, effectively "disconnecting"
2852
         * from the IDE bus, in case the buffer is full (writing) or
2853
         * empty (reading), and there is a danger that our request will
2854
         * hold the IDE bus during actual media access.
2855
         */
2856
        if (tape->tape_still_time > 100 && tape->tape_still_time < 200)
2857
                tape->measure_insert_time = 1;
2858
        if (tape->req_buffer_fill &&
2859
            (rq->cmd == IDETAPE_WRITE_RQ || rq->cmd == IDETAPE_READ_RQ)) {
2860
                tape->req_buffer_fill = 0;
2861
                tape->writes_since_buffer_fill = 0;
2862
                tape->reads_since_buffer_fill = 0;
2863
                tape->last_buffer_fill = jiffies;
2864
                idetape_queue_onstream_buffer_fill(drive);
2865
                if (time_after(jiffies, tape->insert_time))
2866
                        tape->insert_speed = tape->insert_size / 1024 * HZ / (jiffies - tape->insert_time);
2867
                return ide_stopped;
2868
        }
2869
        if (time_after(jiffies, tape->insert_time))
2870
                tape->insert_speed = tape->insert_size / 1024 * HZ / (jiffies - tape->insert_time);
2871
        calculate_speeds(drive);
2872
        if (tape->onstream && tape->max_frames &&
2873
            ((rq->cmd == IDETAPE_WRITE_RQ &&
2874
              ( tape->cur_frames == tape->max_frames ||
2875
                ( tape->speed_control && tape->cur_frames > 5 &&
2876
                       (tape->insert_speed > tape->max_insert_speed ||
2877
                        (0 /* tape->cur_frames > 30 && tape->tape_still_time > 200 */) ) ) ) ) ||
2878
             (rq->cmd == IDETAPE_READ_RQ &&
2879
              ( tape->cur_frames == 0 ||
2880
                ( tape->speed_control && (tape->cur_frames < tape->max_frames - 5) &&
2881
                        tape->insert_speed > tape->max_insert_speed ) ) && rq->nr_sectors) ) ) {
2882
#if IDETAPE_DEBUG_LOG
2883
                if (tape->debug_level >= 4)
2884
                        printk(KERN_INFO "ide-tape: postponing request, "
2885
                                        "cmd %d, cur %d, max %d\n",
2886
                                rq->cmd, tape->cur_frames, tape->max_frames);
2887
#endif
2888
                if (tape->postpone_cnt++ < 500) {
2889
                        status.b.dsc = 0;
2890
                        tape->req_buffer_fill = 1;
2891
                }
2892
#if ONSTREAM_DEBUG
2893
                else if (tape->debug_level >= 4)
2894
                        printk(KERN_INFO "ide-tape: %s: postpone_cnt %d\n",
2895
                                tape->name, tape->postpone_cnt);
2896
#endif
2897
        }
2898
        if (!test_and_clear_bit(IDETAPE_IGNORE_DSC, &tape->flags) &&
2899
            !status.b.dsc) {
2900
                if (postponed_rq == NULL) {
2901
                        tape->dsc_polling_start = jiffies;
2902
                        tape->dsc_polling_frequency = tape->best_dsc_rw_frequency;
2903
                        tape->dsc_timeout = jiffies + IDETAPE_DSC_RW_TIMEOUT;
2904
                } else if ((signed long) (jiffies - tape->dsc_timeout) > 0) {
2905
                        printk(KERN_ERR "ide-tape: %s: DSC timeout\n",
2906
                                tape->name);
2907
                        if (rq->cmd == IDETAPE_PC_RQ2) {
2908
                                idetape_media_access_finished(drive);
2909
                                return ide_stopped;
2910
                        } else {
2911
                                return ide_do_reset(drive);
2912
                        }
2913
                } else if (jiffies - tape->dsc_polling_start > IDETAPE_DSC_MA_THRESHOLD)
2914
                        tape->dsc_polling_frequency = IDETAPE_DSC_MA_SLOW;
2915
                idetape_postpone_request(drive);
2916
                return ide_stopped;
2917
        }
2918
        switch (rq->cmd) {
2919
                case IDETAPE_READ_RQ:
2920
                        tape->buffer_head++;
2921
#if USE_IOTRACE
2922
                        IO_trace(IO_IDETAPE_FIFO, tape->pipeline_head, tape->buffer_head, tape->tape_head, tape->minor);
2923
#endif
2924
                        tape->postpone_cnt = 0;
2925
                        tape->reads_since_buffer_fill++;
2926
                        if (tape->onstream) {
2927
                                if (tape->cur_frames - tape->reads_since_buffer_fill <= 0)
2928
                                        tape->req_buffer_fill = 1;
2929
                                if (time_after(jiffies, tape->last_buffer_fill + 5 * HZ / 100))
2930
                                        tape->req_buffer_fill = 1;
2931
                        }
2932
                        pc = idetape_next_pc_storage(drive);
2933
                        idetape_create_read_cmd(tape, pc, rq->current_nr_sectors, rq->bh);
2934
                        break;
2935
                case IDETAPE_WRITE_RQ:
2936
                        tape->buffer_head++;
2937
#if USE_IOTRACE
2938
                        IO_trace(IO_IDETAPE_FIFO, tape->pipeline_head, tape->buffer_head, tape->tape_head, tape->minor);
2939
#endif
2940
                        tape->postpone_cnt = 0;
2941
                        tape->writes_since_buffer_fill++;
2942
                        if (tape->onstream) {
2943
                                if (tape->cur_frames + tape->writes_since_buffer_fill >= tape->max_frames)
2944
                                        tape->req_buffer_fill = 1;
2945
                                if (time_after(jiffies, tape->last_buffer_fill + 5 * HZ / 100))
2946
                                        tape->req_buffer_fill = 1;
2947
                                calculate_speeds(drive);
2948
                        }
2949
                        pc = idetape_next_pc_storage(drive);
2950
                        idetape_create_write_cmd(tape, pc, rq->current_nr_sectors, rq->bh);
2951
                        break;
2952
                case IDETAPE_READ_BUFFER_RQ:
2953
                        tape->postpone_cnt = 0;
2954
                        pc = idetape_next_pc_storage(drive);
2955
                        idetape_create_read_buffer_cmd(tape, pc, rq->current_nr_sectors, rq->bh);
2956
                        break;
2957
                case IDETAPE_ABORTED_WRITE_RQ:
2958
                        rq->cmd = IDETAPE_WRITE_RQ;
2959
                        idetape_end_request(drive, IDETAPE_ERROR_EOD);
2960
                        return ide_stopped;
2961
                case IDETAPE_ABORTED_READ_RQ:
2962
#if IDETAPE_DEBUG_LOG
2963
                        if (tape->debug_level >= 2)
2964
                                printk(KERN_INFO "ide-tape: %s: detected "
2965
                                        "aborted read rq\n", tape->name);
2966
#endif
2967
                        rq->cmd = IDETAPE_READ_RQ;
2968
                        idetape_end_request(drive, IDETAPE_ERROR_EOD);
2969
                        return ide_stopped;
2970
                case IDETAPE_PC_RQ1:
2971
                        pc = (idetape_pc_t *) rq->buffer;
2972
                        rq->cmd = IDETAPE_PC_RQ2;
2973
                        break;
2974
                case IDETAPE_PC_RQ2:
2975
                        idetape_media_access_finished(drive);
2976
                        return ide_stopped;
2977
                default:
2978
                        printk(KERN_ERR "ide-tape: bug in "
2979
                                "IDETAPE_RQ_CMD macro\n");
2980
                        idetape_end_request(drive, 0);
2981
                        return ide_stopped;
2982
        }
2983
        return idetape_issue_packet_command(drive, pc);
2984
}
2985
 
2986
/*
2987
 *      Pipeline related functions
2988
 */
2989
static inline int idetape_pipeline_active (idetape_tape_t *tape)
2990
{
2991
        int rc1, rc2;
2992
 
2993
        rc1 = test_bit(IDETAPE_PIPELINE_ACTIVE, &tape->flags);
2994
        rc2 = (tape->active_data_request != NULL);
2995
        return rc1;
2996
}
2997
 
2998
/*
2999
 *      idetape_kmalloc_stage uses __get_free_page to allocate a pipeline
3000
 *      stage, along with all the necessary small buffers which together make
3001
 *      a buffer of size tape->stage_size (or a bit more). We attempt to
3002
 *      combine sequential pages as much as possible.
3003
 *
3004
 *      Returns a pointer to the new allocated stage, or NULL if we
3005
 *      can't (or don't want to) allocate a stage.
3006
 *
3007
 *      Pipeline stages are optional and are used to increase performance.
3008
 *      If we can't allocate them, we'll manage without them.
3009
 */
3010
static idetape_stage_t *__idetape_kmalloc_stage (idetape_tape_t *tape, int full, int clear)
3011
{
3012
        idetape_stage_t *stage;
3013
        struct buffer_head *prev_bh, *bh;
3014
        int pages = tape->pages_per_stage;
3015
        char *b_data;
3016
 
3017
        if ((stage = (idetape_stage_t *) kmalloc(sizeof(idetape_stage_t),GFP_KERNEL)) == NULL)
3018
                return NULL;
3019
        stage->next = NULL;
3020
 
3021
        bh = stage->bh = (struct buffer_head *) kmalloc(sizeof(struct buffer_head), GFP_KERNEL);
3022
        if (bh == NULL)
3023
                goto abort;
3024
        bh->b_reqnext = NULL;
3025
        if ((bh->b_data = (char *) __get_free_page (GFP_KERNEL)) == NULL)
3026
                goto abort;
3027
        if (clear)
3028
                memset(bh->b_data, 0, PAGE_SIZE);
3029
        bh->b_size = PAGE_SIZE;
3030
        atomic_set(&bh->b_count, full ? bh->b_size : 0);
3031
        set_bit(BH_Lock, &bh->b_state);
3032
 
3033
        while (--pages) {
3034
                if ((b_data = (char *) __get_free_page (GFP_KERNEL)) == NULL)
3035
                        goto abort;
3036
                if (clear)
3037
                        memset(b_data, 0, PAGE_SIZE);
3038
                if (bh->b_data == b_data + PAGE_SIZE) {
3039
                        bh->b_size += PAGE_SIZE;
3040
                        bh->b_data -= PAGE_SIZE;
3041
                        if (full)
3042
                                atomic_add(PAGE_SIZE, &bh->b_count);
3043
                        continue;
3044
                }
3045
                if (b_data == bh->b_data + bh->b_size) {
3046
                        bh->b_size += PAGE_SIZE;
3047
                        if (full)
3048
                                atomic_add(PAGE_SIZE, &bh->b_count);
3049
                        continue;
3050
                }
3051
                prev_bh = bh;
3052
                if ((bh = (struct buffer_head *) kmalloc(sizeof(struct buffer_head), GFP_KERNEL)) == NULL) {
3053
                        free_page((unsigned long) b_data);
3054
                        goto abort;
3055
                }
3056
                bh->b_reqnext = NULL;
3057
                bh->b_data = b_data;
3058
                bh->b_size = PAGE_SIZE;
3059
                atomic_set(&bh->b_count, full ? bh->b_size : 0);
3060
                set_bit(BH_Lock, &bh->b_state);
3061
                prev_bh->b_reqnext = bh;
3062
        }
3063
        bh->b_size -= tape->excess_bh_size;
3064
        if (full)
3065
                atomic_sub(tape->excess_bh_size, &bh->b_count);
3066
        if (tape->onstream)
3067
                stage->aux = (os_aux_t *) (bh->b_data + bh->b_size - OS_AUX_SIZE);
3068
        return stage;
3069
abort:
3070
        __idetape_kfree_stage(stage);
3071
        return NULL;
3072
}
3073
 
3074
static idetape_stage_t *idetape_kmalloc_stage (idetape_tape_t *tape)
3075
{
3076
        idetape_stage_t *cache_stage = tape->cache_stage;
3077
 
3078
#if IDETAPE_DEBUG_LOG
3079
        if (tape->debug_level >= 4)
3080
                printk (KERN_INFO "ide-tape: Reached %s\n", __FUNCTION__);
3081
#endif /* IDETAPE_DEBUG_LOG */
3082
 
3083
        if (tape->nr_stages >= tape->max_stages)
3084
                return NULL;
3085
        if (cache_stage != NULL) {
3086
                tape->cache_stage = NULL;
3087
                return cache_stage;
3088
        }
3089
        return __idetape_kmalloc_stage(tape, 0, 0);
3090
}
3091
 
3092
static void idetape_copy_stage_from_user (idetape_tape_t *tape, idetape_stage_t *stage, const char *buf, int n)
3093
{
3094
        struct buffer_head *bh = tape->bh;
3095
        int count;
3096
 
3097
        while (n) {
3098
#if IDETAPE_DEBUG_BUGS
3099
                if (bh == NULL) {
3100
                        printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
3101
                                __FUNCTION__);
3102
                        return;
3103
                }
3104
#endif /* IDETAPE_DEBUG_BUGS */
3105
                count = IDE_MIN(bh->b_size - atomic_read(&bh->b_count), n);
3106
                copy_from_user(bh->b_data + atomic_read(&bh->b_count), buf, count);
3107
                n -= count;
3108
                atomic_add(count, &bh->b_count);
3109
                buf += count;
3110
                if (atomic_read(&bh->b_count) == bh->b_size) {
3111
                        bh = bh->b_reqnext;
3112
                        if (bh)
3113
                                atomic_set(&bh->b_count, 0);
3114
                }
3115
        }
3116
        tape->bh = bh;
3117
}
3118
 
3119
static void idetape_copy_stage_to_user (idetape_tape_t *tape, char *buf, idetape_stage_t *stage, int n)
3120
{
3121
        struct buffer_head *bh = tape->bh;
3122
        int count;
3123
 
3124
        while (n) {
3125
#if IDETAPE_DEBUG_BUGS
3126
                if (bh == NULL) {
3127
                        printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
3128
                                __FUNCTION__);
3129
                        return;
3130
                }
3131
#endif /* IDETAPE_DEBUG_BUGS */
3132
                count = IDE_MIN(tape->b_count, n);
3133
                copy_to_user(buf, tape->b_data, count);
3134
                n -= count;
3135
                tape->b_data += count;
3136
                tape->b_count -= count;
3137
                buf += count;
3138
                if (!tape->b_count) {
3139
                        tape->bh = bh = bh->b_reqnext;
3140
                        if (bh) {
3141
                                tape->b_data = bh->b_data;
3142
                                tape->b_count = atomic_read(&bh->b_count);
3143
                        }
3144
                }
3145
        }
3146
}
3147
 
3148
static void idetape_init_merge_stage (idetape_tape_t *tape)
3149
{
3150
        struct buffer_head *bh = tape->merge_stage->bh;
3151
 
3152
        tape->bh = bh;
3153
        if (tape->chrdev_direction == idetape_direction_write) {
3154
                atomic_set(&bh->b_count, 0);
3155
        } else {
3156
                tape->b_data = bh->b_data;
3157
                tape->b_count = atomic_read(&bh->b_count);
3158
        }
3159
}
3160
 
3161
static void idetape_switch_buffers (idetape_tape_t *tape, idetape_stage_t *stage)
3162
{
3163
        struct buffer_head *tmp;
3164
        os_aux_t *tmp_aux;
3165
 
3166
        tmp = stage->bh;
3167
        tmp_aux = stage->aux;
3168
        stage->bh = tape->merge_stage->bh;
3169
        stage->aux = tape->merge_stage->aux;
3170
        tape->merge_stage->bh = tmp;
3171
        tape->merge_stage->aux = tmp_aux;
3172
        idetape_init_merge_stage (tape);
3173
}
3174
 
3175
/*
3176
 *      idetape_add_stage_tail adds a new stage at the end of the pipeline.
3177
 */
3178
static void idetape_add_stage_tail (ide_drive_t *drive,idetape_stage_t *stage)
3179
{
3180
        idetape_tape_t *tape = drive->driver_data;
3181
        unsigned long flags;
3182
 
3183
#if IDETAPE_DEBUG_LOG
3184
        if (tape->debug_level >= 4)
3185
                printk(KERN_INFO "ide-tape: Reached %s\n", __FUNCTION__);
3186
#endif /* IDETAPE_DEBUG_LOG */
3187
        spin_lock_irqsave(&tape->spinlock, flags);
3188
        stage->next = NULL;
3189
        if (tape->last_stage != NULL)
3190
                tape->last_stage->next=stage;
3191
        else
3192
                tape->first_stage = tape->next_stage=stage;
3193
        tape->last_stage = stage;
3194
        if (tape->next_stage == NULL)
3195
                tape->next_stage = tape->last_stage;
3196
        tape->nr_stages++;
3197
        tape->nr_pending_stages++;
3198
        spin_unlock_irqrestore(&tape->spinlock, flags);
3199
}
3200
 
3201
/*
3202
 * Initialize the OnStream AUX
3203
 */
3204
static void idetape_init_stage (ide_drive_t *drive, idetape_stage_t *stage, int frame_type, int logical_blk_num)
3205
{
3206
        idetape_tape_t *tape = drive->driver_data;
3207
        os_aux_t *aux = stage->aux;
3208
        os_partition_t *par = &aux->partition;
3209
        os_dat_t *dat = &aux->dat;
3210
 
3211
        if (!tape->onstream || tape->raw)
3212
                return;
3213
        memset(aux, 0, sizeof(*aux));
3214
        aux->format_id = htonl(0);
3215
        memcpy(aux->application_sig, "LIN3", 4);
3216
        aux->hdwr = htonl(0);
3217
        aux->frame_type = frame_type;
3218
 
3219
        if (frame_type == OS_FRAME_TYPE_HEADER) {
3220
                aux->update_frame_cntr = htonl(tape->update_frame_cntr);
3221
                par->partition_num = OS_CONFIG_PARTITION;
3222
                par->par_desc_ver = OS_PARTITION_VERSION;
3223
                par->wrt_pass_cntr = htons(0xffff);
3224
                par->first_frame_addr = htonl(0);
3225
                par->last_frame_addr = htonl(0xbb7); /* 2999 */
3226
                aux->frame_seq_num = htonl(0);
3227
                aux->logical_blk_num_high = htonl(0);
3228
                aux->logical_blk_num = htonl(0);
3229
                aux->next_mark_addr = htonl(tape->first_mark_addr);
3230
        } else {
3231
                aux->update_frame_cntr = htonl(0);
3232
                par->partition_num = OS_DATA_PARTITION;
3233
                par->par_desc_ver = OS_PARTITION_VERSION;
3234
                par->wrt_pass_cntr = htons(tape->wrt_pass_cntr);
3235
                par->first_frame_addr = htonl(OS_DATA_STARTFRAME1);
3236
                par->last_frame_addr = htonl(tape->capacity);
3237
                aux->frame_seq_num = htonl(logical_blk_num);
3238
                aux->logical_blk_num_high = htonl(0);
3239
                aux->logical_blk_num = htonl(logical_blk_num);
3240
                dat->dat_sz = 8;
3241
                dat->reserved1 = 0;
3242
                dat->entry_cnt = 1;
3243
                dat->reserved3 = 0;
3244
                if (frame_type == OS_FRAME_TYPE_DATA)
3245
                        dat->dat_list[0].blk_sz = htonl(32 * 1024);
3246
                else
3247
                        dat->dat_list[0].blk_sz = 0;
3248
                dat->dat_list[0].blk_cnt = htons(1);
3249
                if (frame_type == OS_FRAME_TYPE_MARKER)
3250
                        dat->dat_list[0].flags = OS_DAT_FLAGS_MARK;
3251
                else
3252
                        dat->dat_list[0].flags = OS_DAT_FLAGS_DATA;
3253
                dat->dat_list[0].reserved = 0;
3254
        }
3255
        /* shouldn't this be htonl ?? */
3256
        aux->filemark_cnt = ntohl(tape->filemark_cnt);
3257
        /* shouldn't this be htonl ?? */
3258
        aux->phys_fm = ntohl(0xffffffff);
3259
        /* shouldn't this be htonl ?? */
3260
        aux->last_mark_addr = ntohl(tape->last_mark_addr);
3261
}
3262
 
3263
/*
3264
 *      idetape_wait_for_request installs a completion in a pending request
3265
 *      and sleeps until it is serviced.
3266
 *
3267
 *      The caller should ensure that the request will not be serviced
3268
 *      before we install the completion (usually by disabling interrupts).
3269
 */
3270
static void idetape_wait_for_request (ide_drive_t *drive, struct request *rq)
3271
{
3272
        DECLARE_COMPLETION(wait);
3273
        idetape_tape_t *tape = drive->driver_data;
3274
 
3275
#if IDETAPE_DEBUG_BUGS
3276
        if (rq == NULL || !IDETAPE_RQ_CMD (rq->cmd)) {
3277
                printk(KERN_ERR "ide-tape: bug: Trying to sleep on "
3278
                        "non-valid request\n");
3279
                return;
3280
        }
3281
#endif /* IDETAPE_DEBUG_BUGS */
3282
        rq->waiting = &wait;
3283
        tape->waiting = &wait;
3284
        spin_unlock(&tape->spinlock);
3285
        wait_for_completion(&wait);
3286
        /* The stage and its struct request have been deallocated */
3287
        tape->waiting = NULL;
3288
        spin_lock_irq(&tape->spinlock);
3289
}
3290
 
3291
static ide_startstop_t idetape_read_position_callback (ide_drive_t *drive)
3292
{
3293
        idetape_tape_t *tape = drive->driver_data;
3294
        idetape_read_position_result_t *result;
3295
 
3296
#if IDETAPE_DEBUG_LOG
3297
        if (tape->debug_level >= 4)
3298
                printk(KERN_INFO "ide-tape: Reached %s\n", __FUNCTION__);
3299
#endif /* IDETAPE_DEBUG_LOG */
3300
 
3301
        if (!tape->pc->error) {
3302
                result = (idetape_read_position_result_t *) tape->pc->buffer;
3303
#if IDETAPE_DEBUG_LOG
3304
                if (tape->debug_level >= 2)
3305
                        printk(KERN_INFO "ide-tape: BOP - %s\n",
3306
                                result->bop ? "Yes":"No");
3307
                if (tape->debug_level >= 2)
3308
                        printk(KERN_INFO "ide-tape: EOP - %s\n",
3309
                                result->eop ? "Yes":"No");
3310
#endif /* IDETAPE_DEBUG_LOG */
3311
                if (result->bpu) {
3312
                        printk(KERN_INFO "ide-tape: Block location is "
3313
                                "unknown to the tape\n");
3314
                        clear_bit(IDETAPE_ADDRESS_VALID, &tape->flags);
3315
                        idetape_end_request(drive, 0);
3316
                } else {
3317
#if IDETAPE_DEBUG_LOG
3318
                        if (tape->debug_level >= 2)
3319
                                printk(KERN_INFO "ide-tape: Block Location "
3320
                                        "- %u\n", ntohl(result->first_block));
3321
#endif /* IDETAPE_DEBUG_LOG */
3322
                        tape->partition = result->partition;
3323
                        tape->first_frame_position = ntohl(result->first_block);
3324
                        tape->last_frame_position = ntohl(result->last_block);
3325
                        tape->blocks_in_buffer = result->blocks_in_buffer[2];
3326
                        set_bit(IDETAPE_ADDRESS_VALID, &tape->flags);
3327
                        idetape_end_request(drive, 1);
3328
                }
3329
        } else {
3330
                idetape_end_request(drive, 0);
3331
        }
3332
        return ide_stopped;
3333
}
3334
 
3335
/*
3336
 *      idetape_create_write_filemark_cmd will:
3337
 *
3338
 *              1.      Write a filemark if write_filemark=1.
3339
 *              2.      Flush the device buffers without writing a filemark
3340
 *                      if write_filemark=0.
3341
 *
3342
 */
3343
static void idetape_create_write_filemark_cmd (ide_drive_t *drive, idetape_pc_t *pc,int write_filemark)
3344
{
3345
        idetape_tape_t *tape = drive->driver_data;
3346
 
3347
        idetape_init_pc(pc);
3348
        pc->c[0] = IDETAPE_WRITE_FILEMARK_CMD;
3349
        if (tape->onstream)
3350
                pc->c[1] = 1; /* Immed bit */
3351
        pc->c[4] = write_filemark;  /* not used for OnStream ?? */
3352
        set_bit(PC_WAIT_FOR_DSC, &pc->flags);
3353
        pc->callback = &idetape_pc_callback;
3354
}
3355
 
3356
static void idetape_create_test_unit_ready_cmd(idetape_pc_t *pc)
3357
{
3358
        idetape_init_pc(pc);
3359
        pc->c[0] = IDETAPE_TEST_UNIT_READY_CMD;
3360
        pc->callback = &idetape_pc_callback;
3361
}
3362
 
3363
/*
3364
 *      idetape_queue_pc_tail is based on the following functions:
3365
 *
3366
 *      ide_do_drive_cmd from ide.c
3367
 *      cdrom_queue_request and cdrom_queue_packet_command from ide-cd.c
3368
 *
3369
 *      We add a special packet command request to the tail of the request
3370
 *      queue, and wait for it to be serviced.
3371
 *
3372
 *      This is not to be called from within the request handling part
3373
 *      of the driver ! We allocate here data in the stack, and it is valid
3374
 *      until the request is finished. This is not the case for the bottom
3375
 *      part of the driver, where we are always leaving the functions to wait
3376
 *      for an interrupt or a timer event.
3377
 *
3378
 *      From the bottom part of the driver, we should allocate safe memory
3379
 *      using idetape_next_pc_storage and idetape_next_rq_storage, and add
3380
 *      the request to the request list without waiting for it to be serviced !
3381
 *      In that case, we usually use idetape_queue_pc_head.
3382
 */
3383
static int __idetape_queue_pc_tail (ide_drive_t *drive, idetape_pc_t *pc)
3384
{
3385
        struct request rq;
3386
 
3387
        ide_init_drive_cmd(&rq);
3388
        rq.buffer = (char *) pc;
3389
        rq.cmd = IDETAPE_PC_RQ1;
3390
        return ide_do_drive_cmd(drive, &rq, ide_wait);
3391
}
3392
 
3393
static void idetape_create_load_unload_cmd (ide_drive_t *drive, idetape_pc_t *pc,int cmd)
3394
{
3395
        idetape_tape_t *tape = drive->driver_data;
3396
 
3397
        idetape_init_pc(pc);
3398
        pc->c[0] = IDETAPE_LOAD_UNLOAD_CMD;
3399
        pc->c[4] = cmd;
3400
        if (tape->onstream) {
3401
                pc->c[1] = 1;
3402
                if (cmd == !IDETAPE_LU_LOAD_MASK)
3403
                        pc->c[4] = 4;
3404
        }
3405
        set_bit(PC_WAIT_FOR_DSC, &pc->flags);
3406
        pc->callback = &idetape_pc_callback;
3407
}
3408
 
3409
static int idetape_wait_ready (ide_drive_t *drive, unsigned long long timeout)
3410
{
3411
        idetape_tape_t *tape = drive->driver_data;
3412
        idetape_pc_t pc;
3413
 
3414
        /*
3415
         * Wait for the tape to become ready
3416
         */
3417
        timeout += jiffies;
3418
        while (time_before(jiffies, timeout)) {
3419
                idetape_create_test_unit_ready_cmd(&pc);
3420
                if (!__idetape_queue_pc_tail(drive, &pc))
3421
                        return 0;
3422
                if (tape->sense_key == 2 && tape->asc == 4 && tape->ascq == 2) {
3423
                        idetape_create_load_unload_cmd(drive, &pc, IDETAPE_LU_LOAD_MASK);
3424
                        __idetape_queue_pc_tail(drive, &pc);
3425
                        idetape_create_test_unit_ready_cmd(&pc);
3426
                        if (!__idetape_queue_pc_tail(drive, &pc))
3427
                                return 0;
3428
                }
3429
                if (!(tape->sense_key == 2 && tape->asc == 4 &&
3430
                    (tape->ascq == 1 || tape->ascq == 8)))
3431
                        break;
3432
                current->state = TASK_INTERRUPTIBLE;
3433
                schedule_timeout(HZ / 10);
3434
        }
3435
        return -EIO;
3436
}
3437
 
3438
static int idetape_queue_pc_tail (ide_drive_t *drive,idetape_pc_t *pc)
3439
{
3440
        idetape_tape_t *tape = drive->driver_data;
3441
        int rc;
3442
 
3443
        rc = __idetape_queue_pc_tail(drive, pc);
3444
        if (rc)
3445
                return rc;
3446
        if (tape->onstream && test_bit(PC_WAIT_FOR_DSC, &pc->flags)) {
3447
                /* AJN-4: Changed from 5 to 10 minutes;
3448
                 * because retension takes approx.
3449
                 * 8:20 with Onstream 30GB tape
3450
                 */
3451
                rc = idetape_wait_ready(drive, 60 * 10 * HZ);
3452
        }
3453
        return rc;
3454
}
3455
 
3456
static int idetape_flush_tape_buffers (ide_drive_t *drive)
3457
{
3458
        idetape_pc_t pc;
3459
        int rc;
3460
 
3461
        idetape_create_write_filemark_cmd(drive, &pc, 0);
3462
        if ((rc = idetape_queue_pc_tail (drive, &pc)))
3463
                return rc;
3464
        idetape_wait_ready(drive, 60 * 5 * HZ);
3465
        return 0;
3466
}
3467
 
3468
static void idetape_create_read_position_cmd (idetape_pc_t *pc)
3469
{
3470
        idetape_init_pc(pc);
3471
        pc->c[0] = IDETAPE_READ_POSITION_CMD;
3472
        pc->request_transfer = 20;
3473
        pc->callback = &idetape_read_position_callback;
3474
}
3475
 
3476
static int idetape_read_position (ide_drive_t *drive)
3477
{
3478
        idetape_tape_t *tape = drive->driver_data;
3479
        idetape_pc_t pc;
3480
        int position;
3481
 
3482
#if IDETAPE_DEBUG_LOG
3483
        if (tape->debug_level >= 4)
3484
                printk (KERN_INFO "ide-tape: Reached %s\n", __FUNCTION__);
3485
#endif /* IDETAPE_DEBUG_LOG */
3486
 
3487
        idetape_create_read_position_cmd(&pc);
3488
        if (idetape_queue_pc_tail(drive, &pc))
3489
                return -1;
3490
        position = tape->first_frame_position;
3491
        return position;
3492
}
3493
 
3494
static void idetape_create_locate_cmd (ide_drive_t *drive, idetape_pc_t *pc, unsigned int block, u8 partition, int skip)
3495
{
3496
        idetape_tape_t *tape = drive->driver_data;
3497
 
3498
        idetape_init_pc(pc);
3499
        pc->c[0] = IDETAPE_LOCATE_CMD;
3500
        if (tape->onstream)
3501
                pc->c[1] = 1; /* Immediate bit */
3502
        else
3503
                pc->c[1] = 2;
3504
        put_unaligned(htonl(block), (unsigned int *) &pc->c[3]);
3505
        pc->c[8] = partition;
3506
        if (tape->onstream)
3507
                /*
3508
                 * Set SKIP bit.
3509
                 * In case of write error this will write buffered
3510
                 * data in the drive to this new position!
3511
                 */
3512
                pc->c[9] = skip << 7;
3513
        set_bit(PC_WAIT_FOR_DSC, &pc->flags);
3514
        pc->callback = &idetape_pc_callback;
3515
}
3516
 
3517
static int idetape_create_prevent_cmd (ide_drive_t *drive, idetape_pc_t *pc, int prevent)
3518
{
3519
        idetape_tape_t *tape = drive->driver_data;
3520
 
3521
        if (!tape->capabilities.lock)
3522
                return 0;
3523
 
3524
        idetape_init_pc(pc);
3525
        pc->c[0] = IDETAPE_PREVENT_CMD;
3526
        pc->c[4] = prevent;
3527
        pc->callback = &idetape_pc_callback;
3528
        return 1;
3529
}
3530
 
3531
static int __idetape_discard_read_pipeline (ide_drive_t *drive)
3532
{
3533
        idetape_tape_t *tape = drive->driver_data;
3534
        unsigned long flags;
3535
        int cnt;
3536
 
3537
        if (tape->chrdev_direction != idetape_direction_read)
3538
                return 0;
3539
        cnt = tape->merge_stage_size / tape->tape_block_size;
3540
        if (test_and_clear_bit(IDETAPE_FILEMARK, &tape->flags))
3541
                ++cnt;          /* Filemarks count as 1 sector */
3542
        tape->merge_stage_size = 0;
3543
        if (tape->merge_stage != NULL) {
3544
                __idetape_kfree_stage(tape->merge_stage);
3545
                tape->merge_stage = NULL;
3546
        }
3547
        clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
3548
        tape->chrdev_direction = idetape_direction_none;
3549
 
3550
        if (tape->first_stage == NULL)
3551
                return 0;
3552
 
3553
        spin_lock_irqsave(&tape->spinlock, flags);
3554
        tape->next_stage = NULL;
3555
        if (idetape_pipeline_active(tape))
3556
                idetape_wait_for_request(drive, tape->active_data_request);
3557
        spin_unlock_irqrestore(&tape->spinlock, flags);
3558
 
3559
        while (tape->first_stage != NULL) {
3560
                struct request *rq_ptr = &tape->first_stage->rq;
3561
 
3562
                cnt += rq_ptr->nr_sectors - rq_ptr->current_nr_sectors;
3563
                if (rq_ptr->errors == IDETAPE_ERROR_FILEMARK)
3564
                        ++cnt;
3565
                idetape_remove_stage_head(drive);
3566
        }
3567
        tape->nr_pending_stages = 0;
3568
        tape->max_stages = tape->min_pipeline;
3569
        return cnt;
3570
}
3571
 
3572
/*
3573
 *      idetape_position_tape positions the tape to the requested block
3574
 *      using the LOCATE packet command. A READ POSITION command is then
3575
 *      issued to check where we are positioned.
3576
 *
3577
 *      Like all higher level operations, we queue the commands at the tail
3578
 *      of the request queue and wait for their completion.
3579
 *
3580
 */
3581
static int idetape_position_tape (ide_drive_t *drive, unsigned int block, u8 partition, int skip)
3582
{
3583
        idetape_tape_t *tape = drive->driver_data;
3584
        int retval;
3585
        idetape_pc_t pc;
3586
 
3587
        if (tape->chrdev_direction == idetape_direction_read)
3588
                __idetape_discard_read_pipeline(drive);
3589
        idetape_wait_ready(drive, 60 * 5 * HZ);
3590
        idetape_create_locate_cmd(drive, &pc, block, partition, skip);
3591
        retval = idetape_queue_pc_tail(drive, &pc);
3592
        if (retval)
3593
                return (retval);
3594
 
3595
        idetape_create_read_position_cmd(&pc);
3596
        return (idetape_queue_pc_tail(drive, &pc));
3597
}
3598
 
3599
static void idetape_discard_read_pipeline (ide_drive_t *drive, int restore_position)
3600
{
3601
        idetape_tape_t *tape = drive->driver_data;
3602
        int cnt;
3603
        int seek, position;
3604
 
3605
        cnt = __idetape_discard_read_pipeline(drive);
3606
        if (restore_position) {
3607
                position = idetape_read_position(drive);
3608
#if ONSTREAM_DEBUG
3609
                if (tape->debug_level >= 2)
3610
                        printk(KERN_INFO "ide-tape: address %u, nr_stages %d\n",
3611
                                position, cnt);
3612
#endif
3613
                seek = position > cnt ? position - cnt : 0;
3614
                if (idetape_position_tape(drive, seek, 0, 0)) {
3615
                        printk(KERN_INFO "ide-tape: %s: position_tape "
3616
                                "failed in discard_pipeline()\n", tape->name);
3617
                        return;
3618
                }
3619
        }
3620
}
3621
 
3622
static void idetape_update_stats (ide_drive_t *drive)
3623
{
3624
        idetape_pc_t pc;
3625
 
3626
        idetape_create_mode_sense_cmd(&pc, IDETAPE_BUFFER_FILLING_PAGE);
3627
        pc.callback = idetape_onstream_buffer_fill_callback;
3628
        (void) idetape_queue_pc_tail(drive, &pc);
3629
}
3630
 
3631
/*
3632
 *      idetape_queue_rw_tail generates a read/write request for the block
3633
 *      device interface and wait for it to be serviced.
3634
 */
3635
static int idetape_queue_rw_tail (ide_drive_t *drive, int cmd, int blocks, struct buffer_head *bh)
3636
{
3637
        idetape_tape_t *tape = drive->driver_data;
3638
        struct request rq;
3639
 
3640
#if IDETAPE_DEBUG_LOG
3641
        if (tape->debug_level >= 2)
3642
                printk(KERN_INFO "ide-tape: %s: cmd=%d\n", __FUNCTION__, cmd);
3643
#endif /* IDETAPE_DEBUG_LOG */
3644
#if IDETAPE_DEBUG_BUGS
3645
        if (idetape_pipeline_active (tape)) {
3646
                printk(KERN_ERR "ide-tape: bug: the pipeline is active in %s\n",
3647
                        __FUNCTION__);
3648
                return (0);
3649
        }
3650
#endif /* IDETAPE_DEBUG_BUGS */ 
3651
 
3652
        ide_init_drive_cmd(&rq);
3653
        rq.bh = bh;
3654
        rq.cmd = cmd;
3655
        rq.sector = tape->first_frame_position;
3656
        rq.nr_sectors = rq.current_nr_sectors = blocks;
3657
        if (tape->onstream)
3658
                tape->postpone_cnt = 600;
3659
        (void) ide_do_drive_cmd(drive, &rq, ide_wait);
3660
 
3661
        if (cmd != IDETAPE_READ_RQ && cmd != IDETAPE_WRITE_RQ)
3662
                return 0;
3663
 
3664
        if (tape->merge_stage)
3665
                idetape_init_merge_stage(tape);
3666
        if (rq.errors == IDETAPE_ERROR_GENERAL)
3667
                return -EIO;
3668
        return (tape->tape_block_size * (blocks-rq.current_nr_sectors));
3669
}
3670
 
3671
/*
3672
 * Read back the drive's internal buffer contents, as a part
3673
 * of the write error recovery mechanism for old OnStream
3674
 * firmware revisions.
3675
 */
3676
static void idetape_onstream_read_back_buffer (ide_drive_t *drive)
3677
{
3678
        idetape_tape_t *tape = drive->driver_data;
3679
        int frames, i, logical_blk_num;
3680
        idetape_stage_t *stage, *first = NULL, *last = NULL;
3681
        os_aux_t *aux;
3682
        struct request *rq;
3683
        unsigned char *p;
3684
        unsigned long flags;
3685
 
3686
        idetape_update_stats(drive);
3687
        frames = tape->cur_frames;
3688
        logical_blk_num = ntohl(tape->first_stage->aux->logical_blk_num) - frames;
3689
        printk(KERN_INFO "ide-tape: %s: reading back %d frames from the drive's internal buffer\n", tape->name, frames);
3690
        for (i = 0; i < frames; i++) {
3691
                stage = __idetape_kmalloc_stage(tape, 0, 0);
3692
                if (!first)
3693
                        first = stage;
3694
                aux = stage->aux;
3695
                p = stage->bh->b_data;
3696
                idetape_queue_rw_tail(drive, IDETAPE_READ_BUFFER_RQ, tape->capabilities.ctl, stage->bh);
3697
#if ONSTREAM_DEBUG
3698
                if (tape->debug_level >= 2)
3699
                        printk(KERN_INFO "ide-tape: %s: read back logical block %d, data %x %x %x %x\n", tape->name, logical_blk_num, *p++, *p++, *p++, *p++);
3700
#endif
3701
                rq = &stage->rq;
3702
                ide_init_drive_cmd (rq);
3703
                rq->cmd = IDETAPE_WRITE_RQ;
3704
                rq->sector = tape->first_frame_position;
3705
                rq->nr_sectors = rq->current_nr_sectors = tape->capabilities.ctl;
3706
                idetape_init_stage(drive, stage, OS_FRAME_TYPE_DATA, logical_blk_num++);
3707
                stage->next = NULL;
3708
                if (last)
3709
                        last->next = stage;
3710
                last = stage;
3711
        }
3712
        if (frames) {
3713
                spin_lock_irqsave(&tape->spinlock, flags);
3714
                last->next = tape->first_stage;
3715
                tape->next_stage = tape->first_stage = first;
3716
                tape->nr_stages += frames;
3717
                tape->nr_pending_stages += frames;
3718
                spin_unlock_irqrestore(&tape->spinlock, flags);
3719
        }
3720
        idetape_update_stats(drive);
3721
#if ONSTREAM_DEBUG
3722
        if (tape->debug_level >= 2)
3723
                printk(KERN_INFO "ide-tape: %s: frames left in buffer: %d\n",
3724
                        tape->name, tape->cur_frames);
3725
#endif
3726
}
3727
 
3728
/*
3729
 * Error recovery algorithm for the OnStream tape.
3730
 */
3731
static void idetape_onstream_write_error_recovery (ide_drive_t *drive)
3732
{
3733
        idetape_tape_t *tape = drive->driver_data;
3734
        unsigned int block;
3735
 
3736
        if (tape->onstream_write_error == OS_WRITE_ERROR) {
3737
                printk(KERN_ERR "ide-tape: %s: onstream_write_error_recovery: detected physical bad block at %u, logical %u first frame %u last_frame %u bufblocks %u stages %u skipping %u frames\n",
3738
                        tape->name, ntohl(tape->sense.information), tape->logical_blk_num,
3739
                        tape->first_frame_position, tape->last_frame_position,
3740
                        tape->blocks_in_buffer, tape->nr_stages,
3741
                        (ntohl(tape->sense.command_specific) >> 16) & 0xff );
3742
                block = ntohl(tape->sense.information) + ((ntohl(tape->sense.command_specific) >> 16) & 0xff);
3743
                idetape_update_stats(drive);
3744
                printk(KERN_ERR "ide-tape: %s: relocating %d buffered logical blocks to physical block %u\n", tape->name, tape->cur_frames, block);
3745
#if 0  /* isn't once enough ??? MM */
3746
                idetape_update_stats(drive);
3747
#endif
3748
                if (tape->firmware_revision_num >= 106)
3749
                        idetape_position_tape(drive, block, 0, 1);
3750
                else {
3751
                        idetape_onstream_read_back_buffer(drive);
3752
                        idetape_position_tape(drive, block, 0, 0);
3753
                }
3754
#if 0     /* already done in idetape_position_tape MM */
3755
                idetape_read_position(drive);
3756
#endif
3757
#if ONSTREAM_DEBUG
3758
                if (tape->debug_level >= 1)
3759
                        printk(KERN_ERR "ide-tape: %s: positioning complete, cur_frames %d, pos %d, tape pos %d\n", tape->name, tape->cur_frames, tape->first_frame_position, tape->last_frame_position);
3760
#endif
3761
        } else if (tape->onstream_write_error == OS_PART_ERROR) {
3762
#if ONSTREAM_DEBUG
3763
                if (tape->debug_level >= 1)
3764
                        printk(KERN_INFO "ide-tape: %s: skipping over config partition\n", tape->name);
3765
#endif
3766
                idetape_flush_tape_buffers(drive);
3767
                block = idetape_read_position(drive);
3768
                if (block != OS_DATA_ENDFRAME1)
3769
                        printk(KERN_ERR "ide-tape: warning, current position %d, expected %d\n", block, OS_DATA_ENDFRAME1);
3770
                idetape_position_tape(drive, 0xbb8, 0, 0); /* 3000 */
3771
        }
3772
        tape->onstream_write_error = 0;
3773
}
3774
 
3775
/*
3776
 *      idetape_insert_pipeline_into_queue is used to start servicing the
3777
 *      pipeline stages, starting from tape->next_stage.
3778
 */
3779
static void idetape_insert_pipeline_into_queue (ide_drive_t *drive)
3780
{
3781
        idetape_tape_t *tape = drive->driver_data;
3782
 
3783
        if (tape->next_stage == NULL)
3784
                return;
3785
        if (!idetape_pipeline_active(tape)) {
3786
                if (tape->onstream_write_error)
3787
                        idetape_onstream_write_error_recovery(drive);
3788
                set_bit(IDETAPE_PIPELINE_ACTIVE, &tape->flags);
3789
                idetape_active_next_stage(drive);
3790
                (void) ide_do_drive_cmd(drive, tape->active_data_request, ide_end);
3791
        }
3792
}
3793
 
3794
static void idetape_create_inquiry_cmd (idetape_pc_t *pc)
3795
{
3796
        idetape_init_pc(pc);
3797
        pc->c[0] = IDETAPE_INQUIRY_CMD;
3798
        pc->c[4] = pc->request_transfer = 254;
3799
        pc->callback = &idetape_pc_callback;
3800
}
3801
 
3802
static void idetape_create_rewind_cmd (ide_drive_t *drive, idetape_pc_t *pc)
3803
{
3804
        idetape_tape_t *tape = drive->driver_data;
3805
 
3806
        idetape_init_pc(pc);
3807
        pc->c[0] = IDETAPE_REWIND_CMD;
3808
        if (tape->onstream)
3809
                pc->c[1] = 1;
3810
        set_bit(PC_WAIT_FOR_DSC, &pc->flags);
3811
        pc->callback = &idetape_pc_callback;
3812
}
3813
 
3814
static void idetape_create_mode_select_cmd (idetape_pc_t *pc, int length)
3815
{
3816
        idetape_init_pc(pc);
3817
        set_bit(PC_WRITING, &pc->flags);
3818
        pc->c[0] = IDETAPE_MODE_SELECT_CMD;
3819
        pc->c[1] = 0x10;
3820
        put_unaligned(htons(length), (unsigned short *) &pc->c[3]);
3821
        pc->request_transfer = 255;
3822
        pc->callback = &idetape_pc_callback;
3823
}
3824
 
3825
static void idetape_create_erase_cmd (idetape_pc_t *pc)
3826
{
3827
        idetape_init_pc(pc);
3828
        pc->c[0] = IDETAPE_ERASE_CMD;
3829
        pc->c[1] = 1;
3830
        set_bit(PC_WAIT_FOR_DSC, &pc->flags);
3831
        pc->callback = &idetape_pc_callback;
3832
}
3833
 
3834
static void idetape_create_space_cmd (idetape_pc_t *pc,int count,u8 cmd)
3835
{
3836
        idetape_init_pc(pc);
3837
        pc->c[0] = IDETAPE_SPACE_CMD;
3838
        put_unaligned(htonl (count), (unsigned int *) &pc->c[1]);
3839
        pc->c[1] = cmd;
3840
        set_bit(PC_WAIT_FOR_DSC, &pc->flags);
3841
        pc->callback = &idetape_pc_callback;
3842
}
3843
 
3844
/*
3845
 * Verify that we have the correct tape frame
3846
 */
3847
static int idetape_verify_stage (ide_drive_t *drive, idetape_stage_t *stage, int logical_blk_num, int quiet)
3848
{
3849
        idetape_tape_t *tape = drive->driver_data;
3850
        os_aux_t *aux = stage->aux;
3851
        os_partition_t *par = &aux->partition;
3852
        struct request *rq = &stage->rq;
3853
        struct buffer_head *bh;
3854
 
3855
        if (!tape->onstream)
3856
                return 1;
3857
        if (tape->raw) {
3858
                if (rq->errors) {
3859
                        bh = stage->bh;
3860
                        while (bh) {
3861
                                memset(bh->b_data, 0, bh->b_size);
3862
                                bh = bh->b_reqnext;
3863
                        }
3864
                        strcpy(stage->bh->b_data, "READ ERROR ON FRAME");
3865
                }
3866
                return 1;
3867
        }
3868
        if (rq->errors == IDETAPE_ERROR_GENERAL) {
3869
                printk(KERN_INFO "ide-tape: %s: skipping frame %d, "
3870
                        "read error\n", tape->name, tape->first_frame_position);
3871
                return 0;
3872
        }
3873
        if (rq->errors == IDETAPE_ERROR_EOD) {
3874
                printk(KERN_INFO "ide-tape: %s: skipping frame %d, eod\n",
3875
                        tape->name, tape->first_frame_position);
3876
                return 0;
3877
        }
3878
        if (ntohl(aux->format_id) != 0) {
3879
                printk(KERN_INFO "ide-tape: %s: skipping frame %d, "
3880
                        "format_id %u\n", tape->name,
3881
                        tape->first_frame_position, ntohl(aux->format_id));
3882
                return 0;
3883
        }
3884
        if (memcmp(aux->application_sig, tape->application_sig, 4) != 0) {
3885
                printk(KERN_INFO "ide-tape: %s: skipping frame %d, "
3886
                        "incorrect application signature\n",
3887
                        tape->name, tape->first_frame_position);
3888
                return 0;
3889
        }
3890
        if (aux->frame_type != OS_FRAME_TYPE_DATA &&
3891
            aux->frame_type != OS_FRAME_TYPE_EOD &&
3892
            aux->frame_type != OS_FRAME_TYPE_MARKER) {
3893
                printk(KERN_INFO "ide-tape: %s: skipping frame %d, frame "
3894
                        "type %x\n", tape->name,
3895
                        tape->first_frame_position, aux->frame_type);
3896
                return 0;
3897
        }
3898
        if (par->partition_num != OS_DATA_PARTITION) {
3899
                if (!tape->linux_media || tape->linux_media_version != 2) {
3900
                        printk(KERN_INFO "ide-tape: %s: skipping frame %d, "
3901
                                "partition num %d\n", tape->name,
3902
                                tape->first_frame_position, par->partition_num);
3903
                        return 0;
3904
                }
3905
        }
3906
        if (par->par_desc_ver != OS_PARTITION_VERSION) {
3907
                printk(KERN_INFO "ide-tape: %s: skipping frame %d, "
3908
                        "partition version %d\n", tape->name,
3909
                        tape->first_frame_position, par->par_desc_ver);
3910
                return 0;
3911
        }
3912
        if (ntohs(par->wrt_pass_cntr) != tape->wrt_pass_cntr) {
3913
                printk(KERN_INFO "ide-tape: %s: skipping frame %d, "
3914
                        "wrt_pass_cntr %d (expected %d)(logical_blk_num %u)\n",
3915
                        tape->name, tape->first_frame_position,
3916
                        ntohs(par->wrt_pass_cntr), tape->wrt_pass_cntr,
3917
                        ntohl(aux->logical_blk_num));
3918
                return 0;
3919
        }
3920
        if (aux->frame_seq_num != aux->logical_blk_num) {
3921
                printk(KERN_INFO "ide-tape: %s: skipping frame %d, "
3922
                        "seq != logical\n", tape->name,
3923
                        tape->first_frame_position);
3924
                return 0;
3925
        }
3926
        if (logical_blk_num != -1 &&
3927
             ntohl(aux->logical_blk_num) != logical_blk_num) {
3928
                if (!quiet)
3929
                        printk(KERN_INFO "ide-tape: %s: skipping frame %d, "
3930
                                "logical_blk_num %u (expected %d)\n",
3931
                                tape->name, tape->first_frame_position,
3932
                                ntohl(aux->logical_blk_num), logical_blk_num);
3933
                return 0;
3934
        }
3935
        if (aux->frame_type == OS_FRAME_TYPE_MARKER) {
3936
                rq->errors = IDETAPE_ERROR_FILEMARK;
3937
                rq->current_nr_sectors = rq->nr_sectors;
3938
        }
3939
        return 1;
3940
}
3941
 
3942
static void idetape_wait_first_stage (ide_drive_t *drive)
3943
{
3944
        idetape_tape_t *tape = drive->driver_data;
3945
        unsigned long flags;
3946
 
3947
        if (tape->first_stage == NULL)
3948
                return;
3949
        spin_lock_irqsave(&tape->spinlock, flags);
3950
        if (tape->active_stage == tape->first_stage)
3951
                idetape_wait_for_request(drive, tape->active_data_request);
3952
        spin_unlock_irqrestore(&tape->spinlock, flags);
3953
}
3954
 
3955
/*
3956
 *      idetape_add_chrdev_write_request tries to add a character device
3957
 *      originated write request to our pipeline. In case we don't succeed,
3958
 *      we revert to non-pipelined operation mode for this request.
3959
 *
3960
 *      1.      Try to allocate a new pipeline stage.
3961
 *      2.      If we can't, wait for more and more requests to be serviced
3962
 *              and try again each time.
3963
 *      3.      If we still can't allocate a stage, fallback to
3964
 *              non-pipelined operation mode for this request.
3965
 */
3966
static int idetape_add_chrdev_write_request (ide_drive_t *drive, int blocks)
3967
{
3968
        idetape_tape_t *tape = drive->driver_data;
3969
        idetape_stage_t *new_stage;
3970
        unsigned long flags;
3971
        struct request *rq;
3972
 
3973
#if IDETAPE_DEBUG_LOG
3974
        if (tape->debug_level >= 3)
3975
                printk(KERN_INFO "ide-tape: Reached %s\n", __FUNCTION__);
3976
#endif /* IDETAPE_DEBUG_LOG */
3977
 
3978
        /*
3979
         *      Attempt to allocate a new stage.
3980
         *      Pay special attention to possible race conditions.
3981
         */
3982
        while ((new_stage = idetape_kmalloc_stage (tape)) == NULL) {
3983
                spin_lock_irqsave(&tape->spinlock, flags);
3984
                if (idetape_pipeline_active(tape)) {
3985
                        idetape_wait_for_request(drive, tape->active_data_request);
3986
                        spin_unlock_irqrestore(&tape->spinlock, flags);
3987
                } else {
3988
                        spin_unlock_irqrestore(&tape->spinlock, flags);
3989
                        idetape_insert_pipeline_into_queue(drive);
3990
                        if (idetape_pipeline_active(tape))
3991
                                continue;
3992
                        /*
3993
                         *      Linux is short on memory. Fallback to
3994
                         *      non-pipelined operation mode for this request.
3995
                         */
3996
                        return idetape_queue_rw_tail(drive, IDETAPE_WRITE_RQ, blocks, tape->merge_stage->bh);
3997
                }
3998
        }
3999
        rq = &new_stage->rq;
4000
        ide_init_drive_cmd(rq);
4001
        rq->cmd = IDETAPE_WRITE_RQ;
4002
        /* Doesn't actually matter - We always assume sequential access */
4003
        rq->sector = tape->first_frame_position;
4004
        rq->nr_sectors = rq->current_nr_sectors = blocks;
4005
 
4006
        idetape_switch_buffers (tape, new_stage);
4007
        idetape_init_stage(drive, new_stage, OS_FRAME_TYPE_DATA, tape->logical_blk_num);
4008
        tape->logical_blk_num++;
4009
        idetape_add_stage_tail(drive, new_stage);
4010
        tape->pipeline_head++;
4011
#if USE_IOTRACE
4012
        IO_trace(IO_IDETAPE_FIFO, tape->pipeline_head, tape->buffer_head, tape->tape_head, tape->minor);
4013
#endif
4014
        calculate_speeds(drive);
4015
 
4016
        /*
4017
         *      Estimate whether the tape has stopped writing by checking
4018
         *      if our write pipeline is currently empty. If we are not
4019
         *      writing anymore, wait for the pipeline to be full enough
4020
         *      (90%) before starting to service requests, so that we will
4021
         *      be able to keep up with the higher speeds of the tape.
4022
         *
4023
         *      For the OnStream drive, we can query the number of pending
4024
         *      frames in the drive's internal buffer. As long as the tape
4025
         *      is still writing, it is better to write frames immediately
4026
         *      rather than gather them in the pipeline. This will give the
4027
         *      tape's firmware the ability to sense the current incoming
4028
         *      data rate more accurately, and since the OnStream tape
4029
         *      supports variable speeds, it can try to adjust itself to the
4030
         *      incoming data rate.
4031
         */
4032
        if (!idetape_pipeline_active(tape)) {
4033
                if (tape->nr_stages >= tape->max_stages * 9 / 10 ||
4034
                    tape->nr_stages >= tape->max_stages - tape->uncontrolled_pipeline_head_speed * 3 * 1024 / tape->tape_block_size) {
4035
                        tape->measure_insert_time = 1;
4036
                        tape->insert_time = jiffies;
4037
                        tape->insert_size = 0;
4038
                        tape->insert_speed = 0;
4039
                        idetape_insert_pipeline_into_queue (drive);
4040
                } else if (tape->onstream) {
4041
                        idetape_update_stats(drive);
4042
                        if (tape->cur_frames > 5)
4043
                                idetape_insert_pipeline_into_queue(drive);
4044
                }
4045
        }
4046
        if (test_and_clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags))
4047
                /* Return a deferred error */
4048
                return -EIO;
4049
        return blocks;
4050
}
4051
 
4052
/*
4053
 *      idetape_wait_for_pipeline will wait until all pending pipeline
4054
 *      requests are serviced. Typically called on device close.
4055
 */
4056
static void idetape_wait_for_pipeline (ide_drive_t *drive)
4057
{
4058
        idetape_tape_t *tape = drive->driver_data;
4059
        unsigned long flags;
4060
 
4061
        while (tape->next_stage || idetape_pipeline_active(tape)) {
4062
                idetape_insert_pipeline_into_queue(drive);
4063
                spin_lock_irqsave(&tape->spinlock, flags);
4064
                if (idetape_pipeline_active(tape))
4065
                        idetape_wait_for_request(drive, tape->active_data_request);
4066
                spin_unlock_irqrestore(&tape->spinlock, flags);
4067
        }
4068
}
4069
 
4070
static void idetape_empty_write_pipeline (ide_drive_t *drive)
4071
{
4072
        idetape_tape_t *tape = drive->driver_data;
4073
        int blocks, i, min;
4074
        struct buffer_head *bh;
4075
 
4076
#if IDETAPE_DEBUG_BUGS
4077
        if (tape->chrdev_direction != idetape_direction_write) {
4078
                printk(KERN_ERR "ide-tape: bug: Trying to empty write "
4079
                        "pipeline, but we are not writing.\n");
4080
                return;
4081
        }
4082
        if (tape->merge_stage_size > tape->stage_size) {
4083
                printk(KERN_ERR "ide-tape: bug: merge_buffer too big\n");
4084
                tape->merge_stage_size = tape->stage_size;
4085
        }
4086
#endif /* IDETAPE_DEBUG_BUGS */
4087
        if (tape->merge_stage_size) {
4088
                blocks = tape->merge_stage_size / tape->tape_block_size;
4089
                if (tape->merge_stage_size % tape->tape_block_size) {
4090
                        blocks++;
4091
                        i = tape->tape_block_size - tape->merge_stage_size % tape->tape_block_size;
4092
                        bh = tape->bh->b_reqnext;
4093
                        while (bh) {
4094
                                atomic_set(&bh->b_count, 0);
4095
                                bh = bh->b_reqnext;
4096
                        }
4097
                        bh = tape->bh;
4098
                        while (i) {
4099
                                if (bh == NULL) {
4100
                                        printk(KERN_INFO "ide-tape: bug, bh NULL\n");
4101
                                        break;
4102
                                }
4103
                                min = IDE_MIN(i, bh->b_size - atomic_read(&bh->b_count));
4104
                                memset(bh->b_data + atomic_read(&bh->b_count), 0, min);
4105
                                atomic_add(min, &bh->b_count);
4106
                                i -= min;
4107
                                bh = bh->b_reqnext;
4108
                        }
4109
                }
4110
                (void) idetape_add_chrdev_write_request(drive, blocks);
4111
                tape->merge_stage_size = 0;
4112
        }
4113
        idetape_wait_for_pipeline(drive);
4114
        if (tape->merge_stage != NULL) {
4115
                __idetape_kfree_stage(tape->merge_stage);
4116
                tape->merge_stage = NULL;
4117
        }
4118
        clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
4119
        tape->chrdev_direction = idetape_direction_none;
4120
 
4121
        /*
4122
         *      On the next backup, perform the feedback loop again.
4123
         *      (I don't want to keep sense information between backups,
4124
         *       as some systems are constantly on, and the system load
4125
         *       can be totally different on the next backup).
4126
         */
4127
        tape->max_stages = tape->min_pipeline;
4128
#if IDETAPE_DEBUG_BUGS
4129
        if (tape->first_stage != NULL ||
4130
            tape->next_stage != NULL ||
4131
            tape->last_stage != NULL ||
4132
            tape->nr_stages != 0) {
4133
                printk(KERN_ERR "ide-tape: ide-tape pipeline bug, "
4134
                        "first_stage %p, next_stage %p, last_stage %p, "
4135
                        "nr_stages %d\n", tape->first_stage,
4136
                        tape->next_stage, tape->last_stage, tape->nr_stages);
4137
        }
4138
#endif /* IDETAPE_DEBUG_BUGS */
4139
}
4140
 
4141
static void idetape_restart_speed_control (ide_drive_t *drive)
4142
{
4143
        idetape_tape_t *tape = drive->driver_data;
4144
 
4145
        tape->restart_speed_control_req = 0;
4146
        tape->pipeline_head = 0;
4147
        tape->buffer_head = tape->tape_head = tape->cur_frames;
4148
        tape->controlled_last_pipeline_head = tape->uncontrolled_last_pipeline_head = 0;
4149
        tape->controlled_previous_pipeline_head = tape->uncontrolled_previous_pipeline_head = 0;
4150
        tape->pipeline_head_speed = tape->controlled_pipeline_head_speed = 5000;
4151
        tape->uncontrolled_pipeline_head_speed = 0;
4152
        tape->controlled_pipeline_head_time = tape->uncontrolled_pipeline_head_time = jiffies;
4153
        tape->controlled_previous_head_time = tape->uncontrolled_previous_head_time = jiffies;
4154
}
4155
 
4156
static int idetape_initiate_read (ide_drive_t *drive, int max_stages)
4157
{
4158
        idetape_tape_t *tape = drive->driver_data;
4159
        idetape_stage_t *new_stage;
4160
        struct request rq;
4161
        int bytes_read;
4162
        int blocks = tape->capabilities.ctl;
4163
 
4164
        /* Initialize read operation */
4165
        if (tape->chrdev_direction != idetape_direction_read) {
4166
                if (tape->chrdev_direction == idetape_direction_write) {
4167
                        idetape_empty_write_pipeline(drive);
4168
                        idetape_flush_tape_buffers(drive);
4169
                }
4170
#if IDETAPE_DEBUG_BUGS
4171
                if (tape->merge_stage || tape->merge_stage_size) {
4172
                        printk(KERN_ERR "ide-tape: merge_stage_size "
4173
                                "should be 0 now\n");
4174
                        tape->merge_stage_size = 0;
4175
                }
4176
#endif /* IDETAPE_DEBUG_BUGS */
4177
                if ((tape->merge_stage = __idetape_kmalloc_stage (tape, 0, 0)) == NULL)
4178
                        return -ENOMEM;
4179
                tape->chrdev_direction = idetape_direction_read;
4180
                tape->logical_blk_num = 0;
4181
 
4182
                /*
4183
                 *      Issue a read 0 command to ensure that DSC handshake
4184
                 *      is switched from completion mode to buffer available
4185
                 *      mode.
4186
                 */
4187
                bytes_read = idetape_queue_rw_tail(drive, IDETAPE_READ_RQ, 0, tape->merge_stage->bh);
4188
                if (bytes_read < 0) {
4189
                        __idetape_kfree_stage(tape->merge_stage);
4190
                        tape->merge_stage = NULL;
4191
                        tape->chrdev_direction = idetape_direction_none;
4192
                        return bytes_read;
4193
                }
4194
        }
4195
        if (tape->restart_speed_control_req)
4196
                idetape_restart_speed_control(drive);
4197
        ide_init_drive_cmd(&rq);
4198
        rq.cmd = IDETAPE_READ_RQ;
4199
        rq.sector = tape->first_frame_position;
4200
        rq.nr_sectors = rq.current_nr_sectors = blocks;
4201
        if (!test_bit(IDETAPE_PIPELINE_ERROR, &tape->flags) &&
4202
            tape->nr_stages < max_stages) {
4203
                new_stage = idetape_kmalloc_stage(tape);
4204
                while (new_stage != NULL) {
4205
                        new_stage->rq = rq;
4206
                        idetape_add_stage_tail(drive, new_stage);
4207
                        if (tape->nr_stages >= max_stages)
4208
                                break;
4209
                        new_stage = idetape_kmalloc_stage(tape);
4210
                }
4211
        }
4212
        if (!idetape_pipeline_active(tape)) {
4213
                if (tape->nr_pending_stages >= 3 * max_stages / 4) {
4214
                        tape->measure_insert_time = 1;
4215
                        tape->insert_time = jiffies;
4216
                        tape->insert_size = 0;
4217
                        tape->insert_speed = 0;
4218
                        idetape_insert_pipeline_into_queue(drive);
4219
                } else if (tape->onstream) {
4220
                        idetape_update_stats(drive);
4221
                        if (tape->cur_frames < tape->max_frames - 5)
4222
                                idetape_insert_pipeline_into_queue(drive);
4223
                }
4224
        }
4225
        return 0;
4226
}
4227
 
4228
static int idetape_get_logical_blk (ide_drive_t *drive, int logical_blk_num, int max_stages, int quiet)
4229
{
4230
        idetape_tape_t *tape = drive->driver_data;
4231
        unsigned long flags;
4232
        int cnt = 0, x, position;
4233
 
4234
        /*
4235
         * Search and wait for the next logical tape block
4236
         */
4237
        while (1) {
4238
                if (cnt++ > 1000) {   /* AJN: was 100 */
4239
                        printk(KERN_INFO "ide-tape: %s: couldn't find "
4240
                                "logical block %d, aborting\n",
4241
                                tape->name, logical_blk_num);
4242
                        return 0;
4243
                }
4244
                idetape_initiate_read(drive, max_stages);
4245
                if (tape->first_stage == NULL) {
4246
                        if (tape->onstream) {
4247
#if ONSTREAM_DEBUG
4248
                                if (tape->debug_level >= 1)
4249
                                        printk(KERN_INFO "ide-tape: %s: first_stage == NULL, pipeline error %ld\n", tape->name, (long)test_bit(IDETAPE_PIPELINE_ERROR, &tape->flags));
4250
#endif
4251
                                clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
4252
                                position = idetape_read_position(drive);
4253
                                printk(KERN_INFO "ide-tape: %s: blank block "
4254
                                        "detected at %d\n", tape->name,
4255
                                        position);
4256
                                if (position >= 3000 && position < 3080)
4257
                                        /* Why is this check and number ??? MM */
4258
                                        position += 32;
4259
                                if (position >= OS_DATA_ENDFRAME1 &&
4260
                                    position < 3000)
4261
                                        position = 3000;
4262
                                else
4263
                                        /*
4264
                                         * compensate for write errors that
4265
                                         * generally skip 80 frames, expect
4266
                                         * around 20 read errors in a row...
4267
                                         */
4268
                                        position += 60;
4269
                                if (position >= OS_DATA_ENDFRAME1 &&
4270
                                    position < 3000)
4271
                                        position = 3000;
4272
                                printk(KERN_INFO "ide-tape: %s: positioning tape to block %d\n", tape->name, position);
4273
 
4274
                                /* seems to be needed to correctly position
4275
                                 * at block 3000 MM
4276
                                 */
4277
                                if (position == 3000)
4278
                                        idetape_position_tape(drive, 0, 0, 0);
4279
                                idetape_position_tape(drive, position, 0, 0);
4280
                                cnt += 40;
4281
                                continue;
4282
                        } else
4283
                                return 0;
4284
                }
4285
                idetape_wait_first_stage(drive);
4286
                if (idetape_verify_stage(drive, tape->first_stage, logical_blk_num, quiet))
4287
                        break;
4288
                if (tape->first_stage->rq.errors == IDETAPE_ERROR_EOD)
4289
                        cnt--;
4290
                if (idetape_verify_stage(drive, tape->first_stage, -1, quiet)) {
4291
                        x = ntohl(tape->first_stage->aux->logical_blk_num);
4292
                        if (x > logical_blk_num) {
4293
                                printk(KERN_ERR "ide-tape: %s: couldn't find logical block %d, aborting (block %d found)\n", tape->name, logical_blk_num, x);
4294
                                return 0;
4295
                        }
4296
                }
4297
                spin_lock_irqsave(&tape->spinlock, flags);
4298
                idetape_remove_stage_head(drive);
4299
                spin_unlock_irqrestore(&tape->spinlock, flags);
4300
        }
4301
        if (tape->onstream)
4302
                tape->logical_blk_num = ntohl(tape->first_stage->aux->logical_blk_num);
4303
        return 1;
4304
}
4305
 
4306
/*
4307
 *      idetape_add_chrdev_read_request is called from idetape_chrdev_read
4308
 *      to service a character device read request and add read-ahead
4309
 *      requests to our pipeline.
4310
 */
4311
static int idetape_add_chrdev_read_request (ide_drive_t *drive,int blocks)
4312
{
4313
        idetape_tape_t *tape = drive->driver_data;
4314
        unsigned long flags;
4315
        struct request *rq_ptr;
4316
        int bytes_read;
4317
 
4318
#if IDETAPE_DEBUG_LOG
4319
        if (tape->debug_level >= 4)
4320
                printk(KERN_INFO "ide-tape: Reached %s, %d blocks\n",
4321
                        __FUNCTION__, blocks);
4322
#endif /* IDETAPE_DEBUG_LOG */
4323
 
4324
        /*
4325
         * If we are at a filemark, return a read length of 0
4326
         */
4327
        if (test_bit(IDETAPE_FILEMARK, &tape->flags))
4328
                return 0;
4329
 
4330
        /*
4331
         * Wait for the next logical block to be available at the head
4332
         * of the pipeline
4333
         */
4334
        if (!idetape_get_logical_blk(drive, tape->logical_blk_num, tape->max_stages, 0)) {
4335
                if (tape->onstream) {
4336
                        set_bit(IDETAPE_READ_ERROR, &tape->flags);
4337
                        return 0;
4338
                }
4339
                if (test_bit(IDETAPE_PIPELINE_ERROR, &tape->flags))
4340
                        return 0;
4341
                return idetape_queue_rw_tail(drive, IDETAPE_READ_RQ, blocks, tape->merge_stage->bh);
4342
        }
4343
        rq_ptr = &tape->first_stage->rq;
4344
        bytes_read = tape->tape_block_size * (rq_ptr->nr_sectors - rq_ptr->current_nr_sectors);
4345
        rq_ptr->nr_sectors = rq_ptr->current_nr_sectors = 0;
4346
 
4347
 
4348
        if (tape->onstream && !tape->raw &&
4349
            tape->first_stage->aux->frame_type == OS_FRAME_TYPE_EOD) {
4350
#if ONSTREAM_DEBUG
4351
                if (tape->debug_level >= 2)
4352
                        printk(KERN_INFO "ide-tape: %s: EOD reached\n",
4353
                                tape->name);
4354
#endif
4355
                return 0;
4356
        }
4357
        if (rq_ptr->errors == IDETAPE_ERROR_EOD)
4358
                return 0;
4359
        else {
4360
                idetape_switch_buffers(tape, tape->first_stage);
4361
                if (rq_ptr->errors == IDETAPE_ERROR_GENERAL) {
4362
#if ONSTREAM_DEBUG
4363
                        if (tape->debug_level >= 1)
4364
                                printk(KERN_INFO "ide-tape: error detected, "
4365
                                        "bytes_read %d\n", bytes_read);
4366
#endif
4367
                }
4368
                if (rq_ptr->errors == IDETAPE_ERROR_FILEMARK)
4369
                        set_bit(IDETAPE_FILEMARK, &tape->flags);
4370
                spin_lock_irqsave(&tape->spinlock, flags);
4371
                idetape_remove_stage_head (drive);
4372
                spin_unlock_irqrestore(&tape->spinlock, flags);
4373
                tape->logical_blk_num++;
4374
                tape->pipeline_head++;
4375
#if USE_IOTRACE
4376
                IO_trace(IO_IDETAPE_FIFO, tape->pipeline_head, tape->buffer_head, tape->tape_head, tape->minor);
4377
#endif
4378
                calculate_speeds(drive);
4379
        }
4380
#if IDETAPE_DEBUG_BUGS
4381
        if (bytes_read > blocks * tape->tape_block_size) {
4382
                printk(KERN_ERR "ide-tape: bug: trying to return more "
4383
                        "bytes than requested\n");
4384
                bytes_read = blocks * tape->tape_block_size;
4385
        }
4386
#endif /* IDETAPE_DEBUG_BUGS */
4387
        return (bytes_read);
4388
}
4389
 
4390
static void idetape_pad_zeros (ide_drive_t *drive, int bcount)
4391
{
4392
        idetape_tape_t *tape = drive->driver_data;
4393
        struct buffer_head *bh;
4394
        int count, blocks;
4395
 
4396
        while (bcount) {
4397
                bh = tape->merge_stage->bh;
4398
                count = IDE_MIN(tape->stage_size, bcount);
4399
                bcount -= count;
4400
                blocks = count / tape->tape_block_size;
4401
                while (count) {
4402
                        atomic_set(&bh->b_count, IDE_MIN (count, bh->b_size));
4403
                        memset(bh->b_data, 0, atomic_read(&bh->b_count));
4404
                        count -= atomic_read(&bh->b_count);
4405
                        bh = bh->b_reqnext;
4406
                }
4407
                idetape_queue_rw_tail(drive, IDETAPE_WRITE_RQ, blocks, tape->merge_stage->bh);
4408
        }
4409
}
4410
 
4411
static int idetape_pipeline_size (ide_drive_t *drive)
4412
{
4413
        idetape_tape_t *tape = drive->driver_data;
4414
        idetape_stage_t *stage;
4415
        struct request *rq;
4416
        int size = 0;
4417
 
4418
        idetape_wait_for_pipeline(drive);
4419
        stage = tape->first_stage;
4420
        while (stage != NULL) {
4421
                rq = &stage->rq;
4422
                size += tape->tape_block_size * (rq->nr_sectors-rq->current_nr_sectors);
4423
                if (rq->errors == IDETAPE_ERROR_FILEMARK)
4424
                        size += tape->tape_block_size;
4425
                stage = stage->next;
4426
        }
4427
        size += tape->merge_stage_size;
4428
        return size;
4429
}
4430
 
4431
/*
4432
 *      Rewinds the tape to the Beginning Of the current Partition (BOP).
4433
 *
4434
 *      We currently support only one partition.
4435
 */
4436
static int idetape_rewind_tape (ide_drive_t *drive)
4437
{
4438
        int retval;
4439
        idetape_pc_t pc;
4440
        idetape_tape_t *tape = drive->driver_data;
4441
#if IDETAPE_DEBUG_LOG
4442
        if (tape->debug_level >= 2)
4443
                printk(KERN_INFO "ide-tape: Reached %s\n", __FUNCTION__);
4444
#endif /* IDETAPE_DEBUG_LOG */  
4445
 
4446
        idetape_create_rewind_cmd(drive, &pc);
4447
        retval = idetape_queue_pc_tail(drive, &pc);
4448
        if (retval)
4449
                return retval;
4450
 
4451
        idetape_create_read_position_cmd(&pc);
4452
        retval = idetape_queue_pc_tail(drive, &pc);
4453
        if (retval)
4454
                return retval;
4455
        tape->logical_blk_num = 0;
4456
        return 0;
4457
}
4458
 
4459
/*
4460
 *      Our special ide-tape ioctl's.
4461
 *
4462
 *      Currently there aren't any ioctl's.
4463
 *      mtio.h compatible commands should be issued to the character device
4464
 *      interface.
4465
 */
4466
static int idetape_blkdev_ioctl (ide_drive_t *drive, struct inode *inode, struct file *file,
4467
                                 unsigned int cmd, unsigned long arg)
4468
{
4469
        idetape_tape_t *tape = drive->driver_data;
4470
        idetape_config_t config;
4471
 
4472
#if IDETAPE_DEBUG_LOG   
4473
        if (tape->debug_level >= 4)
4474
                printk(KERN_INFO "ide-tape: Reached %s\n", __FUNCTION__);
4475
#endif /* IDETAPE_DEBUG_LOG */
4476
        switch (cmd) {
4477
                case 0x0340:
4478
                        if (copy_from_user ((char *) &config, (char *) arg, sizeof (idetape_config_t)))
4479
                                return -EFAULT;
4480
                        tape->best_dsc_rw_frequency = config.dsc_rw_frequency;
4481
                        tape->max_stages = config.nr_stages;
4482
                        break;
4483
                case 0x0350:
4484
                        config.dsc_rw_frequency = (int) tape->best_dsc_rw_frequency;
4485
                        config.nr_stages = tape->max_stages;
4486
                        if (copy_to_user ((char *) arg, (char *) &config, sizeof (idetape_config_t)))
4487
                                return -EFAULT;
4488
                        break;
4489
                default:
4490
                        return -EIO;
4491
        }
4492
        return 0;
4493
}
4494
 
4495
/*
4496
 *      The block device interface should not be used for data transfers.
4497
 *      However, we still allow opening it so that we can issue general
4498
 *      ide driver configuration ioctl's, such as the interrupt unmask feature.
4499
 */
4500
static int idetape_blkdev_open (struct inode *inode, struct file *filp, ide_drive_t *drive)
4501
{
4502
        MOD_INC_USE_COUNT;
4503
#if ONSTREAM_DEBUG
4504
        printk(KERN_INFO "ide-tape: MOD_INC_USE_COUNT in %s\n", __FUNCTION__);
4505
#endif
4506
        return 0;
4507
}
4508
 
4509
static void idetape_blkdev_release (struct inode *inode, struct file *filp, ide_drive_t *drive)
4510
{
4511
        MOD_DEC_USE_COUNT;
4512
#if ONSTREAM_DEBUG
4513
        printk(KERN_INFO "ide-tape: MOD_DEC_USE_COUNT in %s\n", __FUNCTION__);
4514
#endif
4515
}
4516
 
4517
/*
4518
 *      idetape_pre_reset is called before an ATAPI/ATA software reset.
4519
 */
4520
static void idetape_pre_reset (ide_drive_t *drive)
4521
{
4522
        idetape_tape_t *tape = drive->driver_data;
4523
        if (tape != NULL)
4524
                set_bit(IDETAPE_IGNORE_DSC, &tape->flags);
4525
}
4526
 
4527
/*
4528
 *      Character device interface functions
4529
 */
4530
static ide_drive_t *get_drive_ptr (kdev_t i_rdev)
4531
{
4532
        unsigned int i = MINOR(i_rdev) & ~0xc0;
4533
 
4534
        if (i >= MAX_HWIFS * MAX_DRIVES)
4535
                return NULL;
4536
        return (idetape_chrdevs[i].drive);
4537
}
4538
 
4539
static int idetape_onstream_space_over_filemarks_backward (ide_drive_t *drive,short mt_op,int mt_count)
4540
{
4541
        idetape_tape_t *tape = drive->driver_data;
4542
        int cnt = 0;
4543
        int last_mark_addr;
4544
        unsigned long flags;
4545
 
4546
        if (!idetape_get_logical_blk(drive, -1, 10, 0)) {
4547
                printk(KERN_INFO "ide-tape: %s: couldn't get logical blk "
4548
                        "num in space_filemarks_bwd\n", tape->name);
4549
                return -EIO;
4550
        }
4551
        while (cnt != mt_count) {
4552
                last_mark_addr = ntohl(tape->first_stage->aux->last_mark_addr);
4553
                if (last_mark_addr == -1)
4554
                        return -EIO;
4555
#if ONSTREAM_DEBUG
4556
                if (tape->debug_level >= 2)
4557
                        printk(KERN_INFO "ide-tape: positioning to last "
4558
                        "mark at %d\n", last_mark_addr);
4559
#endif
4560
                idetape_position_tape(drive, last_mark_addr, 0, 0);
4561
                cnt++;
4562
                if (!idetape_get_logical_blk(drive, -1, 10, 0)) {
4563
                        printk(KERN_INFO "ide-tape: %s: couldn't get logical "
4564
                                "blk num in space_filemarks\n", tape->name);
4565
                        return -EIO;
4566
                }
4567
                if (tape->first_stage->aux->frame_type != OS_FRAME_TYPE_MARKER) {
4568
                        printk(KERN_INFO "ide-tape: %s: expected to find "
4569
                                "marker at block %d, not found\n",
4570
                                tape->name, last_mark_addr);
4571
                        return -EIO;
4572
                }
4573
        }
4574
        if (mt_op == MTBSFM) {
4575
                spin_lock_irqsave(&tape->spinlock, flags);
4576
                idetape_remove_stage_head (drive);
4577
                tape->logical_blk_num++;
4578
                spin_unlock_irqrestore(&tape->spinlock, flags);
4579
        }
4580
        return 0;
4581
}
4582
 
4583
/*
4584
 * ADRL 1.1 compatible "slow" space filemarks fwd version
4585
 *
4586
 * Just scans for the filemark sequentially.
4587
 */
4588
static int idetape_onstream_space_over_filemarks_forward_slow (ide_drive_t *drive,short mt_op,int mt_count)
4589
{
4590
        idetape_tape_t *tape = drive->driver_data;
4591
        int cnt = 0;
4592
        unsigned long flags;
4593
 
4594
        if (!idetape_get_logical_blk(drive, -1, 10, 0)) {
4595
                printk(KERN_INFO "ide-tape: %s: couldn't get logical blk "
4596
                        "num in space_filemarks_fwd\n", tape->name);
4597
                return -EIO;
4598
        }
4599
        while (1) {
4600
                if (!idetape_get_logical_blk(drive, -1, 10, 0)) {
4601
                        printk(KERN_INFO "ide-tape: %s: couldn't get logical "
4602
                                "blk num in space_filemarks\n", tape->name);
4603
                        return -EIO;
4604
                }
4605
                if (tape->first_stage->aux->frame_type == OS_FRAME_TYPE_MARKER)
4606
                        cnt++;
4607
                if (tape->first_stage->aux->frame_type == OS_FRAME_TYPE_EOD) {
4608
#if ONSTREAM_DEBUG
4609
                        if (tape->debug_level >= 2)
4610
                                printk(KERN_INFO "ide-tape: %s: space_fwd: "
4611
                                        "EOD reached\n", tape->name);
4612
#endif
4613
                        return -EIO;
4614
                }
4615
                if (cnt == mt_count)
4616
                        break;
4617
                spin_lock_irqsave(&tape->spinlock, flags);
4618
                idetape_remove_stage_head(drive);
4619
                spin_unlock_irqrestore(&tape->spinlock, flags);
4620
        }
4621
        if (mt_op == MTFSF) {
4622
                spin_lock_irqsave(&tape->spinlock, flags);
4623
                idetape_remove_stage_head(drive);
4624
                tape->logical_blk_num++;
4625
                spin_unlock_irqrestore(&tape->spinlock, flags);
4626
        }
4627
        return 0;
4628
}
4629
 
4630
 
4631
/*
4632
 * Fast linux specific version of OnStream FSF
4633
 */
4634
static int idetape_onstream_space_over_filemarks_forward_fast (ide_drive_t *drive,short mt_op,int mt_count)
4635
{
4636
        idetape_tape_t *tape = drive->driver_data;
4637
        int cnt = 0, next_mark_addr;
4638
        unsigned long flags;
4639
 
4640
        if (!idetape_get_logical_blk(drive, -1, 10, 0)) {
4641
                printk(KERN_INFO "ide-tape: %s: couldn't get logical blk "
4642
                        "num in space_filemarks_fwd\n", tape->name);
4643
                return -EIO;
4644
        }
4645
 
4646
        /*
4647
         * Find nearest (usually previous) marker
4648
         */
4649
        while (1) {
4650
                if (tape->first_stage->aux->frame_type == OS_FRAME_TYPE_MARKER)
4651
                        break;
4652
                if (tape->first_stage->aux->frame_type == OS_FRAME_TYPE_EOD) {
4653
#if ONSTREAM_DEBUG
4654
                        if (tape->debug_level >= 2)
4655
                                printk(KERN_INFO "ide-tape: %s: space_fwd: "
4656
                                        "EOD reached\n", tape->name);
4657
#endif
4658
                        return -EIO;
4659
                }
4660
                if (ntohl(tape->first_stage->aux->filemark_cnt) == 0) {
4661
                        if (tape->first_mark_addr == -1) {
4662
                                printk(KERN_INFO "ide-tape: %s: reverting to "
4663
                                        "slow filemark space\n", tape->name);
4664
                                return idetape_onstream_space_over_filemarks_forward_slow(drive, mt_op, mt_count);
4665
                        }
4666
                        idetape_position_tape(drive, tape->first_mark_addr, 0, 0);
4667
                        if (!idetape_get_logical_blk(drive, -1, 10, 0)) {
4668
                                printk(KERN_INFO "ide-tape: %s: couldn't get "
4669
                                        "logical blk num in %s\n",                                                      __FUNCTION__, tape->name);
4670
                                return -EIO;
4671
                        }
4672
                        if (tape->first_stage->aux->frame_type != OS_FRAME_TYPE_MARKER) {
4673
                                printk(KERN_INFO "ide-tape: %s: expected to "
4674
                                        "find filemark at %d\n",
4675
                                        tape->name, tape->first_mark_addr);
4676
                                return -EIO;
4677
                        }
4678
                } else {
4679
                        if (idetape_onstream_space_over_filemarks_backward(drive, MTBSF, 1) < 0)
4680
                                return -EIO;
4681
                        mt_count++;
4682
                }
4683
        }
4684
        cnt++;
4685
        while (cnt != mt_count) {
4686
                next_mark_addr = ntohl(tape->first_stage->aux->next_mark_addr);
4687
                if (!next_mark_addr || next_mark_addr > tape->eod_frame_addr) {
4688
                        printk(KERN_INFO "ide-tape: %s: reverting to slow "
4689
                                "filemark space\n", tape->name);
4690
                        return idetape_onstream_space_over_filemarks_forward_slow(drive, mt_op, mt_count - cnt);
4691
#if ONSTREAM_DEBUG
4692
                } else if (tape->debug_level >= 2) {
4693
                     printk(KERN_INFO "ide-tape: positioning to next mark at %d\n", next_mark_addr);
4694
#endif
4695
                }
4696
                idetape_position_tape(drive, next_mark_addr, 0, 0);
4697
                cnt++;
4698
                if (!idetape_get_logical_blk(drive, -1, 10, 0)) {
4699
                        printk(KERN_INFO "ide-tape: %s: couldn't get logical "
4700
                                "blk num in space_filemarks\n", tape->name);
4701
                        return -EIO;
4702
                }
4703
                if (tape->first_stage->aux->frame_type != OS_FRAME_TYPE_MARKER) {
4704
                        printk(KERN_INFO "ide-tape: %s: expected to find "
4705
                                "marker at block %d, not found\n",
4706
                                tape->name, next_mark_addr);
4707
                        return -EIO;
4708
                }
4709
        }
4710
        if (mt_op == MTFSF) {
4711
                spin_lock_irqsave(&tape->spinlock, flags);
4712
                idetape_remove_stage_head(drive);
4713
                tape->logical_blk_num++;
4714
                spin_unlock_irqrestore(&tape->spinlock, flags);
4715
        }
4716
        return 0;
4717
}
4718
 
4719
/*
4720
 *      idetape_space_over_filemarks is now a bit more complicated than just
4721
 *      passing the command to the tape since we may have crossed some
4722
 *      filemarks during our pipelined read-ahead mode.
4723
 *
4724
 *      As a minor side effect, the pipeline enables us to support MTFSFM when
4725
 *      the filemark is in our internal pipeline even if the tape doesn't
4726
 *      support spacing over filemarks in the reverse direction.
4727
 */
4728
static int idetape_space_over_filemarks (ide_drive_t *drive,short mt_op,int mt_count)
4729
{
4730
        idetape_tape_t *tape = drive->driver_data;
4731
        idetape_pc_t pc;
4732
        unsigned long flags;
4733
        int retval,count=0;
4734
        int speed_control;
4735
 
4736
        if (tape->onstream) {
4737
                if (tape->raw)
4738
                        return -EIO;
4739
                speed_control = tape->speed_control;
4740
                tape->speed_control = 0;
4741
                if (mt_op == MTFSF || mt_op == MTFSFM) {
4742
                        if (tape->linux_media)
4743
                                retval = idetape_onstream_space_over_filemarks_forward_fast(drive, mt_op, mt_count);
4744
                        else
4745
                                retval = idetape_onstream_space_over_filemarks_forward_slow(drive, mt_op, mt_count);
4746
                } else
4747
                        retval = idetape_onstream_space_over_filemarks_backward(drive, mt_op, mt_count);
4748
                tape->speed_control = speed_control;
4749
                tape->restart_speed_control_req = 1;
4750
                return retval;
4751
        }
4752
 
4753
        if (mt_count == 0)
4754
                return 0;
4755
        if (MTBSF == mt_op || MTBSFM == mt_op) {
4756
                if (!tape->capabilities.sprev)
4757
                        return -EIO;
4758
                mt_count = - mt_count;
4759
        }
4760
 
4761
        if (tape->chrdev_direction == idetape_direction_read) {
4762
                /*
4763
                 *      We have a read-ahead buffer. Scan it for crossed
4764
                 *      filemarks.
4765
                 */
4766
                tape->merge_stage_size = 0;
4767
                if (test_and_clear_bit(IDETAPE_FILEMARK, &tape->flags))
4768
                        ++count;
4769
                while (tape->first_stage != NULL) {
4770
                        if (count == mt_count) {
4771
                                if (mt_op == MTFSFM)
4772
                                        set_bit(IDETAPE_FILEMARK, &tape->flags);
4773
                                return 0;
4774
                        }
4775
                        spin_lock_irqsave(&tape->spinlock, flags);
4776
                        if (tape->first_stage == tape->active_stage) {
4777
                                /*
4778
                                 *      We have reached the active stage in the read pipeline.
4779
                                 *      There is no point in allowing the drive to continue
4780
                                 *      reading any farther, so we stop the pipeline.
4781
                                 *
4782
                                 *      This section should be moved to a separate subroutine,
4783
                                 *      because a similar function is performed in
4784
                                 *      __idetape_discard_read_pipeline(), for example.
4785
                                 */
4786
                                tape->next_stage = NULL;
4787
                                spin_unlock_irqrestore(&tape->spinlock, flags);
4788
                                idetape_wait_first_stage(drive);
4789
                                tape->next_stage = tape->first_stage->next;
4790
                        } else
4791
                                spin_unlock_irqrestore(&tape->spinlock, flags);
4792
                        if (tape->first_stage->rq.errors == IDETAPE_ERROR_FILEMARK)
4793
                                ++count;
4794
                        idetape_remove_stage_head(drive);
4795
                }
4796
                idetape_discard_read_pipeline(drive, 0);
4797
        }
4798
 
4799
        /*
4800
         *      The filemark was not found in our internal pipeline.
4801
         *      Now we can issue the space command.
4802
         */
4803
        switch (mt_op) {
4804
                case MTFSF:
4805
                case MTBSF:
4806
                        idetape_create_space_cmd(&pc,mt_count-count,IDETAPE_SPACE_OVER_FILEMARK);
4807
                        return (idetape_queue_pc_tail(drive, &pc));
4808
                case MTFSFM:
4809
                case MTBSFM:
4810
                        if (!tape->capabilities.sprev)
4811
                                return (-EIO);
4812
                        retval = idetape_space_over_filemarks(drive, MTFSF, mt_count-count);
4813
                        if (retval) return (retval);
4814
                        count = (MTBSFM == mt_op ? 1 : -1);
4815
                        return (idetape_space_over_filemarks(drive, MTFSF, count));
4816
                default:
4817
                        printk(KERN_ERR "ide-tape: MTIO operation %d not "
4818
                                "supported\n", mt_op);
4819
                        return (-EIO);
4820
        }
4821
}
4822
 
4823
 
4824
/*
4825
 *      Our character device read / write functions.
4826
 *
4827
 *      The tape is optimized to maximize throughput when it is transferring
4828
 *      an integral number of the "continuous transfer limit", which is
4829
 *      a parameter of the specific tape (26 KB on my particular tape).
4830
 *      (32 kB for Onstream)
4831
 *
4832
 *      As of version 1.3 of the driver, the character device provides an
4833
 *      abstract continuous view of the media - any mix of block sizes (even 1
4834
 *      byte) on the same backup/restore procedure is supported. The driver
4835
 *      will internally convert the requests to the recommended transfer unit,
4836
 *      so that an unmatch between the user's block size to the recommended
4837
 *      size will only result in a (slightly) increased driver overhead, but
4838
 *      will no longer hit performance.
4839
 *      This is not applicable to Onstream.
4840
 */
4841
static ssize_t idetape_chrdev_read (struct file *file, char *buf,
4842
                                    size_t count, loff_t *ppos)
4843
{
4844
        struct inode *inode = file->f_dentry->d_inode;
4845
        ide_drive_t *drive = get_drive_ptr(inode->i_rdev);
4846
        idetape_tape_t *tape = drive->driver_data;
4847
        ssize_t bytes_read,temp, actually_read = 0, rc;
4848
 
4849
        if (ppos != &file->f_pos) {
4850
                /* "A request was outside the capabilities of the device." */
4851
                return -ENXIO;
4852
        }
4853
        if (tape->onstream && (count != tape->tape_block_size)) {
4854
                printk(KERN_ERR "ide-tape: %s: use %d bytes as block size "
4855
                        "(%Zd used)\n", tape->name,
4856
                        tape->tape_block_size, count);
4857
                return -EINVAL;
4858
        }
4859
#if IDETAPE_DEBUG_LOG
4860
        if (tape->debug_level >= 3)
4861
                printk (KERN_INFO "ide-tape: Reached %s, count %Zd\n",
4862
                        __FUNCTION__, count);
4863
#endif /* IDETAPE_DEBUG_LOG */
4864
 
4865
        if (tape->chrdev_direction != idetape_direction_read) {
4866
                if (test_bit(IDETAPE_DETECT_BS, &tape->flags))
4867
                        if (count > tape->tape_block_size &&
4868
                            (count % tape->tape_block_size) == 0)
4869
                                tape->user_bs_factor = count / tape->tape_block_size;
4870
        }
4871
        if ((rc = idetape_initiate_read(drive, tape->max_stages)) < 0)
4872
                return rc;
4873
        if (count == 0)
4874
                return (0);
4875
        if (tape->merge_stage_size) {
4876
                actually_read = IDE_MIN(tape->merge_stage_size, count);
4877
                idetape_copy_stage_to_user(tape, buf, tape->merge_stage, actually_read);
4878
                buf += actually_read;
4879
                tape->merge_stage_size -= actually_read;
4880
                count -= actually_read;
4881
        }
4882
        while (count >= tape->stage_size) {
4883
                bytes_read = idetape_add_chrdev_read_request(drive, tape->capabilities.ctl);
4884
                if (bytes_read <= 0)
4885
                        goto finish;
4886
                idetape_copy_stage_to_user(tape, buf, tape->merge_stage, bytes_read);
4887
                buf += bytes_read;
4888
                count -= bytes_read;
4889
                actually_read += bytes_read;
4890
        }
4891
        if (count) {
4892
                bytes_read=idetape_add_chrdev_read_request(drive, tape->capabilities.ctl);
4893
                if (bytes_read <= 0)
4894
                        goto finish;
4895
                temp = IDE_MIN(count, bytes_read);
4896
                idetape_copy_stage_to_user(tape, buf, tape->merge_stage, temp);
4897
                actually_read += temp;
4898
                tape->merge_stage_size = bytes_read-temp;
4899
        }
4900
finish:
4901
        if (!actually_read && test_bit(IDETAPE_FILEMARK, &tape->flags)) {
4902
#if IDETAPE_DEBUG_LOG
4903
                if (tape->debug_level >= 2)
4904
                        printk(KERN_INFO "ide-tape: %s: spacing over "
4905
                                "filemark\n", tape->name);
4906
#endif
4907
                idetape_space_over_filemarks (drive, MTFSF, 1);
4908
                return 0;
4909
        }
4910
        if (tape->onstream && !actually_read &&
4911
            test_and_clear_bit(IDETAPE_READ_ERROR, &tape->flags)) {
4912
                printk(KERN_ERR "ide-tape: %s: unrecovered read error on "
4913
                        "logical block number %d, skipping\n",
4914
                        tape->name, tape->logical_blk_num);
4915
                tape->logical_blk_num++;
4916
                return -EIO;
4917
        }
4918
        return actually_read;
4919
}
4920
 
4921
static void idetape_update_last_marker (ide_drive_t *drive, int last_mark_addr, int next_mark_addr)
4922
{
4923
        idetape_tape_t *tape = drive->driver_data;
4924
        idetape_stage_t *stage;
4925
        os_aux_t *aux;
4926
        int position;
4927
 
4928
        if (!tape->onstream || tape->raw)
4929
                return;
4930
        if (last_mark_addr == -1)
4931
                return;
4932
        stage = __idetape_kmalloc_stage(tape, 0, 0);
4933
        if (stage == NULL)
4934
                return;
4935
        idetape_flush_tape_buffers(drive);
4936
        position = idetape_read_position(drive);
4937
#if ONSTREAM_DEBUG
4938
        if (tape->debug_level >= 2)
4939
                printk(KERN_INFO "ide-tape: current position (2) %d, "
4940
                        "lblk %d\n", position, tape->logical_blk_num);
4941
        if (tape->debug_level >= 2)
4942
                printk(KERN_INFO "ide-tape: current position (2) tape "
4943
                        "block %d\n", tape->last_frame_position);
4944
#endif
4945
        idetape_position_tape(drive, last_mark_addr, 0, 0);
4946
        if (!idetape_queue_rw_tail(drive, IDETAPE_READ_RQ, 1, stage->bh)) {
4947
                printk(KERN_INFO "ide-tape: %s: couldn't read last marker\n",
4948
                        tape->name);
4949
                __idetape_kfree_stage(stage);
4950
                idetape_position_tape(drive, position, 0, 0);
4951
                return;
4952
        }
4953
        aux = stage->aux;
4954
        if (aux->frame_type != OS_FRAME_TYPE_MARKER) {
4955
                printk(KERN_INFO "ide-tape: %s: expected to find marker "
4956
                        "at addr %d\n", tape->name, last_mark_addr);
4957
                __idetape_kfree_stage(stage);
4958
                idetape_position_tape(drive, position, 0, 0);
4959
                return;
4960
        }
4961
#if ONSTREAM_DEBUG
4962
        if (tape->debug_level >= 2)
4963
                printk(KERN_INFO "ide-tape: writing back marker\n");
4964
#endif
4965
        aux->next_mark_addr = htonl(next_mark_addr);
4966
        idetape_position_tape(drive, last_mark_addr, 0, 0);
4967
        if (!idetape_queue_rw_tail(drive, IDETAPE_WRITE_RQ, 1, stage->bh)) {
4968
                printk(KERN_INFO "ide-tape: %s: couldn't write back marker "
4969
                        "frame at %d\n", tape->name, last_mark_addr);
4970
                __idetape_kfree_stage(stage);
4971
                idetape_position_tape(drive, position, 0, 0);
4972
                return;
4973
        }
4974
        __idetape_kfree_stage(stage);
4975
        idetape_flush_tape_buffers (drive);
4976
        idetape_position_tape(drive, position, 0, 0);
4977
        return;
4978
}
4979
 
4980
static void idetape_write_filler (ide_drive_t *drive, int block, int cnt)
4981
{
4982
        idetape_tape_t *tape = drive->driver_data;
4983
        idetape_stage_t *stage;
4984
        int rc;
4985
 
4986
        if (!tape->onstream || tape->raw)
4987
                return;
4988
        stage = __idetape_kmalloc_stage(tape, 1, 1);
4989
        if (stage == NULL)
4990
                return;
4991
        idetape_init_stage(drive, stage, OS_FRAME_TYPE_FILL, 0);
4992
        idetape_wait_ready(drive, 60 * 5 * HZ);
4993
        rc = idetape_position_tape(drive, block, 0, 0);
4994
#if ONSTREAM_DEBUG
4995
        printk(KERN_INFO "write_filler: positioning failed it returned %d\n", rc);
4996
#endif
4997
        if (rc != 0)
4998
                /* don't write fillers if we cannot position the tape. */
4999
                return;
5000
 
5001
        strcpy(stage->bh->b_data, "Filler");
5002
        while (cnt--) {
5003
                if (!idetape_queue_rw_tail(drive, IDETAPE_WRITE_RQ, 1, stage->bh)) {
5004
                        printk(KERN_INFO "ide-tape: %s: write_filler: "
5005
                                "couldn't write header frame\n", tape->name);
5006
                        __idetape_kfree_stage(stage);
5007
                        return;
5008
                }
5009
        }
5010
        __idetape_kfree_stage(stage);
5011
}
5012
 
5013
static void __idetape_write_header (ide_drive_t *drive, int block, int cnt)
5014
{
5015
        idetape_tape_t *tape = drive->driver_data;
5016
        idetape_stage_t *stage;
5017
        os_header_t header;
5018
 
5019
        stage = __idetape_kmalloc_stage(tape, 1, 1);
5020
        if (stage == NULL)
5021
                return;
5022
        idetape_init_stage(drive, stage, OS_FRAME_TYPE_HEADER, tape->logical_blk_num);
5023
        idetape_wait_ready(drive, 60 * 5 * HZ);
5024
        idetape_position_tape(drive, block, 0, 0);
5025
        memset(&header, 0, sizeof(header));
5026
        strcpy(header.ident_str, "ADR_SEQ");
5027
        header.major_rev = 1;
5028
        header.minor_rev = OS_ADR_MINREV;
5029
        header.par_num = 1;
5030
        header.partition.partition_num = OS_DATA_PARTITION;
5031
        header.partition.par_desc_ver = OS_PARTITION_VERSION;
5032
        header.partition.first_frame_addr = htonl(OS_DATA_STARTFRAME1);
5033
        header.partition.last_frame_addr = htonl(tape->capacity);
5034
        header.partition.wrt_pass_cntr = htons(tape->wrt_pass_cntr);
5035
        header.partition.eod_frame_addr = htonl(tape->eod_frame_addr);
5036
        memcpy(stage->bh->b_data, &header, sizeof(header));
5037
        while (cnt--) {
5038
                if (!idetape_queue_rw_tail(drive, IDETAPE_WRITE_RQ, 1, stage->bh)) {
5039
                        printk(KERN_INFO "ide-tape: %s: couldn't write header frame\n", tape->name);
5040
                        __idetape_kfree_stage(stage);
5041
                        return;
5042
                }
5043
        }
5044
        __idetape_kfree_stage(stage);
5045
        idetape_flush_tape_buffers(drive);
5046
}
5047
 
5048
static void idetape_write_header (ide_drive_t *drive, int locate_eod)
5049
{
5050
        idetape_tape_t *tape = drive->driver_data;
5051
 
5052
#if ONSTREAM_DEBUG
5053
        if (tape->debug_level >= 2)
5054
                printk(KERN_INFO "ide-tape: %s: writing tape header\n", tape->name);
5055
#endif
5056
        if (!tape->onstream || tape->raw)
5057
                return;
5058
        tape->update_frame_cntr++;
5059
        __idetape_write_header(drive, 5, 5);
5060
        __idetape_write_header(drive, 0xbae, 5); /* 2990 */
5061
        if (locate_eod) {
5062
#if ONSTREAM_DEBUG
5063
                if (tape->debug_level >= 2)
5064
                        printk(KERN_INFO "ide-tape: %s: locating back to "
5065
                                "eod frame addr %d\n", tape->name,
5066
                                tape->eod_frame_addr);
5067
#endif
5068
                idetape_position_tape(drive, tape->eod_frame_addr, 0, 0);
5069
        }
5070
}
5071
 
5072
static ssize_t idetape_chrdev_write (struct file *file, const char *buf,
5073
                                     size_t count, loff_t *ppos)
5074
{
5075
        struct inode *inode = file->f_dentry->d_inode;
5076
        ide_drive_t *drive = get_drive_ptr(inode->i_rdev);
5077
        idetape_tape_t *tape = drive->driver_data;
5078
        ssize_t retval, actually_written = 0;
5079
        int position;
5080
 
5081
        if (ppos != &file->f_pos) {
5082
                /* "A request was outside the capabilities of the device." */
5083
                return -ENXIO;
5084
        }
5085
 
5086
#if IDETAPE_DEBUG_LOG
5087
        if (tape->debug_level >= 3)
5088
                printk (KERN_INFO "ide-tape: Reached idetape_chrdev_write, count %Zd\n", count);
5089
#endif /* IDETAPE_DEBUG_LOG */
5090
 
5091
        if (tape->onstream) {
5092
                if (count != tape->tape_block_size) {
5093
                        printk(KERN_ERR "ide-tape: %s: chrdev_write: "
5094
                                "use %d bytes as block size (%Zd used)\n",
5095
                                tape->name, tape->tape_block_size, count);
5096
                        return -EINVAL;
5097
                }
5098
                /*
5099
                 * Check if we reach the end of the tape. Just assume the whole
5100
                 * pipeline is filled with write requests!
5101
                 */
5102
                if (tape->first_frame_position + tape->nr_stages >= tape->capacity - OS_EW)  {
5103
#if ONSTREAM_DEBUG
5104
                        printk(KERN_INFO, "chrdev_write: Write truncated at EOM early warning");
5105
#endif
5106
                        if (tape->chrdev_direction == idetape_direction_write)
5107
                                idetape_write_release(inode);
5108
                        return -ENOSPC;
5109
                }
5110
        }
5111
 
5112
        /* Initialize write operation */
5113
        if (tape->chrdev_direction != idetape_direction_write) {
5114
                if (tape->chrdev_direction == idetape_direction_read)
5115
                        idetape_discard_read_pipeline(drive, 1);
5116
#if IDETAPE_DEBUG_BUGS
5117
                if (tape->merge_stage || tape->merge_stage_size) {
5118
                        printk(KERN_ERR "ide-tape: merge_stage_size should be 0 now\n");
5119
                        tape->merge_stage_size = 0;
5120
                }
5121
#endif /* IDETAPE_DEBUG_BUGS */
5122
                if ((tape->merge_stage = __idetape_kmalloc_stage(tape, 0, 0)) == NULL)
5123
                        return -ENOMEM;
5124
                tape->chrdev_direction = idetape_direction_write;
5125
                idetape_init_merge_stage(tape);
5126
 
5127
                if (tape->onstream) {
5128
                        position = idetape_read_position(drive);
5129
                        if (position <= OS_DATA_STARTFRAME1) {
5130
                                tape->logical_blk_num = 0;
5131
                                tape->wrt_pass_cntr++;
5132
#if ONSTREAM_DEBUG
5133
                                if (tape->debug_level >= 2)
5134
                                        printk(KERN_INFO "ide-tape: %s: logical block num 0, setting eod to %d\n", tape->name, OS_DATA_STARTFRAME1);
5135
                                if (tape->debug_level >= 2)
5136
                                        printk(KERN_INFO "ide-tape: %s: allocating new write pass counter %d\n", tape->name, tape->wrt_pass_cntr);
5137
#endif
5138
                                tape->filemark_cnt = 0;
5139
                                tape->eod_frame_addr = OS_DATA_STARTFRAME1;
5140
                                tape->first_mark_addr = tape->last_mark_addr = -1;
5141
                                idetape_write_header(drive, 1);
5142
                        }
5143
#if ONSTREAM_DEBUG
5144
                        if (tape->debug_level >= 2)
5145
                                printk(KERN_INFO "ide-tape: %s: positioning tape to eod at %d\n", tape->name, tape->eod_frame_addr);
5146
#endif
5147
                        position = idetape_read_position(drive);
5148
                        if (position != tape->eod_frame_addr)
5149
                                idetape_position_tape(drive, tape->eod_frame_addr, 0, 0);
5150
#if ONSTREAM_DEBUG
5151
                        if (tape->debug_level >= 2)
5152
                                printk(KERN_INFO "ide-tape: %s: first_frame_position %d\n", tape->name, tape->first_frame_position);
5153
#endif
5154
                }
5155
 
5156
                /*
5157
                 *      Issue a write 0 command to ensure that DSC handshake
5158
                 *      is switched from completion mode to buffer available
5159
                 *      mode.
5160
                 */
5161
                retval = idetape_queue_rw_tail(drive, IDETAPE_WRITE_RQ, 0, tape->merge_stage->bh);
5162
                if (retval < 0) {
5163
                        __idetape_kfree_stage(tape->merge_stage);
5164
                        tape->merge_stage = NULL;
5165
                        tape->chrdev_direction = idetape_direction_none;
5166
                        return retval;
5167
                }
5168
#if ONSTREAM_DEBUG
5169
                if (tape->debug_level >= 2)
5170
                        printk("ide-tape: first_frame_position %d\n", tape->first_frame_position);
5171
#endif
5172
        }
5173
        if (count == 0)
5174
                return (0);
5175
        if (tape->restart_speed_control_req)
5176
                idetape_restart_speed_control(drive);
5177
        if (tape->merge_stage_size) {
5178
#if IDETAPE_DEBUG_BUGS
5179
                if (tape->merge_stage_size >= tape->stage_size) {
5180
                        printk(KERN_ERR "ide-tape: bug: merge buffer too big\n");
5181
                        tape->merge_stage_size = 0;
5182
                }
5183
#endif /* IDETAPE_DEBUG_BUGS */
5184
                actually_written = IDE_MIN(tape->stage_size - tape->merge_stage_size, count);
5185
                idetape_copy_stage_from_user(tape, tape->merge_stage, buf, actually_written);
5186
                buf += actually_written;
5187
                tape->merge_stage_size += actually_written;
5188
                count -= actually_written;
5189
 
5190
                if (tape->merge_stage_size == tape->stage_size) {
5191
                        tape->merge_stage_size = 0;
5192
                        retval = idetape_add_chrdev_write_request(drive, tape->capabilities.ctl);
5193
                        if (retval <= 0)
5194
                                return (retval);
5195
                }
5196
        }
5197
        while (count >= tape->stage_size) {
5198
                idetape_copy_stage_from_user(tape, tape->merge_stage, buf, tape->stage_size);
5199
                buf += tape->stage_size;
5200
                count -= tape->stage_size;
5201
                retval = idetape_add_chrdev_write_request(drive, tape->capabilities.ctl);
5202
                actually_written += tape->stage_size;
5203
                if (retval <= 0)
5204
                        return (retval);
5205
        }
5206
        if (count) {
5207
                actually_written += count;
5208
                idetape_copy_stage_from_user(tape, tape->merge_stage, buf, count);
5209
                tape->merge_stage_size += count;
5210
        }
5211
        return (actually_written);
5212
}
5213
 
5214
static int idetape_write_filemark (ide_drive_t *drive)
5215
{
5216
        idetape_tape_t *tape = drive->driver_data;
5217
        int last_mark_addr;
5218
        idetape_pc_t pc;
5219
 
5220
        if (!tape->onstream) {
5221
                /* Write a filemark */
5222
                idetape_create_write_filemark_cmd(drive, &pc, 1);
5223
                if (idetape_queue_pc_tail(drive, &pc)) {
5224
                        printk(KERN_ERR "ide-tape: Couldn't write a filemark\n");
5225
                        return -EIO;
5226
                }
5227
        } else if (!tape->raw) {
5228
                last_mark_addr = idetape_read_position(drive);
5229
                tape->merge_stage = __idetape_kmalloc_stage(tape, 1, 0);
5230
                if (tape->merge_stage != NULL) {
5231
                        idetape_init_stage(drive, tape->merge_stage, OS_FRAME_TYPE_MARKER, tape->logical_blk_num);
5232
                        idetape_pad_zeros(drive, tape->stage_size);
5233
                        tape->logical_blk_num++;
5234
                        __idetape_kfree_stage(tape->merge_stage);
5235
                        tape->merge_stage = NULL;
5236
                }
5237
                if (tape->filemark_cnt)
5238
                        idetape_update_last_marker(drive, tape->last_mark_addr, last_mark_addr);
5239
                tape->last_mark_addr = last_mark_addr;
5240
                if (tape->filemark_cnt++ == 0)
5241
                        tape->first_mark_addr = last_mark_addr;
5242
        }
5243
        return 0;
5244
}
5245
 
5246
static void idetape_write_eod (ide_drive_t *drive)
5247
{
5248
        idetape_tape_t *tape = drive->driver_data;
5249
 
5250
        if (!tape->onstream || tape->raw)
5251
                return;
5252
        tape->merge_stage = __idetape_kmalloc_stage(tape, 1, 0);
5253
        if (tape->merge_stage != NULL) {
5254
                tape->eod_frame_addr = idetape_read_position(drive);
5255
                idetape_init_stage(drive, tape->merge_stage, OS_FRAME_TYPE_EOD, tape->logical_blk_num);
5256
                idetape_pad_zeros(drive, tape->stage_size);
5257
                __idetape_kfree_stage (tape->merge_stage);
5258
                tape->merge_stage = NULL;
5259
        }
5260
        return;
5261
}
5262
 
5263
int idetape_seek_logical_blk (ide_drive_t *drive, int logical_blk_num)
5264
{
5265
        idetape_tape_t *tape = drive->driver_data;
5266
        int estimated_address = logical_blk_num + 20;
5267
        int retries = 0;
5268
        int speed_control;
5269
 
5270
        speed_control = tape->speed_control;
5271
        tape->speed_control = 0;
5272
        if (logical_blk_num < 0)
5273
                logical_blk_num = 0;
5274
        if (idetape_get_logical_blk(drive, logical_blk_num, 10, 1))
5275
                goto ok;
5276
        while (++retries < 10) {
5277
                idetape_discard_read_pipeline(drive, 0);
5278
                idetape_position_tape(drive, estimated_address, 0, 0);
5279
                if (idetape_get_logical_blk(drive, logical_blk_num, 10, 1))
5280
                        goto ok;
5281
                if (!idetape_get_logical_blk(drive, -1, 10, 1))
5282
                        goto error;
5283
                if (tape->logical_blk_num < logical_blk_num)
5284
                        estimated_address += logical_blk_num - tape->logical_blk_num;
5285
                else
5286
                        break;
5287
        }
5288
error:
5289
        tape->speed_control = speed_control;
5290
        tape->restart_speed_control_req = 1;
5291
        printk(KERN_INFO "ide-tape: %s: couldn't seek to logical block %d "
5292
                "(at %d), %d retries\n", tape->name, logical_blk_num,
5293
                tape->logical_blk_num, retries);
5294
        return -EIO;
5295
ok:
5296
        tape->speed_control = speed_control;
5297
        tape->restart_speed_control_req = 1;
5298
        return 0;
5299
}
5300
 
5301
/*
5302
 *      idetape_mtioctop is called from idetape_chrdev_ioctl when
5303
 *      the general mtio MTIOCTOP ioctl is requested.
5304
 *
5305
 *      We currently support the following mtio.h operations:
5306
 *
5307
 *      MTFSF   -       Space over mt_count filemarks in the positive direction.
5308
 *                      The tape is positioned after the last spaced filemark.
5309
 *
5310
 *      MTFSFM  -       Same as MTFSF, but the tape is positioned before the
5311
 *                      last filemark.
5312
 *
5313
 *      MTBSF   -       Steps background over mt_count filemarks, tape is
5314
 *                      positioned before the last filemark.
5315
 *
5316
 *      MTBSFM  -       Like MTBSF, only tape is positioned after the last filemark.
5317
 *
5318
 *      Note:
5319
 *
5320
 *              MTBSF and MTBSFM are not supported when the tape doesn't
5321
 *              supports spacing over filemarks in the reverse direction.
5322
 *              In this case, MTFSFM is also usually not supported (it is
5323
 *              supported in the rare case in which we crossed the filemark
5324
 *              during our read-ahead pipelined operation mode).
5325
 *
5326
 *      MTWEOF  -       Writes mt_count filemarks. Tape is positioned after
5327
 *                      the last written filemark.
5328
 *
5329
 *      MTREW   -       Rewinds tape.
5330
 *
5331
 *      MTLOAD  -       Loads the tape.
5332
 *
5333
 *      MTOFFL  -       Puts the tape drive "Offline": Rewinds the tape and
5334
 *      MTUNLOAD        prevents further access until the media is replaced.
5335
 *
5336
 *      MTNOP   -       Flushes tape buffers.
5337
 *
5338
 *      MTRETEN -       Retension media. This typically consists of one end
5339
 *                      to end pass on the media.
5340
 *
5341
 *      MTEOM   -       Moves to the end of recorded data.
5342
 *
5343
 *      MTERASE -       Erases tape.
5344
 *
5345
 *      MTSETBLK -      Sets the user block size to mt_count bytes. If
5346
 *                      mt_count is 0, we will attempt to autodetect
5347
 *                      the block size.
5348
 *
5349
 *      MTSEEK  -       Positions the tape in a specific block number, where
5350
 *                      each block is assumed to contain which user_block_size
5351
 *                      bytes.
5352
 *
5353
 *      MTSETPART -     Switches to another tape partition.
5354
 *
5355
 *      MTLOCK -        Locks the tape door.
5356
 *
5357
 *      MTUNLOCK -      Unlocks the tape door.
5358
 *
5359
 *      The following commands are currently not supported:
5360
 *
5361
 *      MTFSS, MTBSS, MTWSM, MTSETDENSITY,
5362
 *      MTSETDRVBUFFER, MT_ST_BOOLEANS, MT_ST_WRITE_THRESHOLD.
5363
 */
5364
static int idetape_mtioctop (ide_drive_t *drive,short mt_op,int mt_count)
5365
{
5366
        idetape_tape_t *tape = drive->driver_data;
5367
        idetape_pc_t pc;
5368
        int i,retval;
5369
 
5370
#if IDETAPE_DEBUG_LOG
5371
        if (tape->debug_level >= 1)
5372
                printk(KERN_INFO "ide-tape: Handling MTIOCTOP "
5373
                        "ioctl: mt_op=%d, mt_count=%d\n", mt_op, mt_count);
5374
#endif /* IDETAPE_DEBUG_LOG */
5375
        /*
5376
         *      Commands which need our pipelined read-ahead stages.
5377
         */
5378
        switch (mt_op) {
5379
                case MTFSF:
5380
                case MTFSFM:
5381
                case MTBSF:
5382
                case MTBSFM:
5383
                        if (!mt_count)
5384
                                return (0);
5385
                        return (idetape_space_over_filemarks(drive,mt_op,mt_count));
5386
                default:
5387
                        break;
5388
        }
5389
        switch (mt_op) {
5390
                case MTWEOF:
5391
                        idetape_discard_read_pipeline(drive, 1);
5392
                        for (i = 0; i < mt_count; i++) {
5393
                                retval = idetape_write_filemark(drive);
5394
                                if (retval) return retval;
5395
                        }
5396
                        return (0);
5397
                case MTREW:
5398
                        idetape_discard_read_pipeline(drive, 0);
5399
                        if (idetape_rewind_tape(drive))
5400
                                return -EIO;
5401
                        if (tape->onstream && !tape->raw)
5402
                                return idetape_position_tape(drive, OS_DATA_STARTFRAME1, 0, 0);
5403
                        return 0;
5404
                case MTLOAD:
5405
                        idetape_discard_read_pipeline(drive, 0);
5406
                        idetape_create_load_unload_cmd(drive, &pc, IDETAPE_LU_LOAD_MASK);
5407
                        return (idetape_queue_pc_tail(drive, &pc));
5408
                case MTUNLOAD:
5409
                case MTOFFL:
5410
                        idetape_discard_read_pipeline(drive, 0);
5411
                        idetape_create_load_unload_cmd(drive, &pc,!IDETAPE_LU_LOAD_MASK);
5412
                        return (idetape_queue_pc_tail(drive, &pc));
5413
                case MTNOP:
5414
                        idetape_discard_read_pipeline(drive, 0);
5415
                        return (idetape_flush_tape_buffers(drive));
5416
                case MTRETEN:
5417
                        idetape_discard_read_pipeline(drive, 0);
5418
                        idetape_create_load_unload_cmd(drive, &pc,IDETAPE_LU_RETENSION_MASK | IDETAPE_LU_LOAD_MASK);
5419
                        return (idetape_queue_pc_tail(drive, &pc));
5420
                case MTEOM:
5421
                        if (tape->onstream) {
5422
#if ONSTREAM_DEBUG
5423
                                if (tape->debug_level >= 2)
5424
                                        printk(KERN_INFO "ide-tape: %s: positioning tape to eod at %d\n", tape->name, tape->eod_frame_addr);
5425
#endif
5426
                                idetape_position_tape(drive, tape->eod_frame_addr, 0, 0);
5427
                                if (!idetape_get_logical_blk(drive, -1, 10, 0))
5428
                                        return -EIO;
5429
                                if (tape->first_stage->aux->frame_type != OS_FRAME_TYPE_EOD)
5430
                                        return -EIO;
5431
                                return 0;
5432
                        }
5433
                        idetape_create_space_cmd(&pc, 0, IDETAPE_SPACE_TO_EOD);
5434
                        return (idetape_queue_pc_tail(drive, &pc));
5435
                case MTERASE:
5436
                        if (tape->onstream) {
5437
                                tape->eod_frame_addr = OS_DATA_STARTFRAME1;
5438
                                tape->logical_blk_num = 0;
5439
                                tape->first_mark_addr = tape->last_mark_addr = -1;
5440
                                idetape_position_tape(drive, tape->eod_frame_addr, 0, 0);
5441
                                idetape_write_eod(drive);
5442
                                idetape_flush_tape_buffers(drive);
5443
                                idetape_write_header(drive, 0);
5444
                                /*
5445
                                 * write filler frames to the unused frames...
5446
                                 * REMOVE WHEN going to LIN4 application type...
5447
                                 */
5448
                                idetape_write_filler(drive, OS_DATA_STARTFRAME1 - 10, 10);
5449
                                idetape_write_filler(drive, OS_DATA_ENDFRAME1, 10);
5450
                                idetape_flush_tape_buffers(drive);
5451
                                (void) idetape_rewind_tape(drive);
5452
                                return 0;
5453
                        }
5454
                        (void) idetape_rewind_tape(drive);
5455
                        idetape_create_erase_cmd(&pc);
5456
                        return (idetape_queue_pc_tail(drive, &pc));
5457
                case MTSETBLK:
5458
                        if (tape->onstream) {
5459
                                if (mt_count != tape->tape_block_size) {
5460
                                        printk(KERN_INFO "ide-tape: %s: MTSETBLK %d -- only %d bytes block size supported\n", tape->name, mt_count, tape->tape_block_size);
5461
                                        return -EINVAL;
5462
                                }
5463
                                return 0;
5464
                        }
5465
                        if (mt_count) {
5466
                                if (mt_count < tape->tape_block_size || mt_count % tape->tape_block_size)
5467
                                        return -EIO;
5468
                                tape->user_bs_factor = mt_count / tape->tape_block_size;
5469
                                clear_bit(IDETAPE_DETECT_BS, &tape->flags);
5470
                        } else
5471
                                set_bit(IDETAPE_DETECT_BS, &tape->flags);
5472
                        return 0;
5473
                case MTSEEK:
5474
                        if (!tape->onstream || tape->raw) {
5475
                                idetape_discard_read_pipeline(drive, 0);
5476
                                return idetape_position_tape(drive, mt_count * tape->user_bs_factor, tape->partition, 0);
5477
                        }
5478
                        return idetape_seek_logical_blk(drive, mt_count);
5479
                case MTSETPART:
5480
                        idetape_discard_read_pipeline(drive, 0);
5481
                        if (tape->onstream)
5482
                                return -EIO;
5483
                        return (idetape_position_tape(drive, 0, mt_count, 0));
5484
                case MTFSR:
5485
                case MTBSR:
5486
                        if (tape->onstream) {
5487
                                if (!idetape_get_logical_blk(drive, -1, 10, 0))
5488
                                        return -EIO;
5489
                                if (mt_op == MTFSR)
5490
                                        return idetape_seek_logical_blk(drive, tape->logical_blk_num + mt_count);
5491
                                else {
5492
                                        idetape_discard_read_pipeline(drive, 0);
5493
                                        return idetape_seek_logical_blk(drive, tape->logical_blk_num - mt_count);
5494
                                }
5495
                        }
5496
                case MTLOCK:
5497
                        if (!idetape_create_prevent_cmd(drive, &pc, 1))
5498
                                return 0;
5499
                        retval = idetape_queue_pc_tail(drive, &pc);
5500
                        if (retval) return retval;
5501
                        tape->door_locked = DOOR_EXPLICITLY_LOCKED;
5502
                        return 0;
5503
                case MTUNLOCK:
5504
                        if (!idetape_create_prevent_cmd(drive, &pc, 0))
5505
                                return 0;
5506
                        retval = idetape_queue_pc_tail(drive, &pc);
5507
                        if (retval) return retval;
5508
                        tape->door_locked = DOOR_UNLOCKED;
5509
                        return 0;
5510
                default:
5511
                        printk(KERN_ERR "ide-tape: MTIO operation %d not supported\n",mt_op);
5512
                        return (-EIO);
5513
        }
5514
}
5515
 
5516
/*
5517
 *      Our character device ioctls.
5518
 *
5519
 *      General mtio.h magnetic io commands are supported here, and not in
5520
 *      the corresponding block interface.
5521
 *
5522
 *      The following ioctls are supported:
5523
 *
5524
 *      MTIOCTOP -      Refer to idetape_mtioctop for detailed description.
5525
 *
5526
 *      MTIOCGET -      The mt_dsreg field in the returned mtget structure
5527
 *                      will be set to (user block size in bytes <<
5528
 *                      MT_ST_BLKSIZE_SHIFT) & MT_ST_BLKSIZE_MASK.
5529
 *
5530
 *                      The mt_blkno is set to the current user block number.
5531
 *                      The other mtget fields are not supported.
5532
 *
5533
 *      MTIOCPOS -      The current tape "block position" is returned. We
5534
 *                      assume that each block contains user_block_size
5535
 *                      bytes.
5536
 *
5537
 *      Our own ide-tape ioctls are supported on both interfaces.
5538
 */
5539
static int idetape_chrdev_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
5540
{
5541
        ide_drive_t *drive = get_drive_ptr(inode->i_rdev);
5542
        idetape_tape_t *tape = drive->driver_data;
5543
        struct mtop mtop;
5544
        struct mtget mtget;
5545
        struct mtpos mtpos;
5546
        int block_offset = 0, position = tape->first_frame_position;
5547
 
5548
#if IDETAPE_DEBUG_LOG
5549
        if (tape->debug_level >= 3)
5550
                printk(KERN_INFO "ide-tape: Reached idetape_chrdev_ioctl, cmd=%u\n",cmd);
5551
#endif /* IDETAPE_DEBUG_LOG */
5552
 
5553
        tape->restart_speed_control_req = 1;
5554
        if (tape->chrdev_direction == idetape_direction_write) {
5555
                idetape_empty_write_pipeline(drive);
5556
                idetape_flush_tape_buffers(drive);
5557
        }
5558
        if (cmd == MTIOCGET || cmd == MTIOCPOS) {
5559
                block_offset = idetape_pipeline_size(drive) / (tape->tape_block_size * tape->user_bs_factor);
5560
                if ((position = idetape_read_position(drive)) < 0)
5561
                        return -EIO;
5562
        }
5563
        switch (cmd) {
5564
                case MTIOCTOP:
5565
                        if (copy_from_user((char *) &mtop, (char *) arg, sizeof (struct mtop)))
5566
                                return -EFAULT;
5567
                        return (idetape_mtioctop(drive,mtop.mt_op,mtop.mt_count));
5568
                case MTIOCGET:
5569
                        memset(&mtget, 0, sizeof (struct mtget));
5570
                        mtget.mt_type = MT_ISSCSI2;
5571
                        if (!tape->onstream || tape->raw) {
5572
                                mtget.mt_blkno = position / tape->user_bs_factor - block_offset;
5573
                        } else {
5574
                                if (!idetape_get_logical_blk(drive, -1, 10, 0))
5575
                                        mtget.mt_blkno = -1;
5576
                                else
5577
                                        mtget.mt_blkno = tape->logical_blk_num;
5578
                        }
5579
                        mtget.mt_dsreg = ((tape->tape_block_size * tape->user_bs_factor) << MT_ST_BLKSIZE_SHIFT) & MT_ST_BLKSIZE_MASK;
5580
                        if (tape->onstream) {
5581
                                mtget.mt_gstat |= GMT_ONLINE(0xffffffff);
5582
                                if (tape->first_stage && tape->first_stage->aux->frame_type == OS_FRAME_TYPE_EOD)
5583
                                        mtget.mt_gstat |= GMT_EOD(0xffffffff);
5584
                                if (position <= OS_DATA_STARTFRAME1)
5585
                                        mtget.mt_gstat |= GMT_BOT(0xffffffff);
5586
                        }
5587
                        if (copy_to_user ((char *) arg,(char *) &mtget, sizeof (struct mtget)))
5588
                                return -EFAULT;
5589
                        return 0;
5590
                case MTIOCPOS:
5591
                        if (tape->onstream && !tape->raw) {
5592
                                if (!idetape_get_logical_blk(drive, -1, 10, 0))
5593
                                        return -EIO;
5594
                                mtpos.mt_blkno = tape->logical_blk_num;
5595
                        } else
5596
                                mtpos.mt_blkno = position / tape->user_bs_factor - block_offset;
5597
                        if (copy_to_user ((char *) arg,(char *) &mtpos, sizeof (struct mtpos)))
5598
                                return -EFAULT;
5599
                        return 0;
5600
                default:
5601
                        if (tape->chrdev_direction == idetape_direction_read)
5602
                                idetape_discard_read_pipeline(drive, 1);
5603
                        return (idetape_blkdev_ioctl(drive,inode,file,cmd,arg));
5604
        }
5605
}
5606
 
5607
static int __idetape_analyze_headers (ide_drive_t *drive, int block)
5608
{
5609
        idetape_tape_t *tape = drive->driver_data;
5610
        idetape_stage_t *stage;
5611
        os_header_t *header;
5612
        os_aux_t *aux;
5613
 
5614
        if (!tape->onstream || tape->raw) {
5615
                tape->header_ok = tape->linux_media = 1;
5616
                return 1;
5617
        }
5618
        tape->header_ok = tape->linux_media = 0;
5619
        tape->update_frame_cntr = 0;
5620
        tape->wrt_pass_cntr = 0;
5621
        tape->eod_frame_addr = OS_DATA_STARTFRAME1;
5622
        tape->first_mark_addr = tape->last_mark_addr = -1;
5623
        stage = __idetape_kmalloc_stage(tape, 0, 0);
5624
        if (stage == NULL)
5625
                return 0;
5626
#if ONSTREAM_DEBUG
5627
        if (tape->debug_level >= 2)
5628
                printk(KERN_INFO "ide-tape: %s: reading header\n", tape->name);
5629
#endif
5630
        idetape_position_tape(drive, block, 0, 0);
5631
        if (!idetape_queue_rw_tail(drive, IDETAPE_READ_RQ, 1, stage->bh)) {
5632
                printk(KERN_INFO "ide-tape: %s: couldn't read header frame\n",
5633
                        tape->name);
5634
                __idetape_kfree_stage(stage);
5635
                return 0;
5636
        }
5637
        header = (os_header_t *) stage->bh->b_data;
5638
        aux = stage->aux;
5639
        if (strncmp(header->ident_str, "ADR_SEQ", 7) != 0) {
5640
                printk(KERN_INFO "ide-tape: %s: invalid header identification string\n", tape->name);
5641
                __idetape_kfree_stage(stage);
5642
                return 0;
5643
        }
5644
        if (header->major_rev != 1 || (header->minor_rev > OS_ADR_MINREV))
5645
                printk(KERN_INFO "ide-tape: warning: revision %d.%d detected (up to 1.%d supported)\n", header->major_rev, header->minor_rev, OS_ADR_MINREV);
5646
        if (header->par_num != 1)
5647
                printk(KERN_INFO "ide-tape: warning: %d partitions defined, only one supported\n", header->par_num);
5648
        tape->wrt_pass_cntr = ntohs(header->partition.wrt_pass_cntr);
5649
        tape->eod_frame_addr = ntohl(header->partition.eod_frame_addr);
5650
        tape->filemark_cnt = ntohl(aux->filemark_cnt);
5651
        tape->first_mark_addr = ntohl(aux->next_mark_addr);
5652
        tape->last_mark_addr = ntohl(aux->last_mark_addr);
5653
        tape->update_frame_cntr = ntohl(aux->update_frame_cntr);
5654
        memcpy(tape->application_sig, aux->application_sig, 4);
5655
        tape->application_sig[4] = 0;
5656
        if (memcmp(tape->application_sig, "LIN", 3) == 0) {
5657
                tape->linux_media = 1;
5658
                tape->linux_media_version = tape->application_sig[3] - '0';
5659
                if (tape->linux_media_version != 3)
5660
                        printk(KERN_INFO "ide-tape: %s: Linux media version "
5661
                                "%d detected (current 3)\n",
5662
                                 tape->name, tape->linux_media_version);
5663
        } else {
5664
                printk(KERN_INFO "ide-tape: %s: non Linux media detected "
5665
                        "(%s)\n", tape->name, tape->application_sig);
5666
                tape->linux_media = 0;
5667
        }
5668
#if ONSTREAM_DEBUG
5669
        if (tape->debug_level >= 2)
5670
                printk(KERN_INFO "ide-tape: %s: detected write pass "
5671
                        "counter %d, eod frame addr %d\n", tape->name,
5672
                        tape->wrt_pass_cntr, tape->eod_frame_addr);
5673
#endif
5674
        __idetape_kfree_stage(stage);
5675
        return 1;
5676
}
5677
 
5678
static int idetape_analyze_headers (ide_drive_t *drive)
5679
{
5680
        idetape_tape_t *tape = drive->driver_data;
5681
        int position, block;
5682
 
5683
        if (!tape->onstream || tape->raw) {
5684
                tape->header_ok = tape->linux_media = 1;
5685
                return 1;
5686
        }
5687
        tape->header_ok = tape->linux_media = 0;
5688
        position = idetape_read_position(drive);
5689
        for (block = 5; block < 10; block++)
5690
                if (__idetape_analyze_headers(drive, block))
5691
                        goto ok;
5692
        for (block = 0xbae; block < 0xbb3; block++) /* 2990 - 2994 */
5693
                if (__idetape_analyze_headers(drive, block))
5694
                        goto ok;
5695
        printk(KERN_ERR "ide-tape: %s: failed to find valid ADRL header\n",
5696
                tape->name);
5697
        return 0;
5698
ok:
5699
        if (position < OS_DATA_STARTFRAME1)
5700
                position = OS_DATA_STARTFRAME1;
5701
        idetape_position_tape(drive, position, 0, 0);
5702
        tape->header_ok = 1;
5703
        return 1;
5704
}
5705
 
5706
/*
5707
 *      Our character device open function.
5708
 */
5709
static int idetape_chrdev_open (struct inode *inode, struct file *filp)
5710
{
5711
        ide_drive_t *drive;
5712
        idetape_tape_t *tape;
5713
        idetape_pc_t pc;
5714
        unsigned int minor = MINOR(inode->i_rdev);
5715
 
5716
#if IDETAPE_DEBUG_LOG
5717
        printk (KERN_INFO "ide-tape: Reached idetape_chrdev_open\n");
5718
#endif /* IDETAPE_DEBUG_LOG */
5719
 
5720
        if ((drive = get_drive_ptr(inode->i_rdev)) == NULL)
5721
                return -ENXIO;
5722
        tape = drive->driver_data;
5723
 
5724
        if (test_and_set_bit(IDETAPE_BUSY, &tape->flags))
5725
                return -EBUSY;
5726
        MOD_INC_USE_COUNT;
5727
        if (!tape->onstream) {
5728
                idetape_read_position(drive);
5729
                if (!test_bit(IDETAPE_ADDRESS_VALID, &tape->flags))
5730
                        (void) idetape_rewind_tape(drive);
5731
        } else {
5732
                if (minor & 64) {
5733
                        tape->tape_block_size = tape->stage_size = 32768 + 512;
5734
                        tape->raw = 1;
5735
                } else {
5736
                        tape->tape_block_size = tape->stage_size = 32768;
5737
                        tape->raw = 0;
5738
                }
5739
                idetape_onstream_mode_sense_tape_parameter_page(drive, tape->debug_level);
5740
        }
5741
        if (idetape_wait_ready(drive, 60 * HZ)) {
5742
                clear_bit(IDETAPE_BUSY, &tape->flags);
5743
                printk(KERN_ERR "ide-tape: %s: drive not ready\n", tape->name);
5744
                MOD_DEC_USE_COUNT;
5745
                return -EBUSY;
5746
        }
5747
        if (tape->onstream)
5748
                idetape_read_position(drive);
5749
        MOD_DEC_USE_COUNT;
5750
        if (tape->chrdev_direction != idetape_direction_read)
5751
                clear_bit(IDETAPE_PIPELINE_ERROR, &tape->flags);
5752
 
5753
        if (tape->chrdev_direction == idetape_direction_none) {
5754
                MOD_INC_USE_COUNT;
5755
                if (idetape_create_prevent_cmd(drive, &pc, 1)) {
5756
                        if (!idetape_queue_pc_tail(drive, &pc)) {
5757
                                if (tape->door_locked != DOOR_EXPLICITLY_LOCKED)
5758
                                        tape->door_locked = DOOR_LOCKED;
5759
                        }
5760
                }
5761
                idetape_analyze_headers(drive);
5762
        }
5763
        tape->max_frames = tape->cur_frames = tape->req_buffer_fill = 0;
5764
        idetape_restart_speed_control(drive);
5765
        tape->restart_speed_control_req = 0;
5766
        return 0;
5767
}
5768
 
5769
static void idetape_write_release (struct inode *inode)
5770
{
5771
        ide_drive_t *drive = get_drive_ptr(inode->i_rdev);
5772
        idetape_tape_t *tape = drive->driver_data;
5773
        unsigned int minor = MINOR(inode->i_rdev);
5774
 
5775
        idetape_empty_write_pipeline(drive);
5776
        tape->merge_stage = __idetape_kmalloc_stage(tape, 1, 0);
5777
        if (tape->merge_stage != NULL) {
5778
                idetape_pad_zeros(drive, tape->tape_block_size * (tape->user_bs_factor - 1));
5779
                __idetape_kfree_stage(tape->merge_stage);
5780
                tape->merge_stage = NULL;
5781
        }
5782
        idetape_write_filemark(drive);
5783
        idetape_write_eod(drive);
5784
        idetape_flush_tape_buffers(drive);
5785
        idetape_write_header(drive, minor >= 128);
5786
        idetape_flush_tape_buffers(drive);
5787
 
5788
        return;
5789
}
5790
 
5791
/*
5792
 *      Our character device release function.
5793
 */
5794
static int idetape_chrdev_release (struct inode *inode, struct file *filp)
5795
{
5796
        ide_drive_t *drive = get_drive_ptr(inode->i_rdev);
5797
        idetape_tape_t *tape;
5798
        idetape_pc_t pc;
5799
        unsigned int minor = MINOR(inode->i_rdev);
5800
 
5801
        lock_kernel();
5802
        tape = drive->driver_data;
5803
#if IDETAPE_DEBUG_LOG
5804
        if (tape->debug_level >= 3)
5805
                printk(KERN_INFO "ide-tape: Reached idetape_chrdev_release\n");
5806
#endif /* IDETAPE_DEBUG_LOG */
5807
 
5808
        if (tape->chrdev_direction == idetape_direction_write) {
5809
                idetape_write_release(inode);
5810
        }
5811
        if (tape->chrdev_direction == idetape_direction_read) {
5812
                if (minor < 128)
5813
                        idetape_discard_read_pipeline(drive, 1);
5814
                else
5815
                        idetape_wait_for_pipeline(drive);
5816
        }
5817
        if (tape->cache_stage != NULL) {
5818
                __idetape_kfree_stage(tape->cache_stage);
5819
                tape->cache_stage = NULL;
5820
        }
5821
        if (minor < 128)
5822
                (void) idetape_rewind_tape(drive);
5823
        if (tape->chrdev_direction == idetape_direction_none) {
5824
                if (tape->door_locked == DOOR_LOCKED) {
5825
                        if (idetape_create_prevent_cmd(drive, &pc, 0)) {
5826
                                if (!idetape_queue_pc_tail(drive, &pc))
5827
                                        tape->door_locked = DOOR_UNLOCKED;
5828
                        }
5829
                }
5830
                MOD_DEC_USE_COUNT;
5831
        }
5832
        clear_bit(IDETAPE_BUSY, &tape->flags);
5833
        unlock_kernel();
5834
        return 0;
5835
}
5836
 
5837
/*
5838
 *      idetape_identify_device is called to check the contents of the
5839
 *      ATAPI IDENTIFY command results. We return:
5840
 *
5841
 *      1       If the tape can be supported by us, based on the information
5842
 *              we have so far.
5843
 *
5844
 *      0       If this tape driver is not currently supported by us.
5845
 */
5846
static int idetape_identify_device (ide_drive_t *drive)
5847
{
5848
        struct idetape_id_gcw gcw;
5849
        struct hd_driveid *id = drive->id;
5850
#if IDETAPE_DEBUG_INFO
5851
        unsigned short mask,i;
5852
#endif /* IDETAPE_DEBUG_INFO */
5853
 
5854
        if(drive->id_read == 0)
5855
                return 1;
5856
 
5857
        *((unsigned short *) &gcw) = id->config;
5858
 
5859
#if IDETAPE_DEBUG_INFO
5860
        printk(KERN_INFO "ide-tape: Dumping ATAPI Identify Device tape parameters\n");
5861
        printk(KERN_INFO "ide-tape: Protocol Type: ");
5862
        switch (gcw.protocol) {
5863
                case 0: case 1: printk("ATA\n");break;
5864
                case 2: printk("ATAPI\n");break;
5865
                case 3: printk("Reserved (Unknown to ide-tape)\n");break;
5866
        }
5867
        printk(KERN_INFO "ide-tape: Device Type: %x - ",gcw.device_type);
5868
        switch (gcw.device_type) {
5869
                case 0: printk("Direct-access Device\n");break;
5870
                case 1: printk("Streaming Tape Device\n");break;
5871
                case 2: case 3: case 4: printk("Reserved\n");break;
5872
                case 5: printk("CD-ROM Device\n");break;
5873
                case 6: printk("Reserved\n");
5874
                case 7: printk("Optical memory Device\n");break;
5875
                case 0x1f: printk("Unknown or no Device type\n");break;
5876
                default: printk("Reserved\n");
5877
        }
5878
        printk(KERN_INFO "ide-tape: Removable: %s",gcw.removable ? "Yes\n":"No\n");
5879
        printk(KERN_INFO "ide-tape: Command Packet DRQ Type: ");
5880
        switch (gcw.drq_type) {
5881
                case 0: printk("Microprocessor DRQ\n");break;
5882
                case 1: printk("Interrupt DRQ\n");break;
5883
                case 2: printk("Accelerated DRQ\n");break;
5884
                case 3: printk("Reserved\n");break;
5885
        }
5886
        printk(KERN_INFO "ide-tape: Command Packet Size: ");
5887
        switch (gcw.packet_size) {
5888
                case 0: printk("12 bytes\n");break;
5889
                case 1: printk("16 bytes\n");break;
5890
                default: printk("Reserved\n");break;
5891
        }
5892
        printk(KERN_INFO "ide-tape: Model: %.40s\n",id->model);
5893
        printk(KERN_INFO "ide-tape: Firmware Revision: %.8s\n",id->fw_rev);
5894
        printk(KERN_INFO "ide-tape: Serial Number: %.20s\n",id->serial_no);
5895
        printk(KERN_INFO "ide-tape: Write buffer size: %d bytes\n",id->buf_size*512);
5896
        printk(KERN_INFO "ide-tape: DMA: %s",id->capability & 0x01 ? "Yes\n":"No\n");
5897
        printk(KERN_INFO "ide-tape: LBA: %s",id->capability & 0x02 ? "Yes\n":"No\n");
5898
        printk(KERN_INFO "ide-tape: IORDY can be disabled: %s",id->capability & 0x04 ? "Yes\n":"No\n");
5899
        printk(KERN_INFO "ide-tape: IORDY supported: %s",id->capability & 0x08 ? "Yes\n":"Unknown\n");
5900
        printk(KERN_INFO "ide-tape: ATAPI overlap supported: %s",id->capability & 0x20 ? "Yes\n":"No\n");
5901
        printk(KERN_INFO "ide-tape: PIO Cycle Timing Category: %d\n",id->tPIO);
5902
        printk(KERN_INFO "ide-tape: DMA Cycle Timing Category: %d\n",id->tDMA);
5903
        printk(KERN_INFO "ide-tape: Single Word DMA supported modes: ");
5904
        for (i=0,mask=1;i<8;i++,mask=mask << 1) {
5905
                if (id->dma_1word & mask)
5906
                        printk("%d ",i);
5907
                if (id->dma_1word & (mask << 8))
5908
                        printk("(active) ");
5909
        }
5910
        printk("\n");
5911
        printk(KERN_INFO "ide-tape: Multi Word DMA supported modes: ");
5912
        for (i=0,mask=1;i<8;i++,mask=mask << 1) {
5913
                if (id->dma_mword & mask)
5914
                        printk("%d ",i);
5915
                if (id->dma_mword & (mask << 8))
5916
                        printk("(active) ");
5917
        }
5918
        printk("\n");
5919
        if (id->field_valid & 0x0002) {
5920
                printk(KERN_INFO "ide-tape: Enhanced PIO Modes: %s\n",id->eide_pio_modes & 1 ? "Mode 3":"None");
5921
                printk(KERN_INFO "ide-tape: Minimum Multi-word DMA cycle per word: ");
5922
                if (id->eide_dma_min == 0)
5923
                        printk("Not supported\n");
5924
                else
5925
                        printk("%d ns\n",id->eide_dma_min);
5926
 
5927
                printk(KERN_INFO "ide-tape: Manufacturer\'s Recommended Multi-word cycle: ");
5928
                if (id->eide_dma_time == 0)
5929
                        printk("Not supported\n");
5930
                else
5931
                        printk("%d ns\n",id->eide_dma_time);
5932
 
5933
                printk(KERN_INFO "ide-tape: Minimum PIO cycle without IORDY: ");
5934
                if (id->eide_pio == 0)
5935
                        printk("Not supported\n");
5936
                else
5937
                        printk("%d ns\n",id->eide_pio);
5938
 
5939
                printk(KERN_INFO "ide-tape: Minimum PIO cycle with IORDY: ");
5940
                if (id->eide_pio_iordy == 0)
5941
                        printk("Not supported\n");
5942
                else
5943
                        printk("%d ns\n",id->eide_pio_iordy);
5944
 
5945
        } else
5946
                printk(KERN_INFO "ide-tape: According to the device, fields 64-70 are not valid.\n");
5947
#endif /* IDETAPE_DEBUG_INFO */
5948
 
5949
        /* Check that we can support this device */
5950
 
5951
        if (gcw.protocol !=2 )
5952
                printk(KERN_ERR "ide-tape: Protocol is not ATAPI\n");
5953
        else if (gcw.device_type != 1)
5954
                printk(KERN_ERR "ide-tape: Device type is not set to tape\n");
5955
        else if (!gcw.removable)
5956
                printk(KERN_ERR "ide-tape: The removable flag is not set\n");
5957
        else if (gcw.packet_size != 0) {
5958
                printk(KERN_ERR "ide-tape: Packet size is not 12 bytes long\n");
5959
                if (gcw.packet_size == 1)
5960
                        printk(KERN_ERR "ide-tape: Sorry, padding to 16 bytes is still not supported\n");
5961
        } else
5962
                return 1;
5963
        return 0;
5964
}
5965
 
5966
/*
5967
 * Notify vendor ID to the OnStream tape drive
5968
 */
5969
static void idetape_onstream_set_vendor (ide_drive_t *drive, char *vendor)
5970
{
5971
        idetape_pc_t pc;
5972
        idetape_mode_parameter_header_t *header;
5973
 
5974
        idetape_create_mode_select_cmd(&pc, sizeof(*header) + 8);
5975
        pc.buffer[0] = 3 + 8;    /* Mode Data Length */
5976
        pc.buffer[1] = 0;        /* Medium Type - ignoring */
5977
        pc.buffer[2] = 0;        /* Reserved */
5978
        pc.buffer[3] = 0;        /* Block Descriptor Length */
5979
        pc.buffer[4 + 0] = 0x36 | (1 << 7);
5980
        pc.buffer[4 + 1] = 6;
5981
        pc.buffer[4 + 2] = vendor[0];
5982
        pc.buffer[4 + 3] = vendor[1];
5983
        pc.buffer[4 + 4] = vendor[2];
5984
        pc.buffer[4 + 5] = vendor[3];
5985
        pc.buffer[4 + 6] = 0;
5986
        pc.buffer[4 + 7] = 0;
5987
        if (idetape_queue_pc_tail(drive, &pc))
5988
                printk(KERN_ERR "ide-tape: Couldn't set vendor name to %s\n", vendor);
5989
 
5990
}
5991
 
5992
/*
5993
 * Various unused OnStream commands
5994
 */
5995
#if ONSTREAM_DEBUG
5996
static void idetape_onstream_set_retries (ide_drive_t *drive, int retries)
5997
{
5998
        idetape_pc_t pc;
5999
 
6000
        idetape_create_mode_select_cmd(&pc, sizeof(idetape_mode_parameter_header_t) + 4);
6001
        pc.buffer[0] = 3 + 4;
6002
        pc.buffer[1] = 0;        /* Medium Type - ignoring */
6003
        pc.buffer[2] = 0;        /* Reserved */
6004
        pc.buffer[3] = 0;        /* Block Descriptor Length */
6005
        pc.buffer[4 + 0] = 0x2f | (1 << 7);
6006
        pc.buffer[4 + 1] = 2;
6007
        pc.buffer[4 + 2] = 4;
6008
        pc.buffer[4 + 3] = retries;
6009
        if (idetape_queue_pc_tail(drive, &pc))
6010
                printk(KERN_ERR "ide-tape: Couldn't set retries to %d\n", retries);
6011
}
6012
#endif
6013
 
6014
/*
6015
 * Configure 32.5KB block size.
6016
 */
6017
static void idetape_onstream_configure_block_size (ide_drive_t *drive)
6018
{
6019
        idetape_pc_t pc;
6020
        idetape_mode_parameter_header_t *header;
6021
        idetape_block_size_page_t *bs;
6022
 
6023
        /*
6024
         * Get the current block size from the block size mode page
6025
         */
6026
        idetape_create_mode_sense_cmd(&pc, IDETAPE_BLOCK_SIZE_PAGE);
6027
        if (idetape_queue_pc_tail(drive, &pc))
6028
                printk(KERN_ERR "ide-tape: can't get tape block size mode page\n");
6029
        header = (idetape_mode_parameter_header_t *) pc.buffer;
6030
        bs = (idetape_block_size_page_t *) (pc.buffer + sizeof(idetape_mode_parameter_header_t) + header->bdl);
6031
 
6032
#if IDETAPE_DEBUG_INFO
6033
        printk(KERN_INFO "ide-tape: 32KB play back: %s\n", bs->play32 ? "Yes" : "No");
6034
        printk(KERN_INFO "ide-tape: 32.5KB play back: %s\n", bs->play32_5 ? "Yes" : "No");
6035
        printk(KERN_INFO "ide-tape: 32KB record: %s\n", bs->record32 ? "Yes" : "No");
6036
        printk(KERN_INFO "ide-tape: 32.5KB record: %s\n", bs->record32_5 ? "Yes" : "No");
6037
#endif /* IDETAPE_DEBUG_INFO */
6038
 
6039
        /*
6040
         * Configure default auto columns mode, 32.5KB block size
6041
         */
6042
        bs->one = 1;
6043
        bs->play32 = 0;
6044
        bs->play32_5 = 1;
6045
        bs->record32 = 0;
6046
        bs->record32_5 = 1;
6047
        idetape_create_mode_select_cmd(&pc, sizeof(*header) + sizeof(*bs));
6048
        if (idetape_queue_pc_tail(drive, &pc))
6049
                printk(KERN_ERR "ide-tape: Couldn't set tape block size mode page\n");
6050
 
6051
#if ONSTREAM_DEBUG
6052
        /*
6053
         * In debug mode, we want to see as many errors as possible
6054
         * to test the error recovery mechanism.
6055
         */
6056
        idetape_onstream_set_retries(drive, 0);
6057
#endif
6058
}
6059
 
6060
/*
6061
 * Use INQUIRY to get the firmware revision
6062
 */
6063
static void idetape_get_inquiry_results (ide_drive_t *drive)
6064
{
6065
        char *r;
6066
        idetape_tape_t *tape = drive->driver_data;
6067
        idetape_pc_t pc;
6068
        idetape_inquiry_result_t *inquiry;
6069
 
6070
        idetape_create_inquiry_cmd(&pc);
6071
        if (idetape_queue_pc_tail(drive, &pc)) {
6072
                printk(KERN_ERR "ide-tape: %s: can't get INQUIRY results\n", tape->name);
6073
                return;
6074
        }
6075
        inquiry = (idetape_inquiry_result_t *) pc.buffer;
6076
        memcpy(tape->vendor_id, inquiry->vendor_id, 8);
6077
        memcpy(tape->product_id, inquiry->product_id, 16);
6078
        memcpy(tape->firmware_revision, inquiry->revision_level, 4);
6079
        ide_fixstring(tape->vendor_id, 10, 0);
6080
        ide_fixstring(tape->product_id, 18, 0);
6081
        ide_fixstring(tape->firmware_revision, 6, 0);
6082
        r = tape->firmware_revision;
6083
        if (*(r + 1) == '.')
6084
                tape->firmware_revision_num = (*r - '0') * 100 + (*(r + 2) - '0') * 10 + *(r + 3) - '0';
6085
        else if (tape->onstream)
6086
                tape->firmware_revision_num = (*r - '0') * 100 + (*(r + 1) - '0') * 10 + *(r + 2) - '0';
6087
        printk(KERN_INFO "ide-tape: %s <-> %s: %s %s rev %s\n", drive->name, tape->name, tape->vendor_id, tape->product_id, tape->firmware_revision);
6088
}
6089
 
6090
/*
6091
 * Configure the OnStream ATAPI tape drive for default operation
6092
 */
6093
static void idetape_configure_onstream (ide_drive_t *drive)
6094
{
6095
        idetape_tape_t *tape = drive->driver_data;
6096
 
6097
        if (tape->firmware_revision_num < 105) {
6098
                printk(KERN_INFO "ide-tape: %s: Old OnStream firmware revision detected (%s)\n", tape->name, tape->firmware_revision);
6099
                printk(KERN_INFO "ide-tape: %s: An upgrade to version 1.05 or above is recommended\n", tape->name);
6100
        }
6101
 
6102
        /*
6103
         * Configure 32.5KB (data+aux) block size.
6104
         */
6105
        idetape_onstream_configure_block_size(drive);
6106
 
6107
        /*
6108
         * Set vendor name to 'LIN3' for "Linux support version 3".
6109
         */
6110
        idetape_onstream_set_vendor(drive, "LIN3");
6111
}
6112
 
6113
/*
6114
 *      idetape_get_mode_sense_parameters asks the tape about its various
6115
 *      parameters. This may work for other drives to???
6116
 */
6117
static void idetape_onstream_mode_sense_tape_parameter_page(ide_drive_t *drive, int debug)
6118
{
6119
        idetape_tape_t *tape = drive->driver_data;
6120
        idetape_pc_t pc;
6121
        idetape_mode_parameter_header_t *header;
6122
        onstream_tape_paramtr_page_t *prm;
6123
 
6124
        idetape_create_mode_sense_cmd(&pc, IDETAPE_PARAMTR_PAGE);
6125
        if (idetape_queue_pc_tail(drive, &pc)) {
6126
                printk(KERN_ERR "ide-tape: Can't get tape parameters page - probably no tape inserted in onstream drive\n");
6127
                return;
6128
        }
6129
        header = (idetape_mode_parameter_header_t *) pc.buffer;
6130
        prm = (onstream_tape_paramtr_page_t *) (pc.buffer + sizeof(idetape_mode_parameter_header_t) + header->bdl);
6131
 
6132
        tape->capacity = ntohs(prm->segtrk) * ntohs(prm->trks);
6133
        if (debug) {
6134
            printk(KERN_INFO "ide-tape: %s <-> %s: Tape length %dMB (%d frames/track, %d tracks = %d blocks, density: %dKbpi)\n",
6135
               drive->name, tape->name, tape->capacity/32, ntohs(prm->segtrk), ntohs(prm->trks), tape->capacity, prm->density);
6136
        }
6137
 
6138
        return;
6139
}
6140
 
6141
/*
6142
 *      idetape_get_mode_sense_results asks the tape about its various
6143
 *      parameters. In particular, we will adjust our data transfer buffer
6144
 *      size to the recommended value as returned by the tape.
6145
 */
6146
static void idetape_get_mode_sense_results (ide_drive_t *drive)
6147
{
6148
        idetape_tape_t *tape = drive->driver_data;
6149
        idetape_pc_t pc;
6150
        idetape_mode_parameter_header_t *header;
6151
        idetape_capabilities_page_t *capabilities;
6152
 
6153
        idetape_create_mode_sense_cmd(&pc, IDETAPE_CAPABILITIES_PAGE);
6154
        if (idetape_queue_pc_tail (drive, &pc)) {
6155
                printk(KERN_ERR "ide-tape: Can't get tape parameters - assuming some default values\n");
6156
                tape->tape_block_size = 512;
6157
                tape->capabilities.ctl = 52;
6158
                tape->capabilities.speed = 450;
6159
                tape->capabilities.buffer_size = 6 * 52;
6160
                return;
6161
        }
6162
        header = (idetape_mode_parameter_header_t *) pc.buffer;
6163
        capabilities = (idetape_capabilities_page_t *) (pc.buffer + sizeof(idetape_mode_parameter_header_t) + header->bdl);
6164
 
6165
        capabilities->max_speed = ntohs(capabilities->max_speed);
6166
        capabilities->ctl = ntohs(capabilities->ctl);
6167
        capabilities->speed = ntohs(capabilities->speed);
6168
        capabilities->buffer_size = ntohs(capabilities->buffer_size);
6169
 
6170
        if (!capabilities->speed) {
6171
                printk(KERN_INFO "ide-tape: %s: overriding capabilities->speed (assuming 650KB/sec)\n", drive->name);
6172
                capabilities->speed = 650;
6173
        }
6174
        if (!capabilities->max_speed) {
6175
                printk(KERN_INFO "ide-tape: %s: overriding capabilities->max_speed (assuming 650KB/sec)\n", drive->name);
6176
                capabilities->max_speed = 650;
6177
        }
6178
        if (!capabilities->ctl) {
6179
                printk(KERN_INFO "ide-tape: %s: overriding capabilities->ctl (assuming 26KB)\n", drive->name);
6180
                capabilities->ctl = 52;
6181
        }
6182
 
6183
        tape->capabilities = *capabilities;             /* Save us a copy */
6184
        if (capabilities->blk512)
6185
                tape->tape_block_size = 512;
6186
        else if (capabilities->blk1024)
6187
                tape->tape_block_size = 1024;
6188
        else if (tape->onstream && capabilities->blk32768)
6189
                tape->tape_block_size = 32768;
6190
 
6191
#if IDETAPE_DEBUG_INFO
6192
        printk(KERN_INFO "ide-tape: Dumping the results of the MODE SENSE packet command\n");
6193
        printk(KERN_INFO "ide-tape: Mode Parameter Header:\n");
6194
        printk(KERN_INFO "ide-tape: Mode Data Length - %d\n",header->mode_data_length);
6195
        printk(KERN_INFO "ide-tape: Medium Type - %d\n",header->medium_type);
6196
        printk(KERN_INFO "ide-tape: Device Specific Parameter - %d\n",header->dsp);
6197
        printk(KERN_INFO "ide-tape: Block Descriptor Length - %d\n",header->bdl);
6198
 
6199
        printk(KERN_INFO "ide-tape: Capabilities and Mechanical Status Page:\n");
6200
        printk(KERN_INFO "ide-tape: Page code - %d\n",capabilities->page_code);
6201
        printk(KERN_INFO "ide-tape: Page length - %d\n",capabilities->page_length);
6202
        printk(KERN_INFO "ide-tape: Read only - %s\n",capabilities->ro ? "Yes":"No");
6203
        printk(KERN_INFO "ide-tape: Supports reverse space - %s\n",capabilities->sprev ? "Yes":"No");
6204
        printk(KERN_INFO "ide-tape: Supports erase initiated formatting - %s\n",capabilities->efmt ? "Yes":"No");
6205
        printk(KERN_INFO "ide-tape: Supports QFA two Partition format - %s\n",capabilities->qfa ? "Yes":"No");
6206
        printk(KERN_INFO "ide-tape: Supports locking the medium - %s\n",capabilities->lock ? "Yes":"No");
6207
        printk(KERN_INFO "ide-tape: The volume is currently locked - %s\n",capabilities->locked ? "Yes":"No");
6208
        printk(KERN_INFO "ide-tape: The device defaults in the prevent state - %s\n",capabilities->prevent ? "Yes":"No");
6209
        printk(KERN_INFO "ide-tape: Supports ejecting the medium - %s\n",capabilities->eject ? "Yes":"No");
6210
        printk(KERN_INFO "ide-tape: Supports error correction - %s\n",capabilities->ecc ? "Yes":"No");
6211
        printk(KERN_INFO "ide-tape: Supports data compression - %s\n",capabilities->cmprs ? "Yes":"No");
6212
        printk(KERN_INFO "ide-tape: Supports 512 bytes block size - %s\n",capabilities->blk512 ? "Yes":"No");
6213
        printk(KERN_INFO "ide-tape: Supports 1024 bytes block size - %s\n",capabilities->blk1024 ? "Yes":"No");
6214
        printk(KERN_INFO "ide-tape: Supports 32768 bytes block size / Restricted byte count for PIO transfers - %s\n",capabilities->blk32768 ? "Yes":"No");
6215
        printk(KERN_INFO "ide-tape: Maximum supported speed in KBps - %d\n",capabilities->max_speed);
6216
        printk(KERN_INFO "ide-tape: Continuous transfer limits in blocks - %d\n",capabilities->ctl);
6217
        printk(KERN_INFO "ide-tape: Current speed in KBps - %d\n",capabilities->speed);
6218
        printk(KERN_INFO "ide-tape: Buffer size - %d\n",capabilities->buffer_size*512);
6219
#endif /* IDETAPE_DEBUG_INFO */
6220
}
6221
 
6222
/*
6223
 *      ide_get_blocksize_from_block_descriptor does a mode sense page 0 with block descriptor
6224
 *      and if it succeeds sets the tape block size with the reported value
6225
 */
6226
static void idetape_get_blocksize_from_block_descriptor(ide_drive_t *drive)
6227
{
6228
 
6229
        idetape_tape_t *tape = drive->driver_data;
6230
        idetape_pc_t pc;
6231
        idetape_mode_parameter_header_t *header;
6232
        idetape_parameter_block_descriptor_t *block_descrp;
6233
 
6234
        idetape_create_mode_sense_cmd(&pc, IDETAPE_BLOCK_DESCRIPTOR);
6235
        if (idetape_queue_pc_tail(drive, &pc)) {
6236
                printk(KERN_ERR "ide-tape: Can't get block descriptor\n");
6237
                return;
6238
        }
6239
        header = (idetape_mode_parameter_header_t *) pc.buffer;
6240
        block_descrp = (idetape_parameter_block_descriptor_t *) (pc.buffer + sizeof(idetape_mode_parameter_header_t));
6241
        tape->tape_block_size =( block_descrp->length[0]<<16) + (block_descrp->length[1]<<8) + block_descrp->length[2];
6242
#if IDETAPE_DEBUG_INFO
6243
        printk(KERN_INFO "ide-tape: Adjusted block size - %d\n", tape->tape_block_size);
6244
#endif /* IDETAPE_DEBUG_INFO */
6245
}
6246
 
6247
static void idetape_add_settings (ide_drive_t *drive)
6248
{
6249
        idetape_tape_t *tape = drive->driver_data;
6250
 
6251
/*
6252
 *                      drive   setting name    read/write      ioctl   ioctl           data type       min                     max                     mul_factor                      div_factor                      data pointer                            set function
6253
 */
6254
        ide_add_setting(drive,  "buffer",       SETTING_READ,   -1,     -1,             TYPE_SHORT,     0,                       0xffff,                 1,                              2,                              &tape->capabilities.buffer_size,        NULL);
6255
        ide_add_setting(drive,  "pipeline_min", SETTING_RW,     -1,     -1,             TYPE_INT,       1,                      0xffff,                 tape->stage_size / 1024,        1,                              &tape->min_pipeline,                    NULL);
6256
        ide_add_setting(drive,  "pipeline",     SETTING_RW,     -1,     -1,             TYPE_INT,       1,                      0xffff,                 tape->stage_size / 1024,        1,                              &tape->max_stages,                      NULL);
6257
        ide_add_setting(drive,  "pipeline_max", SETTING_RW,     -1,     -1,             TYPE_INT,       1,                      0xffff,                 tape->stage_size / 1024,        1,                              &tape->max_pipeline,                    NULL);
6258
        ide_add_setting(drive,  "pipeline_used",SETTING_READ,   -1,     -1,             TYPE_INT,       0,                       0xffff,                 tape->stage_size / 1024,        1,                              &tape->nr_stages,                       NULL);
6259
        ide_add_setting(drive,  "pipeline_pending",SETTING_READ,-1,     -1,             TYPE_INT,       0,                       0xffff,                 tape->stage_size / 1024,        1,                              &tape->nr_pending_stages,               NULL);
6260
        ide_add_setting(drive,  "speed",        SETTING_READ,   -1,     -1,             TYPE_SHORT,     0,                       0xffff,                 1,                              1,                              &tape->capabilities.speed,              NULL);
6261
        ide_add_setting(drive,  "stage",        SETTING_READ,   -1,     -1,             TYPE_INT,       0,                       0xffff,                 1,                              1024,                           &tape->stage_size,                      NULL);
6262
        ide_add_setting(drive,  "tdsc",         SETTING_RW,     -1,     -1,             TYPE_INT,       IDETAPE_DSC_RW_MIN,     IDETAPE_DSC_RW_MAX,     1000,                           HZ,                             &tape->best_dsc_rw_frequency,           NULL);
6263
        ide_add_setting(drive,  "dsc_overlap",  SETTING_RW,     -1,     -1,             TYPE_BYTE,      0,                       1,                      1,                              1,                              &drive->dsc_overlap,                    NULL);
6264
        ide_add_setting(drive,  "pipeline_head_speed_c",SETTING_READ,   -1,     -1,     TYPE_INT,       0,                       0xffff,                 1,                              1,                              &tape->controlled_pipeline_head_speed,  NULL);
6265
        ide_add_setting(drive,  "pipeline_head_speed_u",SETTING_READ,   -1,     -1,     TYPE_INT,       0,                       0xffff,                 1,                              1,                              &tape->uncontrolled_pipeline_head_speed,        NULL);
6266
        ide_add_setting(drive,  "avg_speed",    SETTING_READ,   -1,     -1,             TYPE_INT,       0,                       0xffff,                 1,                              1,                              &tape->avg_speed,               NULL);
6267
        ide_add_setting(drive,  "debug_level",SETTING_RW,       -1,     -1,             TYPE_INT,       0,                       0xffff,                 1,                              1,                              &tape->debug_level,             NULL);
6268
        if (tape->onstream) {
6269
                ide_add_setting(drive,  "cur_frames",   SETTING_READ,   -1,     -1,             TYPE_SHORT,     0,                       0xffff,                 1,                              1,                              &tape->cur_frames,              NULL);
6270
                ide_add_setting(drive,  "max_frames",   SETTING_READ,   -1,     -1,             TYPE_SHORT,     0,                       0xffff,                 1,                              1,                              &tape->max_frames,              NULL);
6271
                ide_add_setting(drive,  "insert_speed", SETTING_READ,   -1,     -1,             TYPE_INT,       0,                       0xffff,                 1,                              1,                              &tape->insert_speed,            NULL);
6272
                ide_add_setting(drive,  "speed_control",SETTING_RW,     -1,     -1,             TYPE_INT,       0,                       0xffff,                 1,                              1,                              &tape->speed_control,           NULL);
6273
                ide_add_setting(drive,  "tape_still_time",SETTING_READ, -1,     -1,             TYPE_INT,       0,                       0xffff,                 1,                              1,                              &tape->tape_still_time,         NULL);
6274
                ide_add_setting(drive,  "max_insert_speed",SETTING_RW,  -1,     -1,             TYPE_INT,       0,                       0xffff,                 1,                              1,                              &tape->max_insert_speed,        NULL);
6275
                ide_add_setting(drive,  "insert_size",  SETTING_READ,   -1,     -1,             TYPE_INT,       0,                       0xffff,                 1,                              1,                              &tape->insert_size,             NULL);
6276
                ide_add_setting(drive,  "capacity",     SETTING_READ,   -1,     -1,             TYPE_INT,       0,                       0xffff,                 1,                              1,                              &tape->capacity,                NULL);
6277
                ide_add_setting(drive,  "first_frame",  SETTING_READ,   -1,     -1,             TYPE_INT,       0,                       0xffff,                 1,                              1,                              &tape->first_frame_position,            NULL);
6278
                ide_add_setting(drive,  "logical_blk",  SETTING_READ,   -1,     -1,             TYPE_INT,       0,                       0xffff,                 1,                              1,                              &tape->logical_blk_num,         NULL);
6279
        }
6280
}
6281
 
6282
/*
6283
 *      ide_setup is called to:
6284
 *
6285
 *              1.      Initialize our various state variables.
6286
 *              2.      Ask the tape for its capabilities.
6287
 *              3.      Allocate a buffer which will be used for data
6288
 *                      transfer. The buffer size is chosen based on
6289
 *                      the recommendation which we received in step (2).
6290
 *
6291
 *      Note that at this point ide.c already assigned us an irq, so that
6292
 *      we can queue requests here and wait for their completion.
6293
 */
6294
static void idetape_setup (ide_drive_t *drive, idetape_tape_t *tape, int minor)
6295
{
6296
        unsigned long t1, tmid, tn, t;
6297
        int speed;
6298
        struct idetape_id_gcw gcw;
6299
        int stage_size;
6300
        struct sysinfo si;
6301
 
6302
        memset(tape, 0, sizeof (idetape_tape_t));
6303
        spin_lock_init(&tape->spinlock);
6304
        drive->driver_data = tape;
6305
        /* An ATAPI device ignores DRDY */
6306
        drive->ready_stat = 0;
6307
        if (strstr(drive->id->model, "OnStream DI-"))
6308
                tape->onstream = 1;
6309
        drive->dsc_overlap = (HWIF(drive)->no_dsc) ? 0 : 1;
6310
        if (HWIF(drive)->no_dsc) {
6311
                printk(KERN_INFO "ide-tape: %s: disabling DSC overlap\n",
6312
                        tape->name);
6313
                drive->dsc_overlap = 0;
6314
        }
6315
        tape->drive = drive;
6316
        tape->minor = minor;
6317
        tape->name[0] = 'h';
6318
        tape->name[1] = 't';
6319
        tape->name[2] = '0' + minor;
6320
        tape->chrdev_direction = idetape_direction_none;
6321
        tape->pc = tape->pc_stack;
6322
        tape->max_insert_speed = 10000;
6323
        tape->speed_control = 1;
6324
        *((unsigned short *) &gcw) = drive->id->config;
6325
        if (gcw.drq_type == 1)
6326
                set_bit(IDETAPE_DRQ_INTERRUPT, &tape->flags);
6327
 
6328
        tape->min_pipeline = tape->max_pipeline = tape->max_stages = 10;
6329
 
6330
        idetape_get_inquiry_results(drive);
6331
        idetape_get_mode_sense_results(drive);
6332
        idetape_get_blocksize_from_block_descriptor(drive);
6333
        if (tape->tape_block_size == 0) {
6334
                printk(KERN_WARNING "ide-tape: Zero block size, using 512\n");
6335
                tape->tape_block_size = 512;
6336
        }
6337
        if (tape->onstream) {
6338
                idetape_onstream_mode_sense_tape_parameter_page(drive, 1);
6339
                idetape_configure_onstream(drive);
6340
        }
6341
        tape->user_bs_factor = 1;
6342
        tape->stage_size = tape->capabilities.ctl * tape->tape_block_size;
6343
        while (tape->stage_size > 0xffff) {
6344
                printk (KERN_NOTICE "ide-tape: decreasing stage size\n");
6345
                tape->capabilities.ctl /= 2;
6346
                tape->stage_size = tape->capabilities.ctl * tape->tape_block_size;
6347
        }
6348
        stage_size = tape->stage_size;
6349
        if (tape->onstream)
6350
                stage_size = 32768 + 512;
6351
        tape->pages_per_stage = stage_size / PAGE_SIZE;
6352
        if (stage_size % PAGE_SIZE) {
6353
                tape->pages_per_stage++;
6354
                tape->excess_bh_size = PAGE_SIZE - stage_size % PAGE_SIZE;
6355
        }
6356
 
6357
        /*
6358
         *      Select the "best" DSC read/write polling frequency
6359
         *      and pipeline size.
6360
         */
6361
        speed = IDE_MAX(tape->capabilities.speed, tape->capabilities.max_speed);
6362
 
6363
        tape->max_stages = speed * 1000 * 10 / tape->stage_size;
6364
 
6365
        /*
6366
         *      Limit memory use for pipeline to 10% of physical memory
6367
         */
6368
        si_meminfo(&si);
6369
        if (tape->max_stages * tape->stage_size > si.totalram * si.mem_unit / 10)
6370
                tape->max_stages = si.totalram * si.mem_unit / (10 * tape->stage_size);
6371
        tape->max_stages   = IDE_MIN(tape->max_stages, IDETAPE_MAX_PIPELINE_STAGES);
6372
        tape->min_pipeline = IDE_MIN(tape->max_stages, IDETAPE_MIN_PIPELINE_STAGES);
6373
        tape->max_pipeline = IDE_MIN(tape->max_stages * 2, IDETAPE_MAX_PIPELINE_STAGES);
6374
        if (tape->max_stages == 0)
6375
                tape->max_stages = tape->min_pipeline = tape->max_pipeline = 1;
6376
 
6377
        t1 = (tape->stage_size * HZ) / (speed * 1000);
6378
        tmid = (tape->capabilities.buffer_size * 32 * HZ) / (speed * 125);
6379
        tn = (IDETAPE_FIFO_THRESHOLD * tape->stage_size * HZ) / (speed * 1000);
6380
 
6381
        if (tape->max_stages)
6382
                t = tn;
6383
        else
6384
                t = t1;
6385
 
6386
        /*
6387
         *      Ensure that the number we got makes sense; limit
6388
         *      it within IDETAPE_DSC_RW_MIN and IDETAPE_DSC_RW_MAX.
6389
         */
6390
        tape->best_dsc_rw_frequency = IDE_MAX(IDE_MIN(t, IDETAPE_DSC_RW_MAX), IDETAPE_DSC_RW_MIN);
6391
        printk(KERN_INFO "ide-tape: %s <-> %s: %dKBps, %d*%dkB buffer, "
6392
                "%dkB pipeline, %lums tDSC%s\n",
6393
                drive->name, tape->name, tape->capabilities.speed,
6394
                (tape->capabilities.buffer_size * 512) / tape->stage_size,
6395
                tape->stage_size / 1024,
6396
                tape->max_stages * tape->stage_size / 1024,
6397
                tape->best_dsc_rw_frequency * 1000 / HZ,
6398
                drive->using_dma ? ", DMA":"");
6399
 
6400
        idetape_add_settings(drive);
6401
}
6402
 
6403
static int idetape_cleanup (ide_drive_t *drive)
6404
{
6405
        idetape_tape_t *tape = drive->driver_data;
6406
        int minor = tape->minor;
6407
        unsigned long flags;
6408
 
6409
        spin_lock_irqsave(&io_request_lock, flags);
6410
        if (test_bit(IDETAPE_BUSY, &tape->flags) || drive->usage ||
6411
            tape->first_stage != NULL || tape->merge_stage_size) {
6412
                spin_unlock_irqrestore(&io_request_lock, flags);
6413
                return 1;
6414
        }
6415
        idetape_chrdevs[minor].drive = NULL;
6416
        spin_unlock_irqrestore(&io_request_lock, flags);
6417
        DRIVER(drive)->busy = 0;
6418
        (void) ide_unregister_subdriver(drive);
6419
        drive->driver_data = NULL;
6420
        devfs_unregister(tape->de_r);
6421
        devfs_unregister(tape->de_n);
6422
        kfree(tape);
6423
        for (minor = 0; minor < MAX_HWIFS * MAX_DRIVES; minor++)
6424
                if (idetape_chrdevs[minor].drive != NULL)
6425
                        return 0;
6426
        devfs_unregister_chrdev(IDETAPE_MAJOR, "ht");
6427
        idetape_chrdev_present = 0;
6428
        return 0;
6429
}
6430
 
6431
#ifdef CONFIG_PROC_FS
6432
 
6433
static int proc_idetape_read_name
6434
        (char *page, char **start, off_t off, int count, int *eof, void *data)
6435
{
6436
        ide_drive_t     *drive = (ide_drive_t *) data;
6437
        idetape_tape_t  *tape = drive->driver_data;
6438
        char            *out = page;
6439
        int             len;
6440
 
6441
        len = sprintf(out, "%s\n", tape->name);
6442
        PROC_IDE_READ_RETURN(page, start, off, count, eof, len);
6443
}
6444
 
6445
static ide_proc_entry_t idetape_proc[] = {
6446
        { "name",       S_IFREG|S_IRUGO,        proc_idetape_read_name, NULL },
6447
        { NULL, 0, NULL, NULL }
6448
};
6449
 
6450
#else
6451
 
6452
#define idetape_proc    NULL
6453
 
6454
#endif
6455
 
6456
int idetape_init (void);
6457
int idetape_attach(ide_drive_t *drive);
6458
 
6459
/*
6460
 *      IDE subdriver functions, registered with ide.c
6461
 */
6462
static ide_driver_t idetape_driver = {
6463
        name:                   "ide-tape",
6464
        version:                IDETAPE_VERSION,
6465
        media:                  ide_tape,
6466
        busy:                   1,
6467
        supports_dma:           1,
6468
        supports_dsc_overlap:   1,
6469
        cleanup:                idetape_cleanup,
6470
        standby:                NULL,
6471
        suspend:                NULL,
6472
        resume:                 NULL,
6473
        flushcache:             NULL,
6474
        do_request:             idetape_do_request,
6475
        end_request:            idetape_end_request,
6476
        sense:                  NULL,
6477
        error:                  NULL,
6478
        ioctl:                  idetape_blkdev_ioctl,
6479
        open:                   idetape_blkdev_open,
6480
        release:                idetape_blkdev_release,
6481
        media_change:           NULL,
6482
        revalidate:             NULL,
6483
        pre_reset:              idetape_pre_reset,
6484
        capacity:               NULL,
6485
        special:                NULL,
6486
        proc:                   idetape_proc,
6487
        init:                   idetape_init,
6488
        attach:                 idetape_attach,
6489
        ata_prebuilder:         NULL,
6490
        atapi_prebuilder:       NULL,
6491
};
6492
 
6493
static ide_module_t idetape_module = {
6494
        IDE_DRIVER_MODULE,
6495
        idetape_init,
6496
        &idetape_driver,
6497
        NULL
6498
};
6499
 
6500
/*
6501
 *      Our character device supporting functions, passed to register_chrdev.
6502
 */
6503
static struct file_operations idetape_fops = {
6504
        owner:          THIS_MODULE,
6505
        read:           idetape_chrdev_read,
6506
        write:          idetape_chrdev_write,
6507
        ioctl:          idetape_chrdev_ioctl,
6508
        open:           idetape_chrdev_open,
6509
        release:        idetape_chrdev_release,
6510
};
6511
 
6512
int idetape_attach (ide_drive_t *drive)
6513
{
6514
        idetape_tape_t *tape;
6515
        int minor = 0, ret = 0;
6516
 
6517
        MOD_INC_USE_COUNT;
6518
 
6519
        if (idetape_identify_device(drive)) {
6520
                printk(KERN_ERR "ide-tape: %s: not supported by this "
6521
                        "version of ide-tape\n", drive->name);
6522
                        ret = 1;
6523
                        goto bye_game_over;
6524
        }
6525
        if (drive->scsi) {
6526
                if (strstr(drive->id->model, "OnStream DI-30")) {
6527
                        printk("ide-tape: ide-scsi emulation is not "
6528
                                "supported for %s.\n", drive->id->model);
6529
                } else {
6530
                        printk("ide-tape: passing drive %s to ide-scsi "
6531
                                "emulation.\n", drive->name);
6532
                        ret = 1;
6533
                        goto bye_game_over;
6534
                }
6535
        }
6536
        tape = (idetape_tape_t *) kmalloc (sizeof (idetape_tape_t), GFP_KERNEL);
6537
        if (tape == NULL) {
6538
                printk(KERN_ERR "ide-tape: %s: Can't allocate a "
6539
                        "tape structure\n", drive->name);
6540
                ret = 1;
6541
                goto bye_game_over;
6542
        }
6543
        if (ide_register_subdriver(drive,
6544
                        &idetape_driver, IDE_SUBDRIVER_VERSION)) {
6545
                printk(KERN_ERR "ide-tape: %s: Failed to register the "
6546
                                "driver with ide.c\n", drive->name);
6547
                kfree(tape);
6548
                ret = 1;
6549
                goto bye_game_over;
6550
        }
6551
        for (minor = 0; idetape_chrdevs[minor].drive != NULL; minor++);
6552
        idetape_setup (drive, tape, minor);
6553
        idetape_chrdevs[minor].drive = drive;
6554
        tape->de_r = devfs_register(drive->de, "mt", DEVFS_FL_DEFAULT,
6555
                                    HWIF(drive)->major, minor,
6556
                                    S_IFCHR | S_IRUGO | S_IWUGO,
6557
                                    &idetape_fops, NULL);
6558
        tape->de_n = devfs_register(drive->de, "mtn", DEVFS_FL_DEFAULT,
6559
                                    HWIF(drive)->major, minor + 128,
6560
                                    S_IFCHR | S_IRUGO | S_IWUGO,
6561
                                    &idetape_fops, NULL);
6562
        devfs_register_tape(tape->de_r);
6563
 
6564
bye_game_over:
6565
        MOD_DEC_USE_COUNT;
6566
 
6567
        return ret;
6568
}
6569
 
6570
MODULE_DESCRIPTION("ATAPI Streaming TAPE Driver");
6571
MODULE_LICENSE("GPL");
6572
 
6573
static void __exit idetape_exit (void)
6574
{
6575
        ide_drive_t *drive;
6576
        int minor;
6577
 
6578
        for (minor = 0; minor < MAX_HWIFS * MAX_DRIVES; minor++) {
6579
                drive = idetape_chrdevs[minor].drive;
6580
                if (drive) {
6581
                        if (idetape_cleanup(drive))
6582
                                printk(KERN_ERR "ide-tape: %s: cleanup_module() "
6583
                                        "called while still busy\n", drive->name);
6584
#ifdef CONFIG_PROC_FS
6585
                        if (drive->proc)
6586
                                ide_remove_proc_entries(drive->proc, idetape_proc);
6587
#endif
6588
                }
6589
        }
6590
 
6591
        ide_unregister_module(&idetape_module);
6592
}
6593
 
6594
int idetape_init (void)
6595
{
6596
#ifdef CLASSIC_BUILTINS_METHOD
6597
        ide_drive_t *drive;
6598
        idetape_tape_t *tape;
6599
        int minor, failed = 0, supported = 0;
6600
/* DRIVER(drive)->busy++; */
6601
        MOD_INC_USE_COUNT;
6602
#if ONSTREAM_DEBUG
6603
        printk(KERN_INFO "ide-tape: MOD_INC_USE_COUNT in idetape_init\n");
6604
#endif
6605
        if (!idetape_chrdev_present)
6606
                for (minor = 0; minor < MAX_HWIFS * MAX_DRIVES; minor++ )
6607
                        idetape_chrdevs[minor].drive = NULL;
6608
        if ((drive = ide_scan_devices(ide_tape, idetape_driver.name,
6609
                        NULL, failed++)) == NULL) {
6610
                ide_register_module(&idetape_module);
6611
                MOD_DEC_USE_COUNT;
6612
#if ONSTREAM_DEBUG
6613
                printk(KERN_INFO "ide-tape: MOD_DEC_USE_COUNT in "
6614
                        "idetape_init\n");
6615
#endif
6616
                return 0;
6617
        }
6618
        if (!idetape_chrdev_present &&
6619
            devfs_register_chrdev(IDETAPE_MAJOR, "ht", &idetape_fops)) {
6620
                printk(KERN_ERR "ide-tape: Failed to register character "
6621
                        "device interface\n");
6622
                MOD_DEC_USE_COUNT;
6623
#if ONSTREAM_DEBUG
6624
                printk(KERN_INFO "ide-tape: MOD_DEC_USE_COUNT in "
6625
                        "idetape_init\n");
6626
#endif
6627
                return -EBUSY;
6628
        }
6629
        do {
6630
                if (!idetape_identify_device(drive)) {
6631
                        printk(KERN_ERR "ide-tape: %s: not supported by this "
6632
                                "version of ide-tape\n", drive->name);
6633
                        continue;
6634
                }
6635
                if (drive->scsi) {
6636
                        if (strstr(drive->id->model, "OnStream DI-")) {
6637
                                printk("ide-tape: ide-scsi emulation is not "
6638
                                        "supported for %s.\n",
6639
                                        drive->id->model);
6640
                        } else {
6641
                                printk("ide-tape: passing drive %s to "
6642
                                        "ide-scsi emulation.\n", drive->name);
6643
                                continue;
6644
                        }
6645
                }
6646
                tape = (idetape_tape_t *) kmalloc (sizeof (idetape_tape_t), GFP_KERNEL);
6647
                if (tape == NULL) {
6648
                        printk(KERN_ERR "ide-tape: %s: Can't allocate a tape "
6649
                                "structure\n", drive->name);
6650
                        continue;
6651
                }
6652
                if (ide_register_subdriver(drive,
6653
                                &idetape_driver, IDE_SUBDRIVER_VERSION)) {
6654
                        printk(KERN_ERR "ide-tape: %s: Failed to register the "
6655
                                "driver with ide.c\n", drive->name);
6656
                        kfree(tape);
6657
                        continue;
6658
                }
6659
                for (minor = 0; idetape_chrdevs[minor].drive != NULL; minor++);
6660
                idetape_setup(drive, tape, minor);
6661
                idetape_chrdevs[minor].drive = drive;
6662
                tape->de_r =
6663
                    devfs_register(drive->de, "mt", DEVFS_FL_DEFAULT,
6664
                                    HWIF(drive)->major, minor,
6665
                                    S_IFCHR | S_IRUGO | S_IWUGO,
6666
                                    &idetape_fops, NULL);
6667
                tape->de_n =
6668
                    devfs_register(drive->de, "mtn", DEVFS_FL_DEFAULT,
6669
                                    HWIF(drive)->major, minor + 128,
6670
                                    S_IFCHR | S_IRUGO | S_IWUGO,
6671
                                    &idetape_fops, NULL);
6672
                devfs_register_tape(tape->de_r);
6673
                supported++;
6674
                failed--;
6675
        } while ((drive = ide_scan_devices(ide_tape,
6676
                        idetape_driver.name, NULL, failed++)) != NULL);
6677
        if (!idetape_chrdev_present && !supported) {
6678
                devfs_unregister_chrdev(IDETAPE_MAJOR, "ht");
6679
        } else
6680
                idetape_chrdev_present = 1;
6681
#else /* ! CLASSIC_BUILTINS_METHOD */
6682
        int minor = 0;
6683
 
6684
        if (idetape_chrdev_present)
6685
                return 0;
6686
        idetape_chrdev_present = 1;
6687
        for (minor = 0; minor < MAX_HWIFS * MAX_DRIVES; minor++ )
6688
                idetape_chrdevs[minor].drive = NULL;
6689
        devfs_register_chrdev(IDETAPE_MAJOR, "ht", &idetape_fops);
6690
        MOD_INC_USE_COUNT;
6691
#endif /* CLASSIC_BUILTINS_METHOD */
6692
        ide_register_module(&idetape_module);
6693
        MOD_DEC_USE_COUNT;
6694
        return 0;
6695
}
6696
 
6697
module_init(idetape_init);
6698
module_exit(idetape_exit);

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.