Annotation of ntddk/src/scsi/qic117/q117.h, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Copyright (c) 1993 - Colorado Memory Systems, Inc.
        !             4: All Rights Reserved
        !             5: 
        !             6: Module Name:
        !             7: 
        !             8:     q117.h
        !             9: 
        !            10: Abstract:
        !            11: 
        !            12:     Data structures used only by q117 driver.  Contains QIC-40 structures
        !            13:     and Context for q117.
        !            14: 
        !            15: Revision History:
        !            16: 
        !            17: --*/
        !            18: 
        !            19: //
        !            20: //  For NTBACKUP to work,  an early warning is required to allow the
        !            21: //  application to perform tape linking.  To achive this,  a 5 segment
        !            22: //  region at the end of the tape is RESERVED to genterate early warning
        !            23: //  status.  This value is used in q117WriteTape for this purpose.
        !            24: //
        !            25: #define SEGMENTS_OF_EARLY_WARNING   5
        !            26: 
        !            27: 
        !            28: #define FORMAT_BYTE             0x6b
        !            29: 
        !            30: #define MAX_BAD_BLOCKS          ((1024*27)/sizeof(ULONG))
        !            31: #define LIST_ENTRY_SIZE         3
        !            32: #define MAX_BAD_LIST            (((1024*27)/LIST_ENTRY_SIZE) - 1)
        !            33: 
        !            34: #define MAX_TITLE_SIZE          44      // max volume title entry size in far memory array
        !            35: #define MAX_PASSWORD_SIZE       8       // max volume password size
        !            36: 
        !            37: #define MAX_QIC40_FILENAME      13
        !            38: #define MAX_HEADER_SIZE         256     // maximum QIC-40 header size
        !            39: #define DATA_HEADER_SIG_SIZE    4       // data header signature size
        !            40: 
        !            41: #define ECC_BLOCKS_PER_SEGMENT  3       // number of correction sectors ber block
        !            42: #define BLOCKS_PER_SEGMENT      32      // Number of sectors per block on the tape.
        !            43:                                         // number of data sectors per block
        !            44: 
        !            45: #define DATA_BLOCKS_PER_SEGMENT (BLOCKS_PER_SEGMENT - ECC_BLOCKS_PER_SEGMENT)
        !            46: 
        !            47: #define BYTES_PER_SECTOR    1024
        !            48: #define BYTES_PER_SEGMENT   (BYTES_PER_SECTOR*BLOCKS_PER_SEGMENT)
        !            49: 
        !            50: #define TapeHeaderSig       0xaa55aa55l
        !            51: #define VolumeTableSig      (((ULONG)'L'<<24) + ((ULONG)'B'<<16) + ('T'<<8) + 'V')
        !            52: #define FileHeaderSig       0x33cc33ccl
        !            53: 
        !            54: #define QIC40_VENDOR_UNIQUE_SIZE        106
        !            55: 
        !            56: 
        !            57: #define VENDOR_TYPE_NONE    0
        !            58: #define VENDOR_TYPE_CMS     1
        !            59: 
        !            60: #define MOUNTAIN_SEMISPECED_SPACE       9
        !            61: 
        !            62: #define VU_SIGNATURE_SIZE           4
        !            63: #define VU_TAPE_NAME_SIZE           11
        !            64: 
        !            65: #define VU_SEGS_PER_TRACK           68
        !            66: #define VU_SEGS_PER_TRACK_XL        102
        !            67: #define VU_80SEGS_PER_TRACK         100
        !            68: #define VU_80SEGS_PER_TRACK_XL      150
        !            69: 
        !            70: #define VU_MAX_FLOPPY_TRACK         169
        !            71: #define VU_MAX_FLOPPY_TRACK_XL      254
        !            72: #define VU_80MAX_FLOPPY_TRACK       149
        !            73: #define VU_80MAX_FLOPPY_TRACK_XL    149
        !            74: 
        !            75: #define VU_TRACKS_PER_CART          20
        !            76: #define VU_80TRACKS_PER_CART        28
        !            77: 
        !            78: #define VU_MAX_FLOPPY_SIDE          1
        !            79: #define VU_80MAX_FLOPPY_SIDE        4
        !            80: #define VU_80MAX_FLOPPY_SIDE_XL     6
        !            81: 
        !            82: #define VU_MAX_FLOPPY_SECT          128
        !            83: 
        !            84: #define NEW_SPEC_TAPE_NAME_SIZE     44
        !            85: 
        !            86: #define FILE_VENDOR_SPECIFIC        0
        !            87: #define FILE_UNIX_SPECIFIC          1
        !            88: #define FILE_DATA_BAD               2
        !            89: 
        !            90: #define OP_MS_DOS           0
        !            91: #define OP_UNIX             1
        !            92: #define OP_UNIX_PUBLIC      2
        !            93: #define OP_OS_2             3
        !            94: #define OP_WINDOWS_NT       4
        !            95: 
        !            96: // Valid values for compression code
        !            97: #define COMP_STAC 0x01
        !            98: #define COMP_VEND 0x3f
        !            99: 
        !           100: //
        !           101: // The following section specifies QIC-40 data structures.
        !           102: // These structures are aligned on byte boundaries.
        !           103: //
        !           104: #pragma pack(1)
        !           105: 
        !           106: struct _FAIL_DATE {
        !           107:     UWORD   Year:7;                     // year +1970 (1970-2097)
        !           108:     UWORD   Month:4;                        // month (1-12)
        !           109:     UWORD   Day:5;                      // day (1-31)
        !           110: };
        !           111: 
        !           112: struct _CMS_VENDOR_UNIQUE {
        !           113:     UBYTE   type;                           // 0 = none; 1 = CMS
        !           114:     CHAR    signature[VU_SIGNATURE_SIZE];   // "CMS" , ASCIIZ string
        !           115:     ULONG   creation_time;                  // QIC40/QIC113 date/time format
        !           116:     CHAR    tape_name[VU_TAPE_NAME_SIZE];   // space padded name
        !           117:     CHAR    checksum;                       // checksum of UBYTEs 0 - 19 of this struct
        !           118: };
        !           119: 
        !           120: struct _CMS_NEW_TAPE_NAME {
        !           121:     CHAR reserved[MOUNTAIN_SEMISPECED_SPACE];   // leave room for Mountain stuff
        !           122:     CHAR tape_name[NEW_SPEC_TAPE_NAME_SIZE];    // space padded name
        !           123:     ULONG creation_time;                        // QIC40/QIC113 date/time format
        !           124: };
        !           125: 
        !           126: struct _CMS_CORRECT_TAPE_NAME {
        !           127:     UWORD   unused2;
        !           128:     UWORD  TrackSeg;                           // Tape segments per tape track
        !           129:     UBYTE  CartTracks;                         // Tape tracks per cartridge
        !           130:     UBYTE  MaxFlopSide;                        // Maximum floppy sides
        !           131:     UBYTE  MaxFlopTrack;                       // Maximum floppy tracks
        !           132:     UBYTE  MaxFlopSect;                        // Maximum floppy sectors
        !           133:     CHAR  tape_name[NEW_SPEC_TAPE_NAME_SIZE];  // space padded name
        !           134:     ULONG creation_time;                       // QIC40/QIC113 date/time format
        !           135: };
        !           136: 
        !           137: typedef union _QIC40_VENDOR_UNIQUE {
        !           138:         struct _CMS_VENDOR_UNIQUE cms;
        !           139:         CHAR vu[QIC40_VENDOR_UNIQUE_SIZE];
        !           140:         struct _CMS_NEW_TAPE_NAME new_name;
        !           141:         struct _CMS_CORRECT_TAPE_NAME correct_name;
        !           142: } QIC40_VENDOR_UNIQUE, *PQIC40_VENDOR_UNIQUE;
        !           143: 
        !           144: typedef struct S_BadList {
        !           145:     UBYTE ListEntry[LIST_ENTRY_SIZE];
        !           146: } BAD_LIST, *BAD_LIST_PTR;
        !           147: 
        !           148: typedef union U_BadMap {
        !           149:     ULONG BadSectors[MAX_BAD_BLOCKS];
        !           150:     BAD_LIST BadList[MAX_BAD_LIST];
        !           151: } BAD_MAP, *BAD_MAP_PTR;
        !           152: 
        !           153: 
        !           154: 
        !           155: 
        !           156: // Tape Header (sectors 0-1) and BadSector Array (2-13)
        !           157: typedef struct _TAPE_HEADER {
        !           158:     ULONG   Signature;                  // set to 0xaa55aa55l
        !           159:     UBYTE   FormatCode;                 // set to 0x01
        !           160:     UBYTE   unused1;
        !           161:     SEGMENT HeaderSegment;              // segment number of header
        !           162:     SEGMENT DupHeaderSegment;           // segment number of duplicate header
        !           163:     SEGMENT FirstSegment;               // segment number of Data area
        !           164:     SEGMENT LastSegment;                // segment number of End of Data area
        !           165:     ULONG   CurrentFormat;              // time of most recent format
        !           166:     ULONG   CurrentUpdate;              // time of most recent write to cartridge
        !           167:     union _QIC40_VENDOR_UNIQUE VendorUnique; // Vendor unique stuff
        !           168:     UBYTE   ReformatError;              // 0xff if any of remaining data is lost
        !           169:     UBYTE   unused3;
        !           170:     ULONG   SegmentsUsed;               // incremented every time a segment is used
        !           171:     UBYTE   unused4[4];
        !           172:     ULONG   InitialFormat;              // time of initial format
        !           173:     UWORD   FormatCount;                // number of times tape has been formatted
        !           174:     UWORD   FailedSectors;              // the number entries in failed sector log
        !           175:     CHAR    ManufacturerName[44];       // name of manufacturer that pre-formatted
        !           176:     CHAR    LotCode[44];                // pre-format lot code
        !           177:     UBYTE   unused5[22];
        !           178:     struct S_Failed {
        !           179:         SEGMENT  Segment;               // number of segment that failed
        !           180:         struct _FAIL_DATE DateFailed;       // date of failure
        !           181:     } Failed[(1024+768)/4];             // fill out remaining UBYTEs of sector + next
        !           182:     BAD_MAP BadMap;
        !           183: } TAPE_HEADER, *PTAPE_HEADER;
        !           184: 
        !           185: //
        !           186: // CMS Vendor specific area
        !           187: //
        !           188: typedef struct _CMS_VOLUME_VENDOR {
        !           189:     CHAR Signature[4];          // set to "CMS" (null terminated) if it is our backup
        !           190:     UWORD FirmwareRevision;     // firmware version
        !           191:     UWORD SoftwareRevision;     // software version
        !           192:     CHAR RightsFiles;           // if 0xff = novell rights information present
        !           193:     UWORD NumFiles;             // number of files in volume
        !           194:     CHAR OpSysType;             // flavor of operating system at creation
        !           195: } CMS_VOLUME_VENDOR, PCMS_VOLUME_VENDOR;
        !           196: 
        !           197: //
        !           198: // QIC-40 Volume table structure
        !           199: //
        !           200: typedef struct _VOLUME_TABLE_ENTRY {
        !           201:     ULONG   Signature;                  // this entry will be "VTBL" if volume exists
        !           202:     SEGMENT StartSegment;               // starting segment of volume for this cart
        !           203:     SEGMENT EndingSegment;              // ending segment of volume for this cart
        !           204:     CHAR    Description[MAX_TITLE_SIZE]; // user description of volume
        !           205:     ULONG   CreationTime;               // time of creation of the volume
        !           206:     UWORD   VendorSpecific:1;           // set if remainder of volume entry is vend spec
        !           207:     UWORD   MultiCartridge:1;           // set if volume spans another tape
        !           208:     UWORD   NotVerified:1;              // set if volume not verified yet
        !           209:     UWORD   NoNewName:1;                // set if new file names (redirection) disallowed
        !           210:     UWORD   StacCompress:1;
        !           211:     UWORD   reserved:3;
        !           212:     UWORD   SequenceNumber:8;           // multi-cartridge sequence number
        !           213:     union {
        !           214:         CMS_VOLUME_VENDOR cms_QIC40;
        !           215:         UBYTE reserved[26];             // vendor extension data
        !           216:     } Vendor;
        !           217:     CHAR    Password[MAX_PASSWORD_SIZE];// password for volume
        !           218:     ULONG   DirectorySize;              // number of UBYTEs reserved for directory
        !           219:     ULONG   DataSize;                   // size of data area (includes other cartridges)
        !           220:     UWORD   OpSysVersion;               // operating system version
        !           221:     CHAR    VolumeLabel[16];            // volume label of source drive
        !           222:     UBYTE   LogicalDevice;              // who knows
        !           223:     UBYTE   PhysicalDevice;             // who knows
        !           224:     UWORD   CompressCode:6;             // type of compression, 3Fh = vendor specific
        !           225:     UWORD   CompressAlwaysZero:1;       // must be 0
        !           226:     UWORD   CompressSwitch:1;           // compression use flag
        !           227:     UWORD   reserved1:8;
        !           228:     UBYTE   reserved2[6];
        !           229: } VOLUME_TABLE_ENTRY, *PVOLUME_TABLE_ENTRY;
        !           230: 
        !           231: #pragma pack()
        !           232: 
        !           233: 
        !           234: //
        !           235: // The following structure is the context for the q117 driver.  It contains
        !           236: // all current "state" information for the tape drive.
        !           237: //
        !           238: typedef struct _Q117_CONTEXT {
        !           239: 
        !           240:     BOOLEAN DriverOpened;               // Set if driver is opened
        !           241: 
        !           242:     VOLUME_TABLE_ENTRY ActiveVolume;    // volume currently being saved to (nt volume)
        !           243:     USHORT ActiveVolumeNumber;          // The sequence number of the current struct VolDir.
        !           244: 
        !           245:     //TAPE_STATUS TapeStatus;
        !           246: 
        !           247: //    PVOID DeviceExtension;            // Used by the tape thread
        !           248: 
        !           249:     PDEVICE_OBJECT q117iDeviceObject;
        !           250:     PQ117_ADAPTER_INFO AdapterInfo;     // Filled in at init time with DMA channel
        !           251: 
        !           252:     //
        !           253:     // Error tracking
        !           254:     //
        !           255: 
        !           256:     ULONG ErrorSequence;
        !           257:     UCHAR MajorFunction;
        !           258: 
        !           259:     //
        !           260:     // Queue management globals
        !           261:     //
        !           262: 
        !           263:     SEGMENT_BUFFER SegmentBuffer[UNIX_MAXBFS];    // Array of segment buffers
        !           264: 
        !           265:     ULONG SegmentBuffersAvailable;
        !           266: 
        !           267:     ULONG QueueTailIndex;               // Index in the IORequest array that indexes the tail.
        !           268: 
        !           269:     ULONG QueueHeadIndex;               // This is the head of the Filer IORequest ring-tail array.
        !           270: 
        !           271:     PIO_REQUEST IoRequest;              // pointer to array of IORequests
        !           272: 
        !           273:     //
        !           274:     // current buffer information
        !           275:     //
        !           276: 
        !           277:     struct {
        !           278: 
        !           279:         enum {
        !           280:             NoOperation,
        !           281:             BackupInProgress,
        !           282:             RestoreInProgress
        !           283:             } Type;
        !           284: 
        !           285:         //
        !           286:         // Information associated with currently active segment
        !           287:         //
        !           288:         PVOID   SegmentPointer;
        !           289:         USHORT  SegmentBytesRemaining;
        !           290:         SEGMENT LastSegmentRead;
        !           291:         SEGMENT CurrentSegment;         // in backup (active segment) in restore (read-ahead segment)
        !           292:         USHORT  BytesZeroFilled;        // Bytes at end of backup that were zeroed (not part of backup)
        !           293:         STATUS  SegmentStatus;
        !           294:         SEGMENT EndOfUsedTape;
        !           295:         SEGMENT LastSegment;            // Last segment of volume
        !           296:         ULONG   BytesOnTape;
        !           297:         BOOLEAN UpdateBadMap;           // if true then update bad sector map
        !           298:         ULONG   BytesRead;
        !           299:         ULONG   Position;               // type of last IOCTL_TAPE_SET_POSITION
        !           300: 
        !           301:         } CurrentOperation;
        !           302: 
        !           303:     //
        !           304:     // current tape information
        !           305:     //
        !           306: 
        !           307:     struct {
        !           308:         enum {
        !           309:             TapeInfoLoaded,
        !           310:             NeedInfoLoaded
        !           311:             }   State;
        !           312: 
        !           313:         SEGMENT LastUsedSegment;
        !           314:         SEGMENT VolumeSegment;
        !           315:         ULONG   BadSectors;
        !           316:         SEGMENT LastSegment;            // Last formatted segment.
        !           317:         USHORT  MaximumVolumes;         // Maximum volumes entries available
        !           318:         PTAPE_HEADER TapeHeader;        // Header from tape
        !           319:         struct _TAPE_GET_MEDIA_PARAMETERS *MediaInfo;
        !           320:         BAD_MAP_PTR BadMapPtr;
        !           321:         ULONG BadSectorMapSize;
        !           322:         USHORT CurBadListIndex;
        !           323:         USHORT TapeFormatCode;
        !           324: 
        !           325:         } CurrentTape;
        !           326: 
        !           327: 
        !           328: 
        !           329:     // if this global is set then the tape directory has been loaded
        !           330:     PIO_REQUEST tapedir;
        !           331: 
        !           332:     char drive_type;                    // QIC40 or QIC80
        !           333: 
        !           334:     //
        !           335:     // The following pointers are allocated when open is called and
        !           336:     //  freed at close time.
        !           337:     //
        !           338: 
        !           339: #ifndef NO_MARKS
        !           340: #define MAX_MARKS 255
        !           341:     ULONG CurrentMark;
        !           342:     struct _MARKENTRIES {
        !           343:         ULONG TotalMarks;
        !           344:         struct _MARKLIST {
        !           345:             ULONG Type;
        !           346:             ULONG Offset;
        !           347:         } MarkEntry[MAX_MARKS];
        !           348:     } MarkArray;
        !           349: #endif
        !           350: 
        !           351: } Q117_CONTEXT, *PQ117_CONTEXT;
        !           352: 
        !           353: 
        !           354: typedef enum _DEQUEUE_TYPE {
        !           355:     FlushItem,
        !           356:     WaitForItem
        !           357: } DEQUEUE_TYPE;
        !           358: 
        !           359: //
        !           360: // Common need:  convert block into segment
        !           361: //
        !           362: #define BLOCK_TO_SEGMENT(block) ((SEGMENT)((block) / BLOCKS_PER_SEGMENT))
        !           363: #define SEGMENT_TO_BLOCK(segment) ((BLOCK)(segment) * BLOCKS_PER_SEGMENT)
        !           364: 
        !           365: 
        !           366: //
        !           367: // This define is the block size used by position commands
        !           368: // Note:  It is 512 to be compatible with the Maynstream backup
        !           369: // that does not do a getmedia parameters
        !           370: //
        !           371: #define BLOCK_SIZE  BYTES_PER_SECTOR
        !           372: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.