| Borislav Petkov | 5ce78af | 2008-02-02 19:56:48 +0100 | [diff] [blame] | 1 | /* | 
|  | 2 | * Ver 0.1   Nov  1 95   Pre-working code :-) | 
|  | 3 | * Ver 0.2   Nov 23 95   A short backup (few megabytes) and restore procedure | 
|  | 4 | *                        was successful ! (Using tar cvf ... on the block | 
|  | 5 | *                        device interface). | 
|  | 6 | *                       A longer backup resulted in major swapping, bad | 
|  | 7 | *                        overall Linux performance and eventually failed as | 
|  | 8 | *                        we received non serial read-ahead requests from the | 
|  | 9 | *                        buffer cache. | 
|  | 10 | * Ver 0.3   Nov 28 95   Long backups are now possible, thanks to the | 
|  | 11 | *                        character device interface. Linux's responsiveness | 
|  | 12 | *                        and performance doesn't seem to be much affected | 
|  | 13 | *                        from the background backup procedure. | 
|  | 14 | *                       Some general mtio.h magnetic tape operations are | 
|  | 15 | *                        now supported by our character device. As a result, | 
|  | 16 | *                        popular tape utilities are starting to work with | 
|  | 17 | *                        ide tapes :-) | 
|  | 18 | *                       The following configurations were tested: | 
|  | 19 | *                       1. An IDE ATAPI TAPE shares the same interface | 
|  | 20 | *                        and irq with an IDE ATAPI CDROM. | 
|  | 21 | *                       2. An IDE ATAPI TAPE shares the same interface | 
|  | 22 | *                        and irq with a normal IDE disk. | 
|  | 23 | *                        Both configurations seemed to work just fine ! | 
|  | 24 | *                        However, to be on the safe side, it is meanwhile | 
|  | 25 | *                        recommended to give the IDE TAPE its own interface | 
|  | 26 | *                        and irq. | 
|  | 27 | *                       The one thing which needs to be done here is to | 
|  | 28 | *                        add a "request postpone" feature to ide.c, | 
|  | 29 | *                        so that we won't have to wait for the tape to finish | 
|  | 30 | *                        performing a long media access (DSC) request (such | 
|  | 31 | *                        as a rewind) before we can access the other device | 
|  | 32 | *                        on the same interface. This effect doesn't disturb | 
|  | 33 | *                        normal operation most of the time because read/write | 
|  | 34 | *                        requests are relatively fast, and once we are | 
|  | 35 | *                        performing one tape r/w request, a lot of requests | 
|  | 36 | *                        from the other device can be queued and ide.c will | 
|  | 37 | *			  service all of them after this single tape request. | 
|  | 38 | * Ver 1.0   Dec 11 95   Integrated into Linux 1.3.46 development tree. | 
|  | 39 | *                       On each read / write request, we now ask the drive | 
|  | 40 | *                        if we can transfer a constant number of bytes | 
|  | 41 | *                        (a parameter of the drive) only to its buffers, | 
|  | 42 | *                        without causing actual media access. If we can't, | 
|  | 43 | *                        we just wait until we can by polling the DSC bit. | 
|  | 44 | *                        This ensures that while we are not transferring | 
|  | 45 | *                        more bytes than the constant referred to above, the | 
|  | 46 | *                        interrupt latency will not become too high and | 
|  | 47 | *                        we won't cause an interrupt timeout, as happened | 
|  | 48 | *                        occasionally in the previous version. | 
|  | 49 | *                       While polling for DSC, the current request is | 
|  | 50 | *                        postponed and ide.c is free to handle requests from | 
|  | 51 | *                        the other device. This is handled transparently to | 
|  | 52 | *                        ide.c. The hwgroup locking method which was used | 
|  | 53 | *                        in the previous version was removed. | 
|  | 54 | *                       Use of new general features which are provided by | 
|  | 55 | *                        ide.c for use with atapi devices. | 
|  | 56 | *                        (Programming done by Mark Lord) | 
|  | 57 | *                       Few potential bug fixes (Again, suggested by Mark) | 
|  | 58 | *                       Single character device data transfers are now | 
|  | 59 | *                        not limited in size, as they were before. | 
|  | 60 | *                       We are asking the tape about its recommended | 
|  | 61 | *                        transfer unit and send a larger data transfer | 
|  | 62 | *                        as several transfers of the above size. | 
|  | 63 | *                        For best results, use an integral number of this | 
|  | 64 | *                        basic unit (which is shown during driver | 
|  | 65 | *                        initialization). I will soon add an ioctl to get | 
|  | 66 | *                        this important parameter. | 
|  | 67 | *                       Our data transfer buffer is allocated on startup, | 
|  | 68 | *                        rather than before each data transfer. This should | 
|  | 69 | *                        ensure that we will indeed have a data buffer. | 
|  | 70 | * Ver 1.1   Dec 14 95   Fixed random problems which occurred when the tape | 
|  | 71 | *                        shared an interface with another device. | 
|  | 72 | *                        (poll_for_dsc was a complete mess). | 
|  | 73 | *                       Removed some old (non-active) code which had | 
|  | 74 | *                        to do with supporting buffer cache originated | 
|  | 75 | *                        requests. | 
|  | 76 | *                       The block device interface can now be opened, so | 
|  | 77 | *                        that general ide driver features like the unmask | 
|  | 78 | *                        interrupts flag can be selected with an ioctl. | 
|  | 79 | *                        This is the only use of the block device interface. | 
|  | 80 | *                       New fast pipelined operation mode (currently only on | 
|  | 81 | *                        writes). When using the pipelined mode, the | 
|  | 82 | *                        throughput can potentially reach the maximum | 
|  | 83 | *                        tape supported throughput, regardless of the | 
|  | 84 | *                        user backup program. On my tape drive, it sometimes | 
|  | 85 | *                        boosted performance by a factor of 2. Pipelined | 
|  | 86 | *                        mode is enabled by default, but since it has a few | 
|  | 87 | *                        downfalls as well, you may want to disable it. | 
|  | 88 | *                        A short explanation of the pipelined operation mode | 
|  | 89 | *                        is available below. | 
|  | 90 | * Ver 1.2   Jan  1 96   Eliminated pipelined mode race condition. | 
|  | 91 | *                       Added pipeline read mode. As a result, restores | 
|  | 92 | *                        are now as fast as backups. | 
|  | 93 | *                       Optimized shared interface behavior. The new behavior | 
|  | 94 | *                        typically results in better IDE bus efficiency and | 
|  | 95 | *                        higher tape throughput. | 
|  | 96 | *                       Pre-calculation of the expected read/write request | 
|  | 97 | *                        service time, based on the tape's parameters. In | 
|  | 98 | *                        the pipelined operation mode, this allows us to | 
|  | 99 | *                        adjust our polling frequency to a much lower value, | 
|  | 100 | *                        and thus to dramatically reduce our load on Linux, | 
|  | 101 | *                        without any decrease in performance. | 
|  | 102 | *                       Implemented additional mtio.h operations. | 
|  | 103 | *                       The recommended user block size is returned by | 
|  | 104 | *                        the MTIOCGET ioctl. | 
|  | 105 | *                       Additional minor changes. | 
|  | 106 | * Ver 1.3   Feb  9 96   Fixed pipelined read mode bug which prevented the | 
|  | 107 | *                        use of some block sizes during a restore procedure. | 
|  | 108 | *                       The character device interface will now present a | 
|  | 109 | *                        continuous view of the media - any mix of block sizes | 
|  | 110 | *                        during a backup/restore procedure is supported. The | 
|  | 111 | *                        driver will buffer the requests internally and | 
|  | 112 | *                        convert them to the tape's recommended transfer | 
|  | 113 | *                        unit, making performance almost independent of the | 
|  | 114 | *                        chosen user block size. | 
|  | 115 | *                       Some improvements in error recovery. | 
|  | 116 | *                       By cooperating with ide-dma.c, bus mastering DMA can | 
|  | 117 | *                        now sometimes be used with IDE tape drives as well. | 
|  | 118 | *                        Bus mastering DMA has the potential to dramatically | 
|  | 119 | *                        reduce the CPU's overhead when accessing the device, | 
|  | 120 | *                        and can be enabled by using hdparm -d1 on the tape's | 
|  | 121 | *                        block device interface. For more info, read the | 
|  | 122 | *                        comments in ide-dma.c. | 
|  | 123 | * Ver 1.4   Mar 13 96   Fixed serialize support. | 
|  | 124 | * Ver 1.5   Apr 12 96   Fixed shared interface operation, broken in 1.3.85. | 
|  | 125 | *                       Fixed pipelined read mode inefficiency. | 
|  | 126 | *                       Fixed nasty null dereferencing bug. | 
|  | 127 | * Ver 1.6   Aug 16 96   Fixed FPU usage in the driver. | 
|  | 128 | *                       Fixed end of media bug. | 
|  | 129 | * Ver 1.7   Sep 10 96   Minor changes for the CONNER CTT8000-A model. | 
|  | 130 | * Ver 1.8   Sep 26 96   Attempt to find a better balance between good | 
|  | 131 | *                        interactive response and high system throughput. | 
|  | 132 | * Ver 1.9   Nov  5 96   Automatically cross encountered filemarks rather | 
|  | 133 | *                        than requiring an explicit FSF command. | 
|  | 134 | *                       Abort pending requests at end of media. | 
|  | 135 | *                       MTTELL was sometimes returning incorrect results. | 
|  | 136 | *                       Return the real block size in the MTIOCGET ioctl. | 
|  | 137 | *                       Some error recovery bug fixes. | 
|  | 138 | * Ver 1.10  Nov  5 96   Major reorganization. | 
|  | 139 | *                       Reduced CPU overhead a bit by eliminating internal | 
|  | 140 | *                        bounce buffers. | 
|  | 141 | *                       Added module support. | 
|  | 142 | *                       Added multiple tape drives support. | 
|  | 143 | *                       Added partition support. | 
|  | 144 | *                       Rewrote DSC handling. | 
|  | 145 | *                       Some portability fixes. | 
|  | 146 | *                       Removed ide-tape.h. | 
|  | 147 | *                       Additional minor changes. | 
|  | 148 | * Ver 1.11  Dec  2 96   Bug fix in previous DSC timeout handling. | 
|  | 149 | *                       Use ide_stall_queue() for DSC overlap. | 
|  | 150 | *                       Use the maximum speed rather than the current speed | 
|  | 151 | *                        to compute the request service time. | 
|  | 152 | * Ver 1.12  Dec  7 97   Fix random memory overwriting and/or last block data | 
|  | 153 | *                        corruption, which could occur if the total number | 
|  | 154 | *                        of bytes written to the tape was not an integral | 
|  | 155 | *                        number of tape blocks. | 
|  | 156 | *                       Add support for INTERRUPT DRQ devices. | 
|  | 157 | * Ver 1.13  Jan  2 98   Add "speed == 0" work-around for HP COLORADO 5GB | 
|  | 158 | * Ver 1.14  Dec 30 98   Partial fixes for the Sony/AIWA tape drives. | 
|  | 159 | *                       Replace cli()/sti() with hwgroup spinlocks. | 
|  | 160 | * Ver 1.15  Mar 25 99   Fix SMP race condition by replacing hwgroup | 
|  | 161 | *                        spinlock with private per-tape spinlock. | 
|  | 162 | * Ver 1.16  Sep  1 99   Add OnStream tape support. | 
|  | 163 | *                       Abort read pipeline on EOD. | 
|  | 164 | *                       Wait for the tape to become ready in case it returns | 
|  | 165 | *                        "in the process of becoming ready" on open(). | 
|  | 166 | *                       Fix zero padding of the last written block in | 
|  | 167 | *                        case the tape block size is larger than PAGE_SIZE. | 
|  | 168 | *                       Decrease the default disconnection time to tn. | 
|  | 169 | * Ver 1.16e Oct  3 99   Minor fixes. | 
|  | 170 | * Ver 1.16e1 Oct 13 99  Patches by Arnold Niessen, | 
|  | 171 | *                          niessen@iae.nl / arnold.niessen@philips.com | 
|  | 172 | *                   GO-1)  Undefined code in idetape_read_position | 
|  | 173 | *				according to Gadi's email | 
|  | 174 | *                   AJN-1) Minor fix asc == 11 should be asc == 0x11 | 
|  | 175 | *                               in idetape_issue_packet_command (did effect | 
|  | 176 | *                               debugging output only) | 
|  | 177 | *                   AJN-2) Added more debugging output, and | 
|  | 178 | *                              added ide-tape: where missing. I would also | 
|  | 179 | *				like to add tape->name where possible | 
|  | 180 | *                   AJN-3) Added different debug_level's | 
|  | 181 | *                              via /proc/ide/hdc/settings | 
|  | 182 | *				"debug_level" determines amount of debugging output; | 
|  | 183 | *				can be changed using /proc/ide/hdx/settings | 
|  | 184 | *				0 : almost no debugging output | 
|  | 185 | *				1 : 0+output errors only | 
|  | 186 | *				2 : 1+output all sensekey/asc | 
|  | 187 | *				3 : 2+follow all chrdev related procedures | 
|  | 188 | *				4 : 3+follow all procedures | 
|  | 189 | *				5 : 4+include pc_stack rq_stack info | 
|  | 190 | *				6 : 5+USE_COUNT updates | 
|  | 191 | *                   AJN-4) Fixed timeout for retension in idetape_queue_pc_tail | 
|  | 192 | *				from 5 to 10 minutes | 
|  | 193 | *                   AJN-5) Changed maximum number of blocks to skip when | 
|  | 194 | *                              reading tapes with multiple consecutive write | 
|  | 195 | *                              errors from 100 to 1000 in idetape_get_logical_blk | 
|  | 196 | *                   Proposed changes to code: | 
|  | 197 | *                   1) output "logical_blk_num" via /proc | 
|  | 198 | *                   2) output "current_operation" via /proc | 
|  | 199 | *                   3) Either solve or document the fact that `mt rewind' is | 
|  | 200 | *                      required after reading from /dev/nhtx to be | 
|  | 201 | *			able to rmmod the idetape module; | 
|  | 202 | *			Also, sometimes an application finishes but the | 
|  | 203 | *			device remains `busy' for some time. Same cause ? | 
|  | 204 | *                   Proposed changes to release-notes: | 
|  | 205 | *		     4) write a simple `quickstart' section in the | 
|  | 206 | *                      release notes; I volunteer if you don't want to | 
|  | 207 | *		     5) include a pointer to video4linux in the doc | 
|  | 208 | *                      to stimulate video applications | 
|  | 209 | *                   6) release notes lines 331 and 362: explain what happens | 
|  | 210 | *			if the application data rate is higher than 1100 KB/s; | 
|  | 211 | *			similar approach to lower-than-500 kB/s ? | 
|  | 212 | *		     7) 6.6 Comparison; wouldn't it be better to allow different | 
|  | 213 | *			strategies for read and write ? | 
|  | 214 | *			Wouldn't it be better to control the tape buffer | 
|  | 215 | *			contents instead of the bandwidth ? | 
|  | 216 | *		     8) line 536: replace will by would (if I understand | 
|  | 217 | *			this section correctly, a hypothetical and unwanted situation | 
|  | 218 | *			 is being described) | 
|  | 219 | * Ver 1.16f Dec 15 99   Change place of the secondary OnStream header frames. | 
|  | 220 | * Ver 1.17  Nov 2000 / Jan 2001  Marcel Mol, marcel@mesa.nl | 
|  | 221 | *			- Add idetape_onstream_mode_sense_tape_parameter_page | 
|  | 222 | *			  function to get tape capacity in frames: tape->capacity. | 
|  | 223 | *			- Add support for DI-50 drives( or any DI- drive). | 
|  | 224 | *			- 'workaround' for read error/blank block around block 3000. | 
|  | 225 | *			- Implement Early warning for end of media for Onstream. | 
|  | 226 | *			- Cosmetic code changes for readability. | 
|  | 227 | *			- Idetape_position_tape should not use SKIP bit during | 
|  | 228 | *			  Onstream read recovery. | 
|  | 229 | *			- Add capacity, logical_blk_num and first/last_frame_position | 
|  | 230 | *			  to /proc/ide/hd?/settings. | 
|  | 231 | *			- Module use count was gone in the Linux 2.4 driver. | 
|  | 232 | * Ver 1.17a Apr 2001 Willem Riede osst@riede.org | 
|  | 233 | *			- Get drive's actual block size from mode sense block descriptor | 
|  | 234 | *			- Limit size of pipeline | 
|  | 235 | * Ver 1.17b Oct 2002   Alan Stern <stern@rowland.harvard.edu> | 
|  | 236 | *			Changed IDETAPE_MIN_PIPELINE_STAGES to 1 and actually used | 
|  | 237 | *			 it in the code! | 
|  | 238 | *			Actually removed aborted stages in idetape_abort_pipeline | 
|  | 239 | *			 instead of just changing the command code. | 
|  | 240 | *			Made the transfer byte count for Request Sense equal to the | 
|  | 241 | *			 actual length of the data transfer. | 
|  | 242 | *			Changed handling of partial data transfers: they do not | 
|  | 243 | *			 cause DMA errors. | 
|  | 244 | *			Moved initiation of DMA transfers to the correct place. | 
|  | 245 | *			Removed reference to unallocated memory. | 
|  | 246 | *			Made __idetape_discard_read_pipeline return the number of | 
|  | 247 | *			 sectors skipped, not the number of stages. | 
|  | 248 | *			Replaced errant kfree() calls with __idetape_kfree_stage(). | 
|  | 249 | *			Fixed off-by-one error in testing the pipeline length. | 
|  | 250 | *			Fixed handling of filemarks in the read pipeline. | 
|  | 251 | *			Small code optimization for MTBSF and MTBSFM ioctls. | 
|  | 252 | *			Don't try to unlock the door during device close if is | 
|  | 253 | *			 already unlocked! | 
|  | 254 | *			Cosmetic fixes to miscellaneous debugging output messages. | 
|  | 255 | *			Set the minimum /proc/ide/hd?/settings values for "pipeline", | 
|  | 256 | *			 "pipeline_min", and "pipeline_max" to 1. | 
|  | 257 | */ |