/* * linux/drivers/ide/ide-tape.c Version 1.19 Nov, 2003 * * Copyright (C) 1995 - 1999 Gadi Oxman * * $Header$ * * This driver was constructed as a student project in the software laboratory * of the faculty of electrical engineering in the Technion - Israel's * Institute Of Technology, with the guide of Avner Lottem and Dr. Ilana David. * * It is hereby placed under the terms of the GNU general public license. * (See linux/COPYING). */ /* * IDE ATAPI streaming tape driver. * * This driver is a part of the Linux ide driver and works in co-operation * with linux/drivers/block/ide.c. * * The driver, in co-operation with ide.c, basically traverses the * request-list for the block device interface. The character device * interface, on the other hand, creates new requests, adds them * to the request-list of the block device, and waits for their completion. * * Pipelined operation mode is now supported on both reads and writes. * * The block device major and minor numbers are determined from the * tape's relative position in the ide interfaces, as explained in ide.c. * * The character device interface consists of the following devices: * * ht0 major 37, minor 0 first IDE tape, rewind on close. * ht1 major 37, minor 1 second IDE tape, rewind on close. * ... * nht0 major 37, minor 128 first IDE tape, no rewind on close. * nht1 major 37, minor 129 second IDE tape, no rewind on close. * ... * * Run linux/scripts/MAKEDEV.ide to create the above entries. * * The general magnetic tape commands compatible interface, as defined by * include/linux/mtio.h, is accessible through the character device. * * General ide driver configuration options, such as the interrupt-unmask * flag, can be configured by issuing an ioctl to the block device interface, * as any other ide device. * * Our own ide-tape ioctl's can be issued to either the block device or * the character device interface. * * Maximal throughput with minimal bus load will usually be achieved in the * following scenario: * * 1. ide-tape is operating in the pipelined operation mode. * 2. No buffering is performed by the user backup program. * * Testing was done with a 2 GB CONNER CTMA 4000 IDE ATAPI Streaming Tape Drive. * * Ver 0.1 Nov 1 95 Pre-working code :-) * Ver 0.2 Nov 23 95 A short backup (few megabytes) and restore procedure * was successful ! (Using tar cvf ... on the block * device interface). * A longer backup resulted in major swapping, bad * overall Linux performance and eventually failed as * we received non serial read-ahead requests from the * buffer cache. * Ver 0.3 Nov 28 95 Long backups are now possible, thanks to the * character device interface. Linux's responsiveness * and performance doesn't seem to be much affected * from the background backup procedure. * Some general mtio.h magnetic tape operations are * now supported by our character device. As a result, * popular tape utilities are starting to work with * ide tapes :-) * The following configurations were tested: * 1. An IDE ATAPI TAPE shares the same interface * and irq with an IDE ATAPI CDROM. * 2. An IDE ATAPI TAPE shares the same interface * and irq with a normal IDE disk. * Both configurations seemed to work just fine ! * However, to be on the safe side, it is meanwhile * recommended to give the IDE TAPE its own interface * and irq. * The one thing which needs to be done here is to * add a "request postpone" feature to ide.c, * so that we won't have to wait for the tape to finish * performing a long media access (DSC) request (such * as a rewind) before we can access the other device * on the same interface. This effect doesn't disturb * normal operation most of the time because read/write * requests are relatively fast, and once we are * performing one tape r/w request, a lot of requests * from the other device can be queued and ide.c will * service all of them after this single tape request. * Ver 1.0 Dec 11 95 Integrated into Linux 1.3.46 development tree. * On each read / write request, we now ask the drive * if we can transfer a constant number of bytes * (a parameter of the drive) only to its buffers, * without causing actual media access. If we can't, * we just wait until we can by polling the DSC bit. * This ensures that while we are not transferring * more bytes than the constant referred to above, the * interrupt latency will not become too high and * we won't cause an interrupt timeout, as happened * occasionally in the previous version. * While polling for DSC, the current request is * postponed and ide.c is free to handle requests from * the other device. This is handled transparently to * ide.c. The hwgroup locking method which was used * in the previous version was removed. * Use of new general features which are provided by * ide.c for use with atapi devices. * (Programming done by Mark Lord) * Few potential bug fixes (Again, suggested by Mark) * Single character device data transfers are now * not limited in size, as they were before. * We are asking the tape about its recommended * transfer unit and send a larger data transfer * as several transfers of the above size. * For best results, use an integral number of this * basic unit (which is shown during driver * initialization). I will soon add an ioctl to get * this important parameter. * Our data transfer buffer is allocated on startup, * rather than before each data transfer. This should * ensure that we will indeed have a data buffer. * Ver 1.1 Dec 14 95 Fixed random problems which occurred when the tape * shared an interface with another device. * (poll_for_dsc was a complete mess). * Removed some old (non-active) code which had * to do with supporting buffer cache originated * requests. * The block device interface can now be opened, so * that general ide driver features like the unmask * interrupts flag can be selected with an ioctl. * This is the only use of the block device interface. * New fast pipelined operation mode (currently only on * writes). When using the pipelined mode, the * throughput can potentially reach the maximum * tape supported throughput, regardless of the * user backup program. On my tape drive, it sometimes * boosted performance by a factor of 2. Pipelined * mode is enabled by default, but since it has a few * downfalls as well, you may want to disable it. * A short explanation of the pipelined operation mode * is available below. * Ver 1.2 Jan 1 96 Eliminated pipelined mode race condition. * Added pipeline read mode. As a result, restores * are now as fast as backups. * Optimized shared interface behavior. The new behavior * typically results in better IDE bus efficiency and * higher tape throughput. * Pre-calculation of the expected read/write request * service time, based on the tape's parameters. In * the pipelined operation mode, this allows us to * adjust our polling frequency to a much lower value, * and thus to dramatically reduce our load on Linux, * without any decrease in performance. * Implemented additional mtio.h operations. * The recommended user block size is returned by * the MTIOCGET ioctl. * Additional minor changes. * Ver 1.3 Feb 9 96 Fixed pipelined read mode bug which prevented the * use of some block sizes during a restore procedure. * The character device interface will now present a * continuous view of the media - any mix of block sizes * during a backup/restore procedure is supported. The * driver will buffer the requests internally and * convert them to the tape's recommended transfer * unit, making performance almost independent of the * chosen user block size. * Some improvements in error recovery. * By cooperating with ide-dma.c, bus mastering DMA can * now sometimes be used with IDE tape drives as well. * Bus mastering DMA has the potential to dramatically * reduce the CPU's overhead when accessing the device, * and can be enabled by using hdparm -d1 on the tape's * block device interface. For more info, read the * comments in ide-dma.c. * Ver 1.4 Mar 13 96 Fixed serialize support. * Ver 1.5 Apr 12 96 Fixed shared interface operation, broken in 1.3.85. * Fixed pipelined read mode inefficiency. * Fixed nasty null dereferencing bug. * Ver 1.6 Aug 16 96 Fixed FPU usage in the driver. * Fixed end of media bug. * Ver 1.7 Sep 10 96 Minor changes for the CONNER CTT8000-A model. * Ver 1.8 Sep 26 96 Attempt to find a better balance between good * interactive response and high system throughput. * Ver 1.9 Nov 5 96 Automatically cross encountered filemarks rather * than requiring an explicit FSF command. * Abort pending requests at end of media. * MTTELL was sometimes returning incorrect results. * Return the real block size in the MTIOCGET ioctl. * Some error recovery bug fixes. * Ver 1.10 Nov 5 96 Major reorganization. * Reduced CPU overhead a bit by eliminating internal * bounce buffers. * Added module support. * Added multiple tape drives support. * Added partition support. * Rewrote DSC handling. * Some portability fixes. * Removed ide-tape.h. * Additional minor changes. * Ver 1.11 Dec 2 96 Bug fix in previous DSC timeout handling. * Use ide_stall_queue() for DSC overlap. * Use the maximum speed rather than the current speed * to compute the request service time. * Ver 1.12 Dec 7 97 Fix random memory overwriting and/or last block data * corruption, which could occur if the total number * of bytes written to the tape was not an integral * number of tape blocks. * Add support for INTERRUPT DRQ devices. * Ver 1.13 Jan 2 98 Add "speed == 0" work-around for HP COLORADO 5GB * Ver 1.14 Dec 30 98 Partial fixes for the Sony/AIWA tape drives. * Replace cli()/sti() with hwgroup spinlocks. * Ver 1.15 Mar 25 99 Fix SMP race condition by replacing hwgroup * spinlock with private per-tape spinlock. * Ver 1.16 Sep 1 99 Add OnStream tape support. * Abort read pipeline on EOD. * Wait for the tape to become ready in case it returns * "in the process of becoming ready" on open(). * Fix zero padding of the last written block in * case the tape block size is larger than PAGE_SIZE. * Decrease the default disconnection time to tn. * Ver 1.16e Oct 3 99 Minor fixes. * Ver 1.16e1 Oct 13 99 Patches by Arnold Niessen, * niessen@iae.nl / arnold.niessen@philips.com * GO-1) Undefined code in idetape_read_position * according to Gadi's email * AJN-1) Minor fix asc == 11 should be asc == 0x11 * in idetape_issue_packet_command (did effect * debugging output only) * AJN-2) Added more debugging output, and * added ide-tape: where missing. I would also * like to add tape->name where possible * AJN-3) Added different debug_level's * via /proc/ide/hdc/settings * "debug_level" determines amount of debugging output; * can be changed using /proc/ide/hdx/settings * 0 : almost no debugging output * 1 : 0+output errors only * 2 : 1+output all sensekey/asc * 3 : 2+follow all chrdev related procedures * 4 : 3+follow all procedures * 5 : 4+include pc_stack rq_stack info * 6 : 5+USE_COUNT updates * AJN-4) Fixed timeout for retension in idetape_queue_pc_tail * from 5 to 10 minutes * AJN-5) Changed maximum number of blocks to skip when * reading tapes with multiple consecutive write * errors from 100 to 1000 in idetape_get_logical_blk * Proposed changes to code: * 1) output "logical_blk_num" via /proc * 2) output "current_operation" via /proc * 3) Either solve or document the fact that `mt rewind' is * required after reading from /dev/nhtx to be * able to rmmod the idetape module; * Also, sometimes an application finishes but the * device remains `busy' for some time. Same cause ? * Proposed changes to release-notes: * 4) write a simple `quickstart' section in the * release notes; I volunteer if you don't want to * 5) include a pointer to video4linux in the doc * to stimulate video applications * 6) release notes lines 331 and 362: explain what happens * if the application data rate is higher than 1100 KB/s; * similar approach to lower-than-500 kB/s ? * 7) 6.6 Comparison; wouldn't it be better to allow different * strategies for read and write ? * Wouldn't it be better to control the tape buffer * contents instead of the bandwidth ? * 8) line 536: replace will by would (if I understand * this section correctly, a hypothetical and unwanted situation * is being described) * Ver 1.16f Dec 15 99 Change place of the secondary OnStream header frames. * Ver 1.17 Nov 2000 / Jan 2001 Marcel Mol, marcel@mesa.nl * - Add idetape_onstream_mode_sense_tape_parameter_page * function to get tape capacity in frames: tape->capacity. * - Add support for DI-50 drives( or any DI- drive). * - 'workaround' for read error/blank block around block 3000. * - Implement Early warning for end of media for Onstream. * - Cosmetic code changes for readability. * - Idetape_position_tape should not use SKIP bit during * Onstream read recovery. * - Add capacity, logical_blk_num and first/last_frame_position * to /proc/ide/hd?/settings. * - Module use count was gone in the Linux 2.4 driver. * Ver 1.17a Apr 2001 Willem Riede osst@riede.org * - Get drive's actual block size from mode sense block descriptor * - Limit size of pipeline * Ver 1.17b Oct 2002 Alan Stern * Changed IDETAPE_MIN_PIPELINE_STAGES to 1 and actually used * it in the code! * Actually removed aborted stages in idetape_abort_pipeline * instead of just changing the command code. * Made the transfer byte count for Request Sense equal to the * actual length of the data transfer. * Changed handling of partial data transfers: they do not * cause DMA errors. * Moved initiation of DMA transfers to the correct place. * Removed reference to unallocated memory. * Made __idetape_discard_read_pipeline return the number of * sectors skipped, not the number of stages. * Replaced errant kfree() calls with __idetape_kfree_stage(). * Fixed off-by-one error in testing the pipeline length. * Fixed handling of filemarks in the read pipeline. * Small code optimization for MTBSF and MTBSFM ioctls. * Don't try to unlock the door during device close if is * already unlocked! * Cosmetic fixes to miscellaneous debugging output messages. * Set the minimum /proc/ide/hd?/settings values for "pipeline", * "pipeline_min", and "pipeline_max" to 1. * * Here are some words from the first releases of hd.c, which are quoted * in ide.c and apply here as well: * * | Special care is recommended. Have Fun! * */ /* * An overview of the pipelined operation mode. * * In the pipelined write mode, we will usually just add requests to our * pipeline and return immediately, before we even start to service them. The * user program will then have enough time to prepare the next request while * we are still busy servicing previous requests. In the pipelined read mode, * the situation is similar - we add read-ahead requests into the pipeline, * before the user even requested them. * * The pipeline can be viewed as a "safety net" which will be activated when * the system load is high and prevents the user backup program from keeping up * with the current tape speed. At this point, the pipeline will get * shorter and shorter but the tape will still be streaming at the same speed. * Assuming we have enough pipeline stages, the system load will hopefully * decrease before the pipeline is completely empty, and the backup program * will be able to "catch up" and refill the pipeline again. * * When using the pipelined mode, it would be best to disable any type of * buffering done by the user program, as ide-tape already provides all the * benefits in the kernel, where it can be done in a more efficient way. * As we will usually not block the user program on a request, the most * efficient user code will then be a simple read-write-read-... cycle. * Any additional logic will usually just slow down the backup process. * * Using the pipelined mode, I get a constant over 400 KBps throughput, * which seems to be the maximum throughput supported by my tape. * * However, there are some downfalls: * * 1. We use memory (for data buffers) in proportional to the number * of pipeline stages (each stage is about 26 KB with my tape). * 2. In the pipelined write mode, we cheat and postpone error codes * to the user task. In read mode, the actual tape position * will be a bit further than the last requested block. * * Concerning (1): * * 1. We allocate stages dynamically only when we need them. When * we don't need them, we don't consume additional memory. In * case we can't allocate stages, we just manage without them * (at the expense of decreased throughput) so when Linux is * tight in memory, we will not pose additional difficulties. * * 2. The maximum number of stages (which is, in fact, the maximum * amount of memory) which we allocate is limited by the compile * time parameter IDETAPE_MAX_PIPELINE_STAGES. * * 3. The maximum number of stages is a controlled parameter - We * don't start from the user defined maximum number of stages * but from the lower IDETAPE_MIN_PIPELINE_STAGES (again, we * will not even allocate this amount of stages if the user * program can't handle the speed). We then implement a feedback * loop which checks if the pipeline is empty, and if it is, we * increase the maximum number of stages as necessary until we * reach the optimum value which just manages to keep the tape * busy with minimum allocated memory or until we reach * IDETAPE_MAX_PIPELINE_STAGES. * * Concerning (2): * * In pipelined write mode, ide-tape can not return accurate error codes * to the user program since we usually just add the request to the * pipeline without waiting for it to be serviced. In case an error * occurs, I will report it on the next user request. * * In the pipelined read mode, subsequent read requests or forward * filemark spacing will perform correctly, as we preserve all blocks * and filemarks which we encountered during our excess read-ahead. * * For accurate tape positioning and error reporting, disabling * pipelined mode might be the best option. * * You can enable/disable/tune the pipelined operation mode by adjusting * the compile time parameters below. */ /* * Possible improvements. * * 1. Support for the ATAPI overlap protocol. * * In order to maximize bus throughput, we currently use the DSC * overlap method which enables ide.c to service requests from the * other device while the tape is busy executing a command. The * DSC overlap method involves polling the tape's status register * for the DSC bit, and servicing the other device while the tape * isn't ready. * * In the current QIC development standard (December 1995), * it is recommended that new tape drives will *in addition* * implement the ATAPI overlap protocol, which is used for the * same purpose - efficient use of the IDE bus, but is interrupt * driven and thus has much less CPU overhead. * * ATAPI overlap is likely to be supported in most new ATAPI * devices, including new ATAPI cdroms, and thus provides us * a method by which we can achieve higher throughput when * sharing a (fast) ATA-2 disk with any (slow) new ATAPI device. */ #define IDETAPE_VERSION "1.19" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* * partition */ typedef struct os_partition_s { __u8 partition_num; __u8 par_desc_ver; __u16 wrt_pass_cntr; __u32 first_frame_addr; __u32 last_frame_addr; __u32 eod_frame_addr; } os_partition_t; /* * DAT entry */ typedef struct os_dat_entry_s { __u32 blk_sz; __u16 blk_cnt; __u8 flags; __u8 reserved; } os_dat_entry_t; /* * DAT */ #define OS_DAT_FLAGS_DATA (0xc) #define OS_DAT_FLAGS_MARK (0x1) typedef struct os_dat_s { __u8 dat_sz; __u8 reserved1; __u8 entry_cnt; __u8 reserved3; os_dat_entry_t dat_list[16]; } os_dat_t; #include /**************************** Tunable parameters *****************************/ /* * Pipelined mode parameters. * * We try to use the minimum number of stages which is enough to * keep the tape constantly streaming. To accomplish that, we implement * a feedback loop around the maximum number of stages: * * We start from MIN maximum stages (we will not even use MIN stages * if we don't need them), increment it by RATE*(MAX-MIN) * whenever we sense that the pipeline is empty, until we reach * the optimum value or until we reach MAX. * * Setting the following parameter to 0 is illegal: the pipelined mode * cannot be disabled (calculate_speeds() divides by tape->max_stages.) */ #define IDETAPE_MIN_PIPELINE_STAGES 1 #define IDETAPE_MAX_PIPELINE_STAGES 400 #define IDETAPE_INCREASE_STAGES_RATE 20 /* * The following are used to debug the driver: * * Setting IDETAPE_DEBUG_INFO to 1 will report device capabilities. * Setting IDETAPE_DEBUG_LOG to 1 will log driver flow control. * Setting IDETAPE_DEBUG_BUGS to 1 will enable self-sanity checks in * some places. * * Setting them to 0 will restore normal operation mode: * * 1. Disable logging normal successful operations. * 2. Disable self-sanity checks. * 3. Errors will still be logged, of course. * * All the #if DEBUG code will be removed some day, when the driver * is verified to be stable enough. This will make it much more * esthetic. */ #define IDETAPE_DEBUG_INFO 0 #define IDETAPE_DEBUG_LOG 0 #define IDETAPE_DEBUG_BUGS 1 /* * After each failed packet command we issue a request sense command * and retry the packet command IDETAPE_MAX_PC_RETRIES times. * * Setting IDETAPE_MAX_PC_RETRIES to 0 will disable retries. */ #define IDETAPE_MAX_PC_RETRIES 3 /* * With each packet command, we allocate a buffer of * IDETAPE_PC_BUFFER_SIZE bytes. This is used for several packet * commands (Not for READ/WRITE commands). */ #define IDETAPE_PC_BUFFER_SIZE 256 /* * In various places in the driver, we need to allocate storage * for packet commands and requests, which will remain valid while * we leave the driver to wait for an interrupt or a timeout event. */ #define IDETAPE_PC_STACK (10 + IDETAPE_MAX_PC_RETRIES) /* * Some drives (for example, Seagate STT3401A Travan) require a very long * timeout, because they don't return an interrupt or clear their busy bit * until after the command completes (even retension commands). */ #define IDETAPE_WAIT_CMD (900*HZ) /* * The following parameter is used to select the point in the internal * tape fifo in which we will start to refill the buffer. Decreasing * the following parameter will improve the system's latency and * interactive response, while using a high value might improve sytem * throughput. */ #define IDETAPE_FIFO_THRESHOLD 2 /* * DSC polling parameters. * * Polling for DSC (a single bit in the status register) is a very * important function in ide-tape. There are two cases in which we * poll for DSC: * * 1. Before a read/write packet command, to ensure that we * can transfer data from/to the tape's data buffers, without * causing an actual media access. In case the tape is not * ready yet, we take out our request from the device * request queue, so that ide.c will service requests from * the other device on the same interface meanwhile. * * 2. After the successful initialization of a "media access * packet command", which is a command which can take a long * time to complete (it can be several seconds or even an hour). * * Again, we postpone our request in the middle to free the bus * for the other device. The polling frequency here should be * lower than the read/write frequency since those media access * commands are slow. We start from a "fast" frequency - * IDETAPE_DSC_MA_FAST (one second), and if we don't receive DSC * after IDETAPE_DSC_MA_THRESHOLD (5 minutes), we switch it to a * lower frequency - IDETAPE_DSC_MA_SLOW (1 minute). * * We also set a timeout for the timer, in case something goes wrong. * The timeout should be longer then the maximum execution time of a * tape operation. */ /* * DSC timings. */ #define IDETAPE_DSC_RW_MIN 5*HZ/100 /* 50 msec */ #define IDETAPE_DSC_RW_MAX 40*HZ/100 /* 400 msec */ #define IDETAPE_DSC_RW_TIMEOUT 2*60*HZ /* 2 minutes */ #define IDETAPE_DSC_MA_FAST 2*HZ /* 2 seconds */ #define IDETAPE_DSC_MA_THRESHOLD 5*60*HZ /* 5 minutes */ #define IDETAPE_DSC_MA_SLOW 30*HZ /* 30 seconds */ #define IDETAPE_DSC_MA_TIMEOUT 2*60*60*HZ /* 2 hours */ /*************************** End of tunable parameters ***********************/ /* * Debugging/Performance analysis * * I/O trace support */ #define USE_IOTRACE 0 #if USE_IOTRACE #include #define IO_IDETAPE_FIFO 500 #endif /* * Read/Write error simulation */ #define SIMULATE_ERRORS 0 /* * For general magnetic tape device compatibility. */ typedef enum { idetape_direction_none, idetape_direction_read, idetape_direction_write } idetape_chrdev_direction_t; struct idetape_bh { unsigned short b_size; atomic_t b_count; struct idetape_bh *b_reqnext; char *b_data; }; /* * Our view of a packet command. */ typedef struct idetape_packet_command_s { u8 c[12]; /* Actual packet bytes */ int retries; /* On each retry, we increment retries */ int error; /* Error code */ int request_transfer; /* Bytes to transfer */ int actually_transferred; /* Bytes actually transferred */ int buffer_size; /* Size of our data buffer */ struct idetape_bh *bh; char *b_data; int b_count; u8 *buffer; /* Data buffer */ u8 *current_position; /* Pointer into the above buffer */ ide_startstop_t (*callback) (ide_drive_t *); /* Called when this packet command is completed */ u8 pc_buffer[IDETAPE_PC_BUFFER_SIZE]; /* Temporary buffer */ unsigned long flags; /* Status/Action bit flags: long for set_bit */ } idetape_pc_t; /* * Packet command flag bits. */ /* Set when an error is considered normal - We won't retry */ #define PC_ABORT 0 /* 1 When polling for DSC on a media access command */ #define PC_WAIT_FOR_DSC 1 /* 1 when we prefer to use DMA if possible */ #define PC_DMA_RECOMMENDED 2 /* 1 while DMA in progress */ #define PC_DMA_IN_PROGRESS 3 /* 1 when encountered problem during DMA */ #define PC_DMA_ERROR 4 /* Data direction */ #define PC_WRITING 5 /* * Capabilities and Mechanical Status Page */ typedef struct { unsigned page_code :6; /* Page code - Should be 0x2a */ __u8 reserved0_6 :1; __u8 ps :1; /* parameters saveable */ __u8 page_length; /* Page Length - Should be 0x12 */ __u8 reserved2, reserved3; unsigned ro :1; /* Read Only Mode */ unsigned reserved4_1234 :4; unsigned sprev :1; /* Supports SPACE in the reverse direction */ unsigned reserved4_67 :2; unsigned reserved5_012 :3; unsigned efmt :1; /* Supports ERASE command initiated formatting */ unsigned reserved5_4 :1; unsigned qfa :1; /* Supports the QFA two partition formats */ unsigned reserved5_67 :2; unsigned lock :1; /* Supports locking the volume */ unsigned locked :1; /* The volume is locked */ unsigned prevent :1; /* The device defaults in the prevent state after power up */ unsigned eject :1; /* The device can eject the volume */ __u8 disconnect :1; /* The device can break request > ctl */ __u8 reserved6_5 :1; unsigned ecc :1; /* Supports error correction */ unsigned cmprs :1; /* Supports data compression */ unsigned reserved7_0 :1; unsigned blk512 :1; /* Supports 512 bytes block size */ unsigned blk1024 :1; /* Supports 1024 bytes block size */ unsigned reserved7_3_6 :4; unsigned blk32768 :1; /* slowb - the device restricts the byte count for PIO */ /* transfers for slow buffer memory ??? */ /* Also 32768 block size in some cases */ __u16 max_speed; /* Maximum speed supported in KBps */ __u8 reserved10, reserved11; __u16 ctl; /* Continuous Transfer Limit in blocks */ __u16 speed; /* Current Speed, in KBps */ __u16 buffer_size; /* Buffer Size, in 512 bytes */ __u8 reserved18, reserved19; } idetape_capabilities_page_t; /* * Block Size Page */ typedef struct { unsigned page_code :6; /* Page code - Should be 0x30 */ unsigned reserved1_6 :1; unsigned ps :1; __u8 page_length; /* Page Length - Should be 2 */ __u8 reserved2; unsigned play32 :1; unsigned play32_5 :1; unsigned reserved2_23 :2; unsigned record32 :1; unsigned record32_5 :1; unsigned reserved2_6 :1; unsigned one :1; } idetape_block_size_page_t; /* * A pipeline stage. */ typedef struct idetape_stage_s { struct request rq; /* The corresponding request */ struct idetape_bh *bh; /* The data buffers */ struct idetape_stage_s *next; /* Pointer to the next stage */ } idetape_stage_t; /* * REQUEST SENSE packet command result - Data Format. */ typedef struct { unsigned error_code :7; /* Current of deferred errors */ unsigned valid :1; /* The information field conforms to QIC-157C */ __u8 reserved1 :8; /* Segment Number - Reserved */ unsigned sense_key :4; /* Sense Key */ unsigned reserved2_4 :1; /* Reserved */ unsigned ili :1; /* Incorrect Length Indicator */ unsigned eom :1; /* End Of Medium */ unsigned filemark :1; /* Filemark */ __u32 information __attribute__ ((packed)); __u8 asl; /* Additional sense length (n-7) */ __u32 command_specific; /* Additional command specific information */ __u8 asc; /* Additional Sense Code */ __u8 ascq; /* Additional Sense Code Qualifier */ __u8 replaceable_unit_code; /* Field Replaceable Unit Code */ unsigned sk_specific1 :7; /* Sense Key Specific */ unsigned sksv :1; /* Sense Key Specific information is valid */ __u8 sk_specific2; /* Sense Key Specific */ __u8 sk_specific3; /* Sense Key Specific */ __u8 pad[2]; /* Padding to 20 bytes */ } idetape_request_sense_result_t; /* * Most of our global data which we need to save even as we leave the * driver due to an interrupt or a timer event is stored in a variable * of type idetape_tape_t, defined below. */ typedef struct ide_tape_obj { ide_drive_t *drive; ide_driver_t *driver; struct gendisk *disk; struct kref kref; /* * Since a typical character device operation requires more * than one packet command, we provide here enough memory * for the maximum of interconnected packet commands. * The packet commands are stored in the circular array pc_stack. * pc_stack_index points to the last used entry, and warps around * to the start when we get to the last array entry. * * pc points to the current processed packet command. * * failed_pc points to the last failed packet command, or contains * NULL if we do not need to retry any packet command. This is * required since an additional packet command is needed before the * retry, to get detailed information on what went wrong. */ /* Current packet command */ idetape_pc_t *pc; /* Last failed packet command */ idetape_pc_t *failed_pc; /* Packet command stack */ idetape_pc_t pc_stack[IDETAPE_PC_STACK]; /* Next free packet command storage space */ int pc_stack_index; struct request rq_stack[IDETAPE_PC_STACK]; /* We implement a circular array */ int rq_stack_index; /* * DSC polling variables. * * While polling for DSC we use postponed_rq to postpone the * current request so that ide.c will be able to service * pending requests on the other device. Note that at most * we will have only one DSC (usually data transfer) request * in the device request queue. Additional requests can be * queued in our internal pipeline, but they will be visible * to ide.c only one at a time. */ struct request *postponed_rq; /* The time in which we started polling for DSC */ unsigned long dsc_polling_start; /* Timer used to poll for dsc */ struct timer_list dsc_timer; /* Read/Write dsc polling frequency */ unsigned long best_dsc_rw_frequency; /* The current polling frequency */ unsigned long dsc_polling_frequency; /* Maximum waiting time */ unsigned long dsc_timeout; /* * Read position information */ u8 partition; /* Current block */ unsigned int first_frame_position; unsigned int last_frame_position; unsigned int blocks_in_buffer; /* * Last error information */ u8 sense_key, asc, ascq; /* * Character device operation */ unsigned int minor; /* device name */ char name[4]; /* Current character device data transfer direction */ idetape_chrdev_direction_t chrdev_direction; /* * Device information */ /* Usually 512 or 1024 bytes */ unsigned short tape_block_size; int user_bs_factor; /* Copy of the tape's Capabilities and Mechanical Page */ idetape_capabilities_page_t capabilities; /* * Active data transfer request parameters. * * At most, there is only one ide-tape originated data transfer * request in the device request queue. This allows ide.c to * easily service requests from the other device when we * postpone our active request. In the pipelined operation * mode, we use our internal pipeline structure to hold * more data requests. * * The data buffer size is chosen based on the tape's * recommendation. */ /* Pointer to the request which is waiting in the device request queue */ struct request *active_data_request; /* Data buffer size (chosen based on the tape's recommendation */ int stage_size; idetape_stage_t *merge_stage; int merge_stage_size; struct idetape_bh *bh; char *b_data; int b_count; /* * Pipeline parameters. * * To accomplish non-pipelined mode, we simply set the following * variables to zero (or NULL, where appropriate). */ /* Number of currently used stages */ int nr_stages; /* Number of pending stages */ int nr_pending_stages; /* We will not allocate more than this number of stages */ int max_stages, min_pipeline, max_pipeline; /* The first stage which will be removed from the pipeline */ idetape_stage_t *first_stage; /* The currently active stage */ idetape_stage_t *active_stage; /* Will be serviced after the currently active request */ idetape_stage_t *next_stage; /* New requests will be added to the pipeline here */ idetape_stage_t *last_stage; /* Optional free stage which we can use */ idetape_stage_t *cache_stage; int pages_per_stage; /* Wasted space in each stage */ int excess_bh_size; /* Status/Action flags: long for set_bit */ unsigned long flags; /* protects the ide-tape queue */ spinlock_t spinlock; /* * Measures average tape speed */ unsigned long avg_time; int avg_size; int avg_speed; /* last sense information */ idetape_request_sense_result_t sense; char vendor_id[10]; char product_id[18]; char firmware_revision[6]; int firmware_revision_num; /* the door is currently locked */ int door_locked; /* the tape hardware is write protected */ char drv_write_prot; /* the tape is write protected (hardware or opened as read-only) */ char write_prot; /* * Limit the number of times a request can * be postponed, to avoid an infinite postpone * deadlock. */ /* request postpone count limit */ int postpone_cnt; /* * Measures number of frames: * * 1. written/read to/from the driver pipeline (pipeline_head). * 2. written/read to/from the tape buffers (idetape_bh). * 3. written/read by the tape to/from the media (tape_head). */ int pipeline_head; int buffer_head; int tape_head; int last_tape_head; /* * Speed control at the tape buffers input/output */ unsigned long insert_time; int insert_size; int insert_speed; int max_insert_speed; int measure_insert_time; /* * Measure tape still time, in milliseconds */ unsigned long tape_still_time_begin; int tape_still_time; /* * Speed regulation negative feedback loop */ int speed_control; int pipeline_head_speed; int controlled_pipeline_head_speed; int uncontrolled_pipeline_head_speed; int controlled_last_pipeline_head; int uncontrolled_last_pipeline_head; unsigned long uncontrolled_pipeline_head_time; unsigned long controlled_pipeline_head_time; int controlled_previous_pipeline_head; int uncontrolled_previous_pipeline_head; unsigned long controlled_previous_head_time; unsigned long uncontrolled_previous_head_time; int restart_speed_control_req; /* * Debug_level determines amount of debugging output; * can be changed using /proc/ide/hdx/settings * 0 : almost no debugging output * 1 : 0+output errors only * 2 : 1+output all sensekey/asc * 3 : 2+follow all chrdev related procedures * 4 : 3+follow all procedures * 5 : 4+include pc_stack rq_stack info * 6 : 5+USE_COUNT updates */ int debug_level; } idetape_tape_t; static DEFINE_MUTEX(idetape_ref_mutex); static struct class *idetape_sysfs_class; #define to_ide_tape(obj) container_of(obj, struct ide_tape_obj, kref) #define ide_tape_g(disk) \ container_of((disk)->private_data, struct ide_tape_obj, driver) static struct ide_tape_obj *ide_tape_get(struct gendisk *disk) { struct ide_tape_obj *tape = NULL; mutex_lock(&idetape_ref_mutex); tape = ide_tape_g(disk); if (tape) kref_get(&tape->kref); mutex_unlock(&idetape_ref_mutex); return tape; } static void ide_tape_release(struct kref *); static void ide_tape_put(struct ide_tape_obj *tape) { mutex_lock(&idetape_ref_mutex); kref_put(&tape->kref, ide_tape_release); mutex_unlock(&idetape_ref_mutex); } /* * Tape door status */ #define DOOR_UNLOCKED 0 #define DOOR_LOCKED 1 #define DOOR_EXPLICITLY_LOCKED 2 /* * Tape flag bits values. */ #define IDETAPE_IGNORE_DSC 0 #define IDETAPE_ADDRESS_VALID 1 /* 0 When the tape position is unknown */ #define IDETAPE_BUSY 2 /* Device already opened */ #define IDETAPE_PIPELINE_ERROR 3 /* Error detected in a pipeline stage */ #define IDETAPE_DETECT_BS 4 /* Attempt to auto-detect the current user block size */ #define IDETAPE_FILEMARK 5 /* Currently on a filemark */ #define IDETAPE_DRQ_INTERRUPT 6 /* DRQ interrupt device */ #define IDETAPE_READ_ERROR 7 #define IDETAPE_PIPELINE_ACTIVE 8 /* pipeline active */ /* 0 = no tape is loaded, so we don't rewind after ejecting */ #define IDETAPE_MEDIUM_PRESENT 9 /* * Supported ATAPI tape drives packet commands */ #define IDETAPE_TEST_UNIT_READY_CMD 0x00 #define IDETAPE_REWIND_CMD 0x01 #define IDETAPE_REQUEST_SENSE_CMD 0x03 #define IDETAPE_READ_CMD 0x08 #define IDETAPE_WRITE_CMD 0x0a #define IDETAPE_WRITE_FILEMARK_CMD 0x10 #define IDETAPE_SPACE_CMD 0x11 #define IDETAPE_INQUIRY_CMD 0x12 #define IDETAPE_ERASE_CMD 0x19 #define IDETAPE_MODE_SENSE_CMD 0x1a #define IDETAPE_MODE_SELECT_CMD 0x15 #define IDETAPE_LOAD_UNLOAD_CMD 0x1b #define IDETAPE_PREVENT_CMD 0x1e #define IDETAPE_LOCATE_CMD 0x2b #define IDETAPE_READ_POSITION_CMD 0x34 #define IDETAPE_READ_BUFFER_CMD 0x3c #define IDETAPE_SET_SPEED_CMD 0xbb /* * Some defines for the READ BUFFER command */ #define IDETAPE_RETRIEVE_FAULTY_BLOCK 6 /* * Some defines for the SPACE command */ #define IDETAPE_SPACE_OVER_FILEMARK 1 #define IDETAPE_SPACE_TO_EOD 3 /* * Some defines for the LOAD UNLOAD command */ #define IDETAPE_LU_LOAD_MASK 1 #define IDETAPE_LU_RETENSION_MASK 2 #define IDETAPE_LU_EOT_MASK 4 /* * Special requests for our block device strategy routine. * * In order to service a character device command, we add special * requests to the tail of our block device request queue and wait * for their completion. */ enum { REQ_IDETAPE_PC1 = (1 << 0), /* packet command (first stage) */ REQ_IDETAPE_PC2 = (1 << 1), /* packet command (second stage) */ REQ_IDETAPE_READ = (1 << 2), REQ_IDETAPE_WRITE = (1 << 3), REQ_IDETAPE_READ_BUFFER = (1 << 4), }; /* * Error codes which are returned in rq->errors to the higher part * of the driver. */ #define IDETAPE_ERROR_GENERAL 101 #define IDETAPE_ERROR_FILEMARK 102 #define IDETAPE_ERROR_EOD 103 /* * The following is used to format the general configuration word of * the ATAPI IDENTIFY DEVICE command. */ struct idetape_id_gcw { unsigned packet_size :2; /* Packet Size */ unsigned reserved234 :3; /* Reserved */ unsigned drq_type :2; /* Command packet DRQ type */ unsigned removable :1; /* Removable media */ unsigned device_type :5; /* Device type */ unsigned reserved13 :1; /* Reserved */ unsigned protocol :2; /* Protocol type */ }; /* * INQUIRY packet command - Data Format (From Table 6-8 of QIC-157C) */ typedef struct { unsigned device_type :5; /* Peripheral Device Type */ unsigned reserved0_765 :3; /* Peripheral Qualifier - Reserved */ unsigned reserved1_6t0 :7; /* Reserved */ unsigned rmb :1; /* Removable Medium Bit */ unsigned ansi_version :3; /* ANSI Version */ unsigned ecma_version :3; /* ECMA Version */ unsigned iso_version :2; /* ISO Version */ unsigned response_format :4; /* Response Data Format */ unsigned reserved3_45 :2; /* Reserved */ unsigned reserved3_6 :1; /* TrmIOP - Reserved */ unsigned reserved3_7 :1; /* AENC - Reserved */ __u8 additional_length; /* Additional Length (total_length-4) */ __u8 rsv5, rsv6, rsv7; /* Reserved */ __u8 vendor_id[8]; /* Vendor Identification */ __u8 product_id[16]; /* Product Identification */ __u8 revision_level[4]; /* Revision Level */ __u8 vendor_specific[20]; /* Vendor Specific - Optional */ __u8 reserved56t95[40]; /* Reserved - Optional */ /* Additional information may be returned */ } idetape_inquiry_result_t; /* * READ POSITION packet command - Data Format (From Table 6-57) */ typedef struct { unsigned reserved0_10 :2; /* Reserved */ unsigned bpu :1; /* Block Position Unknown */ unsigned reserved0_543 :3; /* Reserved */ unsigned eop :1; /* End Of Partition */ unsigned bop :1; /* Beginning Of Partition */ u8 partition; /* Partition Number */ u8 reserved2, reserved3; /* Reserved */ u32 first_block; /* First Block Location */ u32 last_block; /* Last Block Location (Optional) */ u8 reserved12; /* Reserved */ u8 blocks_in_buffer[3]; /* Blocks In Buffer - (Optional) */ u32 bytes_in_buffer; /* Bytes In Buffer (Optional) */ } idetape_read_position_result_t; /* * Follows structures which are related to the SELECT SENSE / MODE SENSE * packet commands. Those packet commands are still not supported * by ide-tape. */ #define IDETAPE_BLOCK_DESCRIPTOR 0 #define IDETAPE_CAPABILITIES_PAGE 0x2a #define IDETAPE_PARAMTR_PAGE 0x2b /* Onstream DI-x0 only */ #define IDETAPE_BLOCK_SIZE_PAGE 0x30 #define IDETAPE_BUFFER_FILLING_PAGE 0x33 /* * Mode Parameter Header for the MODE SENSE packet command */ typedef struct { __u8 mode_data_length; /* Length of the following data transfer */ __u8 medium_type; /* Medium Type */ __u8 dsp; /* Device Specific Parameter */ __u8 bdl; /* Block Descriptor Length */ #if 0 /* data transfer page */ __u8 page_code :6; __u8 reserved0_6 :1; __u8 ps :1; /* parameters saveable */ __u8 page_length; /* page Length == 0x02 */ __u8 reserved2; __u8 read32k :1; /* 32k blk size (data only) */ __u8 read32k5 :1; /* 32.5k blk size (data&AUX) */ __u8 reserved3_23 :2; __u8 write32k :1; /* 32k blk size (data only) */ __u8 write32k5 :1; /* 32.5k blk size (data&AUX) */ __u8 reserved3_6 :1; __u8 streaming :1; /* streaming mode enable */ #endif } idetape_mode_parameter_header_t; /* * Mode Parameter Block Descriptor the MODE SENSE packet command * * Support for block descriptors is optional. */ typedef struct { __u8 density_code; /* Medium density code */ __u8 blocks[3]; /* Number of blocks */ __u8 reserved4; /* Reserved */ __u8 length[3]; /* Block Length */ } idetape_parameter_block_descriptor_t; /* * The Data Compression Page, as returned by the MODE SENSE packet command. */ typedef struct { unsigned page_code :6; /* Page Code - Should be 0xf */ unsigned reserved0 :1; /* Reserved */ unsigned ps :1; __u8 page_length; /* Page Length - Should be 14 */ unsigned reserved2 :6; /* Reserved */ unsigned dcc :1; /* Data Compression Capable */ unsigned dce :1; /* Data Compression Enable */ unsigned reserved3 :5; /* Reserved */ unsigned red :2; /* Report Exception on Decompression */ unsigned dde :1; /* Data Decompression Enable */ __u32 ca; /* Compression Algorithm */ __u32 da; /* Decompression Algorithm */ __u8 reserved[4]; /* Reserved */ } idetape_data_compression_page_t; /* * The Medium Partition Page, as returned by the MODE SENSE packet command. */ typedef struct { unsigned page_code :6; /* Page Code - Should be 0x11 */ unsigned reserved1_6 :1; /* Reserved */ unsigned ps :1; __u8 page_length; /* Page Length - Should be 6 */ __u8 map; /* Maximum Additional Partitions - Should be 0 */ __u8 apd; /* Additional Partitions Defined - Should be 0 */ unsigned reserved4_012 :3; /* Reserved */ unsigned psum :2; /* Should be 0 */ unsigned idp :1; /* Should be 0 */ unsigned sdp :1; /* Should be 0 */ unsigned fdp :1; /* Fixed Data Partitions */ __u8 mfr; /* Medium Format Recognition */ __u8 reserved[2]; /* Reserved */ } idetape_medium_partition_page_t; /* * Run time configurable parameters. */ typedef struct { int dsc_rw_frequency; int dsc_media_access_frequency; int nr_stages; } idetape_config_t; /* * The variables below are used for the character device interface. * Additional state variables are defined in our ide_drive_t structure. */ static struct ide_tape_obj * idetape_devs[MAX_HWIFS * MAX_DRIVES]; #define ide_tape_f(file) ((file)->private_data) static struct ide_tape_obj *ide_tape_chrdev_get(unsigned int i) { struct ide_tape_obj *tape = NULL; mutex_lock(&idetape_ref_mutex); tape = idetape_devs[i]; if (tape) kref_get(&tape->kref); mutex_unlock(&idetape_ref_mutex); return tape; } /* * Function declarations * */ static int idetape_chrdev_release (struct inode *inode, struct file *filp); static void idetape_write_release (ide_drive_t *drive, unsigned int minor); /* * Too bad. The drive wants to send us data which we are not ready to accept. * Just throw it away. */ static void idetape_discard_data (ide_drive_t *drive, unsigned int bcount) { while (bcount--) (void) HWIF(drive)->INB(IDE_DATA_REG); } static void idetape_input_buffers (ide_drive_t *drive, idetape_pc_t *pc, unsigned int bcount) { struct idetape_bh *bh = pc->bh; int count; while (bcount) { #if IDETAPE_DEBUG_BUGS if (bh == NULL) { printk(KERN_ERR "ide-tape: bh == NULL in " "idetape_input_buffers\n"); idetape_discard_data(drive, bcount); return; } #endif /* IDETAPE_DEBUG_BUGS */ count = min((unsigned int)(bh->b_size - atomic_read(&bh->b_count)), bcount); HWIF(drive)->atapi_input_bytes(drive, bh->b_data + atomic_read(&bh->b_count), count); bcount -= count; atomic_add(count, &bh->b_count); if (atomic_read(&bh->b_count) == bh->b_size) { bh = bh->b_reqnext; if (bh) atomic_set(&bh->b_count, 0); } } pc->bh = bh; } static void idetape_output_buffers (ide_drive_t *drive, idetape_pc_t *pc, unsigned int bcount) { struct idetape_bh *bh = pc->bh; int count; while (bcount) { #if IDETAPE_DEBUG_BUGS if (bh == NULL) { printk(KERN_ERR "ide-tape: bh == NULL in " "idetape_output_buffers\n"); return; } #endif /* IDETAPE_DEBUG_BUGS */ count = min((unsigned int)pc->b_count, (unsigned int)bcount); HWIF(drive)->atapi_output_bytes(drive, pc->b_data, count); bcount -= count; pc->b_data += count; pc->b_count -= count; if (!pc->b_count) { pc->bh = bh = bh->b_reqnext; if (bh) { pc->b_data = bh->b_data; pc->b_count = atomic_read(&bh->b_count); } } } } static void idetape_update_buffers (idetape_pc_t *pc) { struct idetape_bh *bh = pc->bh; int count; unsigned int bcount = pc->actually_transferred; if (test_bit(PC_WRITING, &pc->flags)) return; while (bcount) { #if IDETAPE_DEBUG_BUGS if (bh == NULL) { printk(KERN_ERR "ide-tape: bh == NULL in " "idetape_update_buffers\n"); return; } #endif /* IDETAPE_DEBUG_BUGS */ count = min((unsigned int)bh->b_size, (unsigned int)bcount); atomic_set(&bh->b_count, count); if (atomic_read(&bh->b_count) == bh->b_size) bh = bh->b_reqnext; bcount -= count; } pc->bh = bh; } /* * idetape_next_pc_storage returns a pointer to a place in which we can * safely store a packet command, even though we intend to leave the * driver. A storage space for a maximum of IDETAPE_PC_STACK packet * commands is allocated at initialization time. */ static idetape_pc_t *idetape_next_pc_storage (ide_drive_t *drive) { idetape_tape_t *tape = drive->driver_data; #if IDETAPE_DEBUG_LOG if (tape->debug_level >= 5) printk(KERN_INFO "ide-tape: pc_stack_index=%d\n", tape->pc_stack_index); #endif /* IDETAPE_DEBUG_LOG */ if (tape->pc_stack_index == IDETAPE_PC_STACK) tape->pc_stack_index=0; return (&tape->pc_stack[tape->pc_stack_index++]); } /* * idetape_next_rq_storage is used along with idetape_next_pc_storage. * Since we queue packet commands in the request queue, we need to * allocate a request, along with the allocation of a packet command. */ /************************************************************** * * * This should get fixed to use kmalloc(.., GFP_ATOMIC) * * followed later on by kfree(). -ml * * * **************************************************************/ static struct request *idetape_next_rq_storage (ide_drive_t *drive) { idetape_tape_t *tape = drive->driver_data; #if IDETAPE_DEBUG_LOG if (tape->debug_level >= 5) printk(KERN_INFO "ide-tape: rq_stack_index=%d\n", tape->rq_stack_index); #endif /* IDETAPE_DEBUG_LOG */ if (tape->rq_stack_index == IDETAPE_PC_STACK) tape->rq_stack_index=0; return (&tape->rq_stack[tape->rq_stack_index++]); } /* * idetape_init_pc initializes a packet command. */ static void idetape_init_pc (idetape_pc_t *pc) { memset(pc->c, 0, 12); pc->retries = 0; pc->flags = 0; pc->request_transfer = 0; pc->buffer = pc->pc_buffer; pc->buffer_size = IDETAPE_PC_BUFFER_SIZE; pc->bh = NULL; pc->b_data = NULL; } /* * idetape_analyze_error is called on each failed packet command retry * to analyze the request sense. We currently do not utilize this * information. */ static void idetape_analyze_error (ide_drive_t *drive, idetape_request_sense_result_t *result) { idetape_tape_t *tape = drive->driver_data; idetape_pc_t *pc = tape->failed_pc; tape->sense = *result; tape->sense_key = result->sense_key; tape->asc = result->asc; tape->ascq = result->ascq; #if IDETAPE_DEBUG_LOG /* * Without debugging, we only log an error if we decided to * give up retrying. */ if (tape->debug_level >= 1) printk(KERN_INFO "ide-tape: pc = %x, sense key = %x, " "asc = %x, ascq = %x\n", pc->c[0], result->sense_key, result->asc, result->ascq); #endif /* IDETAPE_DEBUG_LOG */ /* * Correct pc->actually_transferred by asking the tape. */ if (test_bit(PC_DMA_ERROR, &pc->flags)) { pc->actually_transferred = pc->request_transfer - tape->tape_block_size * ntohl(get_unaligned(&result->information)); idetape_update_buffers(pc); } /* * If error was the result of a zero-length read or write command, * with sense key=5, asc=0x22, ascq=0, let it slide. Some drives * (i.e. Seagate STT3401A Travan) don't support 0-length read/writes. */ if ((pc->c[0] == IDETAPE_READ_CMD || pc->c[0] == IDETAPE_WRITE_CMD) && pc->c[4] == 0 && pc->c[3] == 0 && pc->c[2] == 0) { /* length==0 */ if (result->sense_key == 5) { /* don't report an error, everything's ok */ pc->error = 0; /* don't retry read/write */ set_bit(PC_ABORT, &pc->flags); } } if (pc->c[0] == IDETAPE_READ_CMD && result->filemark) { pc->error = IDETAPE_ERROR_FILEMARK; set_bit(PC_ABORT, &pc->flags); } if (pc->c[0] == IDETAPE_WRITE_CMD) { if (result->eom || (result->sense_key == 0xd && result->asc == 0x0 && result->ascq == 0x2)) { pc->error = IDETAPE_ERROR_EOD; set_bit(PC_ABORT, &pc->flags); } } if (pc->c[0] == IDETAPE_READ_CMD || pc->c[0] == IDETAPE_WRITE_CMD) { if (result->sense_key == 8) { pc->error = IDETAPE_ERROR_EOD; set_bit(PC_ABORT, &pc->flags); } if (!test_bit(PC_ABORT, &pc->flags) && pc->actually_transferred) pc->retries = IDETAPE_MAX_PC_RETRIES + 1; } } /* * idetape_active_next_stage will declare the next stage as "active". */ static void idetape_active_next_stage (ide_drive_t *drive) { idetape_tape_t *tape = drive->driver_data; idetape_stage_t *stage = tape->next_stage; struct request *rq = &stage->rq; #if IDETAPE_DEBUG_LOG if (tape->debug_level >= 4) printk(KERN_INFO "ide-tape: Reached idetape_active_next_stage\n"); #endif /* IDETAPE_DEBUG_LOG */ #if IDETAPE_DEBUG_BUGS if (stage == NULL) { printk(KERN_ERR "ide-tape: bug: Trying to activate a non existing stage\n"); return; } #endif /* IDETAPE_DEBUG_BUGS */ rq->rq_disk = tape->disk; rq->buffer = NULL; rq->special = (void *)stage->bh; tape->active_data_request = rq; tape->active_stage = stage; tape->next_stage = stage->next; } /* * idetape_increase_max_pipeline_stages is a part of the feedback * loop which tries to find the optimum number of stages. In the * feedback loop, we are starting from a minimum maximum number of * stages, and if we sense that the pipeline is empty, we try to * increase it, until we reach the user compile time memory limit. */ static void idetape_increase_max_pipeline_stages (ide_drive_t *drive) { idetape_tape_t *tape = drive->driver_data; int increase = (tape->max_pipeline - tape->min_pipeline) / 10; #if IDETAPE_DEBUG_LOG if (tape->debug_level >= 4) printk (KERN_INFO "ide-tape: Reached idetape_increase_max_pipeline_stages\n"); #endif /* IDETAPE_DEBUG_LOG */ tape->max_stages += max(increase, 1); tape->max_stages = max(tape->max_stages, tape->min_pipeline); tape->max_stages = min(tape->max_stages, tape->max_pipeline); } /* * idetape_kfree_stage calls kfree to completely free a stage, along with * its related buffers. */ static void __idetape_kfree_stage (idetape_stage_t *stage) { struct idetape_bh *prev_bh, *bh = stage->bh; int size; while (bh != NULL) { if (bh->b_data != NULL) { size = (int) bh->b_size; while (size > 0) { free_page((unsigned long) bh->b_data); size -= PAGE_SIZE; bh->b_data += PAGE_SIZE; } } prev_bh = bh; bh = bh->b_reqnext; kfree(prev_bh); } kfree(stage); } static void idetape_kfree_stage (idetape_tape_t *tape, idetape_stage_t *stage) { __idetape_kfree_stage(stage); } /* * idetape_remove_stage_head removes tape->first_stage from the pipeline. * The caller should avoid race conditions. */ static void idetape_remove_stage_head (ide_drive_t *drive) { idetape_tape_t *tape = drive->driver_data; idetape_stage_t *stage; #if IDETAPE_DEBUG_LOG if (tape->debug_level >= 4) printk(KERN_INFO "ide-tape: Reached idetape_remove_stage_head\n"); #endif /* IDETAPE_DEBUG_LOG */ #if IDETAPE_DEBUG_BUGS if (tape->first_stage == NULL) { printk(KERN_ERR "ide-tape: bug: tape->first_stage is NULL\n"); return; } if (tape->active_stage == tape->first_stage) { printk(KERN_ERR "ide-tape: bug: Trying to free our active pipeline stage\n"); return; } #endif /* IDETAPE_DEBUG_BUGS */ stage = tape->first_stage; tape->first_stage = stage->next; idetape_kfree_stage(tape, stage); tape->nr_stages--; if (tape->first_stage == NULL) { tape->last_stage = NULL; #if IDETAPE_DEBUG_BUGS if (tape->next_stage != NULL) printk(KERN_ERR "ide-tape: bug: tape->next_stage != NULL\n"); if (tape->nr_stages) printk(KERN_ERR "ide-tape: bug: nr_stages should be 0 now\n"); #endif /* IDETAPE_DEBUG_BUGS */ } } /* * This will free all the pipeline stages starting from new_last_stage->next * to the end of the list, and point tape->last_stage to new_last_stage. */ static void idetape_abort_pipeline(ide_drive_t *drive, idetape_stage_t *new_last_stage) { idetape_tape_t *tape = drive->driver_data; idetape_stage_t *stage = new_last_stage->next; idetape_stage_t *nstage; #if IDETAPE_DEBUG_LOG if (tape->debug_level >= 4) printk(KERN_INFO "ide-tape: %s: idetape_abort_pipeline called\n", tape->name); #endif while (stage) { nstage = stage->next; idetape_kfree_stage(tape, stage); --tape->nr_stages; --tape->nr_pending_stages; stage = nstage; } if (new_last_stage) new_last_stage->next = NULL; tape->last_stage = new_last_stage; tape->next_stage = NULL; } /* * idetape_end_request is used to finish servicing a request, and to * insert a pending pipeline request into the main device queue. */ static int idetape_end_request(ide_drive_t *drive, int uptodate, int nr_sects) { struct request *rq = HWGROUP(drive)->rq; idetape_tape_t *tape = drive->driver_data; unsigned long flags; int error; int remove_stage = 0; idetape_stage_t *active_stage; #if IDETAPE_DEBUG_LOG if (tape->debug_level >= 4) printk(KERN_INFO "ide-tape: Reached idetape_end_request\n"); #endif /* IDETAPE_DEBUG_LOG */ switch (uptodate) { case 0: error = IDETAPE_ERROR_GENERAL; break; case 1: error = 0; break; default: error = uptodate; } rq->errors = error; if (error) tape->failed_pc = NULL; spin_lock_irqsave(&tape->spinlock, flags); /* The request was a pipelined data transfer request */ if (tape->active_data_request == rq) { active_stage = tape->active_stage; tape->active_stage = NULL; tape->active_data_request = NULL; tape->nr_pending_stages--; if (rq->cmd[0] & REQ_IDETAPE_WRITE) { remove_stage = 1; if (error) { set_bit(IDETAPE_PIPELINE_ERROR, &tape->flags); if (error == IDETAPE_ERROR_EOD) idetape_abort_pipeline(drive, active_stage); } } else if (rq->cmd[0] & REQ_IDETAPE_READ) { if (error == IDETAPE_ERROR_EOD) { set_bit(IDETAPE_PIPELINE_ERROR, &tape->flags); idetape_abort_pipeline(drive, active_stage); } } if (tape->next_stage != NULL) { idetape_active_next_stage(drive); /* * Insert the next request into the request queue. */ (void) ide_do_drive_cmd(drive, tape->active_data_request, ide_end); } else if (!error) { idetape_increase_max_pipeline_stages(drive); } } ide_end_drive_cmd(drive, 0, 0); // blkdev_dequeue_request(rq); // drive->rq = NULL; // end_that_request_last(rq); if (remove_stage) idetape_remove_stage_head(drive); if (tape->active_data_request == NULL) clear_bit(IDETAPE_PIPELINE_ACTIVE, &tape->flags); spin_unlock_irqrestore(&tape->spinlock, flags); return 0; } static ide_startstop_t idetape_request_sense_callback (ide_drive_t *drive) { idetape_tape_t *tape = drive->driver_data; #if IDETAPE_DEBUG_LOG if (tape->debug_level >= 4) printk(KERN_INFO "ide-tape: Reached idetape_request_sense_callback\n"); #endif /* IDETAPE_DEBUG_LOG */ if (!tape->pc->error) { idetape_analyze_error(drive, (idetape_request_sense_result_t *) tape->pc->buffer); idetape_end_request(drive, 1, 0); } else { printk(KERN_ERR "ide-tape: Error in REQUEST SENSE itself - Aborting request!\n"); idetape_end_request(drive, 0, 0); } return ide_stopped; } static void idetape_create_request_sense_cmd (idetape_pc_t *pc) { idetape_init_pc(pc); pc->c[0] = IDETAPE_REQUEST_SENSE_CMD; pc->c[4] = 20; pc->request_transfer = 20; pc->callback = &idetape_request_sense_callback; } static void idetape_init_rq(struct request *rq, u8 cmd) { memset(rq, 0, sizeof(*rq)); rq->flags = REQ_SPECIAL; rq->cmd[0] = cmd; } /* * idetape_queue_pc_head generates a new packet command request in front * of the request queue, before the current request, so that it will be * processed immediately, on the next pass through the driver. * * idetape_queue_pc_head is called from the request handling part of * the driver (the "bottom" part). Safe storage for the request should * be allocated with idetape_next_pc_storage and idetape_next_rq_storage * before calling idetape_queue_pc_head. * * Memory for those requests is pre-allocated at initialization time, and * is limited to IDETAPE_PC_STACK requests. We assume that we have enough * space for the maximum possible number of inter-dependent packet commands. * * The higher level of the driver - The ioctl handler and the chara