5dc76893af
from: Sergey Ryzhkov, Serge Vakulenko E-mail: <sir@kiae.su>, <vak@zebub.msk.su> This is the streamer tape driver for 386bsd and FreeBSD, which supports Wangtek and Archive compatible QIC-02/QIC-36 controllers. It was developed as a replacement of the old Wangtek tape driver from CMU. In comparison with the CMU driver, this version has the following enhancements: 1) Support for Archive SC402 and SC499 tape controllers added. 2) Support for up to three tape controllers on the same machine. 3) Support for BSD-style ioctls MTIOCGET, MTIOCTOP. Mt command now works adequately with this driver. 2) Asynchronous REWIND and FSF operations, close() will not wait until they finish. The next open() will wait for it instead. 4) Use of WTQICMD ioctl is limited to ERASE and RETENS operations. This prevents the user from locking the tape driver by strange tape operations. 5) Tape density switching added. 6) The status of the process, blocked on the tape operation, is displayed at the WCHAN column of the `ps' command as: wtread reading data from the tape wtwrite writing data to the tape wtrfm reading the tape marker wtwfm writing the tape marker wtrew rewinding the tape wterase doing WTQICMD ERASE operation wtretens doing WTQICMD RETENS operation wtorew doing MTIOCTOP REW/OFFL operation wtorfm doing MTIOCTOP FSF operation wtowfm doing MTIOCTOP WEOF operation 7) It's possible to use the tape with "default density", useful for devices which don't support density switching or do automatic format determination. 8) Some controllers support only 1024 block length. Setting WT_BSIZE bit in device minor number turns on this mode. Minor number structure: 0bfffuuu Fields: uuu - Unit number. It's possible to install up to three tape controllers on the same machine, using DRQs 1..3. Hence, unit number can lie in range 0..2. fff - Tape format number: 0 - /dev/rwt0 - default density (auto select) 1 - /dev/rwt0a - QIC 11 (obsolete) 2 - /dev/rwt0b - QIC 24 (60 megabytes) 3 - /dev/rwt0c - QIC 120 (120 megabytes) 4 - /dev/rwt0d - QIC 150 (150 megabytes) 5 - /dev/rwt0e - QIC 300 (300 megabytes?) 6 - /dev/rwt0f - QIC 600 (600 megabytes?) b - Long block size flag. With this bit set, the driver will perform all i/o operations with the controller using 1024-byte blocks, instead of 512 ones. Some controllers need it (CMS for example). If you Wangtek controller does not stream well, you can try to use /dev/rWt0 device instead of /dev/rwt0 (uncomment needed lines in /dev/MAKEDEV to create it). Block interface (writing blocks less than 2048 bytes) is not functioning pwoperly. Use raw interface instead. Thanks to all who helped to test it on the following hardware: Controller Drive Volume Interface Thanks to --------------------------------------------------------------------------- Archive SC-499 Archive 2150L 150 Meg QIC-02 KIAE CMS? ? 150 Meg QIC-02 KIAE Everex EV 831/833 ? ? QIC-36 Joergen Haegg Wangtek ASSY Wangtek 60 Meg QIC-02 Ken Whedbee Tecmar QT150i? Wangtek 5150EQ ? QIC-02? Marko Teiste ? Wangtek 5099EK 60 Meg QIC-36 Robert Shien Archive SC400S ? 60 Meg ? Warren Toomey
126 lines
5.7 KiB
C
126 lines
5.7 KiB
C
/*
|
|
* Streamer tape driver for 386bsd and FreeBSD.
|
|
* Supports Archive and Wangtek compatible QIC-02/QIC-36 boards.
|
|
*
|
|
* Copyright (C) 1993 by:
|
|
* Sergey Ryzhkov <sir@kiae.su>
|
|
* Serge Vakulenko <vak@zebub.msk.su>
|
|
*
|
|
* This software is distributed with NO WARRANTIES, not even the implied
|
|
* warranties for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
*
|
|
* Authors grant any other persons or organisations permission to use
|
|
* or modify this software as long as this message is kept with the software,
|
|
* all derivative works or modified versions.
|
|
*
|
|
* This driver is derived from the old 386bsd Wangtek streamer tape driver,
|
|
* made by Robert Baron at CMU, based on Intel sources.
|
|
* Authors thank Robert Baron, CMU and Intel and retain here
|
|
* the original CMU copyright notice.
|
|
*
|
|
* Version 1.3, Thu Nov 11 12:09:13 MSK 1993
|
|
* $Id$
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 1989 Carnegie-Mellon University.
|
|
* All rights reserved.
|
|
*
|
|
* Authors: Robert Baron
|
|
*
|
|
* Permission to use, copy, modify and distribute this software and
|
|
* its documentation is hereby granted, provided that both the copyright
|
|
* notice and this permission notice appear in all copies of the
|
|
* software, derivative works or modified versions, and any portions
|
|
* thereof, and that both notices appear in supporting documentation.
|
|
*
|
|
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
|
|
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
|
|
* FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
|
|
*
|
|
* Carnegie Mellon requests users of this software to return to
|
|
*
|
|
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
|
|
* School of Computer Science
|
|
* Carnegie Mellon University
|
|
* Pittsburgh PA 15213-3890
|
|
*
|
|
* any improvements or extensions that they make and grant Carnegie the
|
|
* rights to redistribute these changes.
|
|
*/
|
|
|
|
/* ioctl for direct QIC commands */
|
|
#define WTQICMD _IO('W', 0)
|
|
|
|
/* QIC-02 commands allowed for WTQICMD */
|
|
#define QIC_ERASE 0x22 /* erase the tape */
|
|
#define QIC_RETENS 0x24 /* retension the tape */
|
|
|
|
/* internal QIC-02 commands */
|
|
#define QIC_RDDATA 0x80 /* read data */
|
|
#define QIC_READFM 0xa0 /* read file mark */
|
|
#define QIC_WRTDATA 0x40 /* write data */
|
|
#define QIC_WRITEFM 0x60 /* write file mark */
|
|
#define QIC_RDSTAT 0xc0 /* read status command */
|
|
#define QIC_REWIND 0x21 /* rewind command (position+bot) */
|
|
#define QIC_FMT11 0x26 /* set format QIC-11 */
|
|
#define QIC_FMT24 0x27 /* set format QIC-24 */
|
|
#define QIC_FMT120 0x28 /* set format QIC-120 */
|
|
#define QIC_FMT150 0x29 /* set format QIC-150 */
|
|
#define QIC_FMT300 0x2a /* set format QIC-300/QIC-2100 */
|
|
#define QIC_FMT600 0x2b /* set format QIC-600/QIC-2200 */
|
|
|
|
/* tape driver flags */
|
|
#define TPINUSE 0x0001 /* tape is already open */
|
|
#define TPREAD 0x0002 /* tape is only open for reading */
|
|
#define TPWRITE 0x0004 /* tape is only open for writing */
|
|
#define TPSTART 0x0008 /* tape must be rewound and reset */
|
|
#define TPRMARK 0x0010 /* read file mark command outstanding */
|
|
#define TPWMARK 0x0020 /* write file mark command outstanding */
|
|
#define TPREW 0x0040 /* rewind command outstanding */
|
|
#define TPEXCEP 0x0080 /* i/o exception flag */
|
|
#define TPVOL 0x0100 /* read file mark or hit end of tape */
|
|
#define TPWO 0x0200 /* write command outstanding */
|
|
#define TPRO 0x0400 /* read command outstanding */
|
|
#define TPWANY 0x0800 /* write command requested */
|
|
#define TPRANY 0x1000 /* read command requested */
|
|
#define TPWP 0x2000 /* write protect error seen */
|
|
#define TPTIMER 0x4000 /* timer() is active */
|
|
#define TPACTIVE 0x8000 /* dma i/o active */
|
|
|
|
/* controller error register bits */
|
|
#define TP_FIL 0x0001 /* File mark detected */
|
|
#define TP_BNL 0x0002 /* Block not located */
|
|
#define TP_UDA 0x0004 /* Unrecoverable data error */
|
|
#define TP_EOM 0x0008 /* End of media */
|
|
#define TP_WRP 0x0010 /* Write protected cartridge */
|
|
#define TP_USL 0x0020 /* Unselected drive */
|
|
#define TP_CNI 0x0040 /* Cartridge not in place */
|
|
#define TP_ST0 0x0080 /* Status byte 0 bits */
|
|
#define TP_ST0MASK 0x00ff /* Status byte 0 mask */
|
|
#define TP_POR 0x0100 /* Power on/reset occurred */
|
|
#define TP_ERM 0x0200 /* Reserved for end of recorded media */
|
|
#define TP_BPE 0x0400 /* Reserved for bus parity error */
|
|
#define TP_BOM 0x0800 /* Beginning of media */
|
|
#define TP_MBD 0x1000 /* Marginal block detected */
|
|
#define TP_NDT 0x2000 /* No data detected */
|
|
#define TP_ILL 0x4000 /* Illegal command - should not happen! */
|
|
#define TP_ST1 0x8000 /* Status byte 1 bits */
|
|
#define TP_ST1MASK 0xff00 /* Status byte 1 mask */
|
|
|
|
/* formats for printing flags and error values */
|
|
#define WTDS_BITS "\20\1inuse\2read\3write\4start\5rmark\6wmark\7rew\10excep\11vol\12wo\13ro\14wany\15rany\16wp\17timer\20active"
|
|
#define WTER_BITS "\20\1eof\2bnl\3uda\4eom\5wrp\6usl\7cni\11por\12erm\13bpe\14bom\15mbd\16ndt\17ill"
|
|
|
|
/* device minor number */
|
|
#define WT_BSIZE 0100 /* long block flag */
|
|
#define WT_DENSEL 0070 /* density select mask */
|
|
#define WT_DENSDFLT 0000 /* default density */
|
|
#define WT_QIC11 0010 /* 11 megabytes? */
|
|
#define WT_QIC24 0020 /* 60 megabytes */
|
|
#define WT_QIC120 0030 /* 120 megabytes */
|
|
#define WT_QIC150 0040 /* 150 megabytes */
|
|
#define WT_QIC300 0050 /* 300 megabytes? */
|
|
#define WT_QIC600 0060 /* 600 megabytes? */
|