432 lines
15 KiB
C
432 lines
15 KiB
C
/*****************************************************************************
|
||
*
|
||
* COPYRIGHT 1993 - COLORADO MEMORY SYSTEMS, INC.
|
||
* ALL RIGHTS RESERVED.
|
||
*
|
||
******************************************************************************
|
||
*
|
||
* FILE: \SE\DRIVER\Q117CD\INCLUDE\CQD_STRC.H
|
||
*
|
||
* PURPOSE: This file contains all of the structures
|
||
* required by the common driver.
|
||
*
|
||
* HISTORY:
|
||
* $Log: J:\se.vcs\driver\q117cd\include\cqd_strc.h $
|
||
*
|
||
* Rev 1.15 15 May 1995 10:45:44 GaryKiwi
|
||
* Phoenix merge from CBW95s
|
||
*
|
||
* Rev 1.14.1.0 11 Apr 1995 18:02:30 garykiwi
|
||
* PHOENIX pass #1
|
||
*
|
||
* Rev 1.15 30 Jan 1995 14:23:14 BOBLEHMA
|
||
* Added the field firmware_version to the cqd_context structure.
|
||
*
|
||
* Rev 1.14 17 Oct 1994 11:42:56 BOBLEHMA
|
||
* Added a tape_cfg field to the S_TapeParms structure. This data will be returned
|
||
* at the end of a CMD_SET_TAPE_PARMS call.
|
||
*
|
||
* Rev 1.13 03 Jun 1994 15:37:52 KEVINKES
|
||
* Removed drive_select from DriveParameters.
|
||
*
|
||
* Rev 1.12 10 May 1994 11:44:04 KEVINKES
|
||
* Removed the eject_pending flag.
|
||
*
|
||
* Rev 1.11 23 Feb 1994 15:45:00 KEVINKES
|
||
* Added isr_reentry counter.
|
||
*
|
||
* Rev 1.10 17 Feb 1994 11:29:44 KEVINKES
|
||
* Added byte packing.
|
||
*
|
||
* Rev 1.9 27 Jan 1994 13:46:06 KEVINKES
|
||
* Modified debug code.
|
||
*
|
||
* Rev 1.8 18 Jan 1994 16:18:02 KEVINKES
|
||
* Updated structures and macros for NT.
|
||
*
|
||
* Rev 1.7 11 Jan 1994 14:21:32 KEVINKES
|
||
* Added an eject_pending flag and fixed the DBG_ARRAY code.
|
||
*
|
||
* Rev 1.6 14 Dec 1993 14:14:54 CHETDOUG
|
||
* removed operation_status.supported_rates
|
||
*
|
||
* Rev 1.5 13 Dec 1993 15:39:26 KEVINKES
|
||
* Modified the structrure for tape address and format.
|
||
*
|
||
* Rev 1.4 15 Nov 1993 16:20:00 KEVINKES
|
||
* Removed the abort flag.
|
||
*
|
||
* Rev 1.3 11 Nov 1993 15:11:04 KEVINKES
|
||
* Modified the FDCAddress structure to store the actual addresses.
|
||
*
|
||
* Rev 1.2 08 Nov 1993 13:40:12 KEVINKES
|
||
* Removed all bitfield structures.
|
||
*
|
||
* Rev 1.1 25 Oct 1993 14:32:44 KEVINKES
|
||
* Changed time_out to be a UDWord.
|
||
*
|
||
* Rev 1.0 18 Oct 1993 17:13:04 KEVINKES
|
||
* Initial Revision.
|
||
*
|
||
*****************************************************************************/
|
||
|
||
/* COMMENTS: *****************************************************************
|
||
*
|
||
****************************************************************************/
|
||
|
||
/* DATA STRUCTURES: *********************************************************/
|
||
|
||
#pragma pack(1)
|
||
|
||
typedef struct S_TapeFormatLgth {
|
||
dUByte format; /* Format of the tape */
|
||
dUByte length; /* Length of the tape */
|
||
} TapeFormatLgth;
|
||
|
||
|
||
/* */
|
||
/* Commands to the Floppy Controller. FDC commands and the corresponding */
|
||
/* driver structures are listed below. */
|
||
/* */
|
||
/* FDC Command Command Struct Response Struct */
|
||
/* ----------- -------------- --------------- */
|
||
/* Read Data rdv_command stat */
|
||
/* Read Deleted Data N/A N/A */
|
||
/* Write Data rdv_command stat */
|
||
/* Write Deleted Data rdv_command stat */
|
||
/* Read a Track N/A N/A */
|
||
/* Verify (82077) N/A N/A */
|
||
/* Version (82077) version_cmd N/A */
|
||
/* Read ID read_id_cmd stat */
|
||
/* Format a Track format_cmd stat */
|
||
/* Scan Equal (765) N/A N/A */
|
||
/* Scan Low or Equal (765) N/A N/A */
|
||
/* Scan High or Equal (765) N/A N/A */
|
||
/* Recalibrate N/A N/A */
|
||
/* Sense Interrupt Status sns_SWord_cmd fdc_result */
|
||
/* Specify specify_cmd N/A */
|
||
/* Sense Drive Status sns_stat_cmd stat */
|
||
/* Seek seek_cmd N/A */
|
||
/* Configure (82077) config_cmd N/A */
|
||
/* Relative Seek (82077) N/A N/A */
|
||
/* Dump Registers (82077) N/A N/A */
|
||
/* Perpendicular Mode (82077) N/A N/A */
|
||
/* Invalid invalid_cmd N/A */
|
||
/* */
|
||
|
||
|
||
|
||
typedef struct S_RdvCommand {
|
||
dUByte command; /* command dUByte */
|
||
dUByte drive; /* drive specifier */
|
||
dUByte C; /* cylinder number */
|
||
dUByte H; /* head address */
|
||
dUByte R; /* record (sector number) */
|
||
dUByte N; /* number of dUBytes per sector */
|
||
dUByte EOT; /* end of track */
|
||
dUByte GPL; /* gap length */
|
||
dUByte DTL; /* data length */
|
||
} RdvCommand, *RdvCommandPtr;
|
||
|
||
typedef struct S_ReadIdCmd {
|
||
dUByte command; /* command byte */
|
||
dUByte drive; /* drive specifier */
|
||
} ReadIdCmd;
|
||
|
||
typedef struct S_FormatCmd {
|
||
dUByte command; /* command byte */
|
||
dUByte drive; /* drive specifier */
|
||
dUByte N; /* number of bytes per sector */
|
||
dUByte SC; /* sectors per track (segment) */
|
||
dUByte GPL; /* gap length */
|
||
dUByte D; /* format filler byte */
|
||
} FormatCmd, *FormatCmdPtr;
|
||
|
||
typedef struct S_SnsIntCmd {
|
||
dUByte command; /* command byte */
|
||
} SnsIntCmd;
|
||
|
||
typedef struct S_VersionCmd {
|
||
dUByte command; /* command byte */
|
||
} VersionCmd;
|
||
|
||
typedef struct S_NationalCmd {
|
||
dUByte command; /* command byte */
|
||
} NationalCmd;
|
||
|
||
typedef struct S_SpecifyCmd {
|
||
dUByte command; /* command byte */
|
||
dUByte SRT_HUT; /* step rate time (bits 7-4) */
|
||
/* head unload time bits (3-0) */
|
||
dUByte HLT_ND; /* head load time (bits 7-1) */
|
||
/* non-DMA mode flag (bit 0) */
|
||
} SpecifyCmd;
|
||
|
||
typedef struct S_SnsStatCmd {
|
||
dUByte command; /* command byte */
|
||
dUByte drive; /* drive specifier */
|
||
} SnsStatCmd;
|
||
|
||
typedef struct S_RecalibrateCmd {
|
||
dUByte command; /* command byte */
|
||
dUByte drive; /* drive specifier */
|
||
} RecalibrateCmd;
|
||
|
||
typedef struct S_SeekCmd {
|
||
dUByte cmd; /* command byte */
|
||
dUByte drive; /* drive specifier */
|
||
dUByte NCN; /* new cylinder number */
|
||
} SeekCmd;
|
||
|
||
typedef struct S_ConfigCmd {
|
||
dUByte cmd; /* command byte */
|
||
dUByte czero; /* null byte */
|
||
dUByte config; /* FDC configuration info (EIS EFIFO POLL FIFOTHR) */
|
||
dUByte pretrack; /* Pre-compensation start track number */
|
||
} ConfigCmd;
|
||
|
||
typedef struct S_InvalidCmd {
|
||
dUByte command; /* command byte */
|
||
} InvalidCmd;
|
||
|
||
typedef struct S_FDCStatus {
|
||
dUByte ST0; /* status register 0 */
|
||
dUByte ST1; /* status register 1 */
|
||
dUByte ST2; /* status register 2 */
|
||
dUByte C; /* cylinder number */
|
||
dUByte H; /* head address */
|
||
dUByte R; /* record (sector number) */
|
||
dUByte N; /* number of bytes per sector */
|
||
} FDCStatus, *FDCStatusPtr;
|
||
|
||
|
||
typedef struct S_FDCResult {
|
||
dUByte ST0; /* status register 0 */
|
||
dUByte PCN; /* present cylinder number */
|
||
} FDCResult;
|
||
|
||
|
||
/* FDC Sector Header Data used for formatting */
|
||
|
||
|
||
typedef union U_FormatHeader {
|
||
struct {
|
||
dUByte C; /* cylinder number */
|
||
dUByte H; /* head address */
|
||
dUByte R; /* record (sector number) */
|
||
dUByte N; /* bytes per sector */
|
||
} hdr_struct;
|
||
dUDWord hdr_all;
|
||
} FormatHeader, *FormatHeaderPtr;
|
||
|
||
/* This command is only valid on the 82078 Enhanced controller */
|
||
|
||
typedef struct S_PartIdCmd {
|
||
dUByte command;
|
||
} PartIdCmd;
|
||
|
||
typedef struct S_PerpMode {
|
||
dUByte command;
|
||
dUByte perp_setup;
|
||
} PerpMode;
|
||
|
||
|
||
/* This command is only valid on the 82078 64 pin Enhanced controller */
|
||
|
||
typedef struct S_DriveSpec {
|
||
dUByte command;
|
||
dUByte drive_spec;
|
||
dUByte done;
|
||
} DriveSpec;
|
||
|
||
typedef struct S_SaveCmd {
|
||
dUByte command;
|
||
} SaveCmd;
|
||
|
||
typedef struct S_SaveResult {
|
||
dUByte clk48;
|
||
dUByte reserved2;
|
||
dUByte reserved3;
|
||
dUByte reserved4;
|
||
dUByte reserved5;
|
||
dUByte reserved6;
|
||
dUByte reserved7;
|
||
dUByte reserved8;
|
||
dUByte reserved9;
|
||
dUByte reserved10;
|
||
dUByte reserved11;
|
||
dUByte reserved12;
|
||
dUByte reserved13;
|
||
dUByte reserved14;
|
||
dUByte reserved15;
|
||
dUByte reserved16;
|
||
} SaveResult;
|
||
|
||
#pragma pack()
|
||
|
||
|
||
/* Tape Drive Parameters */
|
||
|
||
|
||
typedef struct S_DriveParameters {
|
||
dUByte seek_mode; /* seek mode supported by the drive */
|
||
dSByte mode; /* drive mode (Primary, Format, Verify) */
|
||
dUWord conner_native_mode; /* Conner Native Mode Data */
|
||
} DriveParameters, *DriveParametersPtr;
|
||
|
||
|
||
/* Tape Parameters */
|
||
|
||
|
||
typedef struct S_FloppyTapeParameters {
|
||
dUWord fsect_seg; /* floppy sectors per segment */
|
||
dUWord seg_ftrack; /* segments per floppy track */
|
||
dUWord fsect_ftrack; /* floppy sectors per floppy track */
|
||
dUWord rw_gap_length; /* write gap length */
|
||
dUWord ftrack_fside; /* floppy tracks per floppy side */
|
||
dUDWord fsect_fside; /* floppy sectors per floppy side */
|
||
dUDWord log_sectors; /* number of logical sectors on a tape */
|
||
dUDWord fsect_ttrack; /* floppy sectors per tape track */
|
||
dUByte tape_rates; /* supported tape transfer rates */
|
||
dUByte tape_type; /* tape type */
|
||
TapeFormatLgth tape_status;
|
||
dUDWord time_out[3]; /* time_out for the QIC-117 commands */
|
||
/* time_out[0] = logical_slow, time_out[1] = logical_fast, */
|
||
/* time[2] = physical. */
|
||
} FloppyTapeParameters, *FloppyTapeParametersPtr;
|
||
|
||
|
||
/* Transfer Rate Parameters */
|
||
|
||
typedef struct S_TransferRate {
|
||
dUByte tape; /* Program tape drive slow (250 or 500 Kbps) */
|
||
dUByte fdc; /* Program FDC slow (250 or 500 Kbps) */
|
||
dUByte srt; /* FDC step rate for slow xfer rate */
|
||
} TransferRate, *TransferRatePtr;
|
||
|
||
struct S_FormatParameters {
|
||
dUByte cylinder; /* floppy cylinder number */
|
||
dUByte head; /* floppy head number */
|
||
dUByte sector; /* floppy sector number */
|
||
dUByte NCN; /* new cylinder number */
|
||
dUDWord *hdr_ptr[2]; /* pointer to sector id data for format */
|
||
dUDWord hdr_offset[2]; /* offset of header_ptr */
|
||
dUDWord *phy_ptr; /* pointer to physical sector id data for format */
|
||
dUWord current_hdr; /* current format hdr */
|
||
dUWord next_hdr; /* next format hdr */
|
||
dStatus retval; /* Format status */
|
||
};
|
||
|
||
typedef struct S_FormatParameters FormatParameters;
|
||
|
||
|
||
|
||
/* Floppy register structure. The base address of the controller is */
|
||
/* passed in by configuration management. Note that this is the 82077 */
|
||
/* structure, which is a superset of the PD765 structure. Not all of */
|
||
/* the registers are used. */
|
||
|
||
typedef struct S_FDCAddress {
|
||
dUDWord dcr;
|
||
dUDWord dr;
|
||
dUDWord msr;
|
||
dUDWord dsr;
|
||
dUDWord tdr;
|
||
dUDWord dor;
|
||
dUDWord r_dor;
|
||
dBoolean dual_port;
|
||
} FDCAddress, *FDCAddressPtr;
|
||
|
||
|
||
typedef struct S_FDControllerData {
|
||
FDCAddress fdc_addr;
|
||
FormatCmd fmt_cmd;
|
||
FDCStatus fdc_stat;
|
||
dUWord isr_reentered;
|
||
dBoolean command_has_result_phase;
|
||
dBoolean unloading_driver;
|
||
dUByte number_of_tape_drives;
|
||
dUByte fdc_pcn;
|
||
dUByte fifo_byte;
|
||
dBoolean perpendicular_mode;
|
||
dBoolean start_format_mode;
|
||
dBoolean end_format_mode;
|
||
} FDControllerData, *FDControllerDataPtr;
|
||
|
||
typedef struct S_TapeOperationStatus {
|
||
dUDWord bytes_transferred_so_far;
|
||
dUDWord total_bytes_of_transfer;
|
||
dUDWord cur_lst;
|
||
dUWord data_amount;
|
||
dUWord s_count;
|
||
dUWord no_data;
|
||
dUWord d_amt;
|
||
dUWord retry_count;
|
||
dUWord retry_times;
|
||
dUDWord d_segment; /* desired tape segment, (floppy track) */
|
||
dUWord d_track; /* desired physical tape track */
|
||
dUByte d_ftk;
|
||
dUByte d_sect;
|
||
dUByte d_head;
|
||
dUByte retry_sector_id;
|
||
dUByte seek_flag;
|
||
dUByte s_sect;
|
||
dBoolean log_fwd; /* indicates that the tape is going logical forward */
|
||
dBoolean bot;
|
||
dBoolean eot;
|
||
} TapeOperationStatus, *TapeOperationStatusPtr;
|
||
|
||
|
||
typedef struct S_CqdContext {
|
||
DeviceCfg device_cfg;
|
||
DeviceDescriptor device_descriptor;
|
||
OperationStatus operation_status;
|
||
DriveParameters drive_parms;
|
||
TransferRate xfer_rate;
|
||
FloppyTapeParameters floppy_tape_parms;
|
||
CQDTapeCfg tape_cfg;
|
||
TapeOperationStatus rd_wr_op;
|
||
FormatParameters fmt_op;
|
||
FDControllerData controller_data;
|
||
dVoidPtr kdi_context;
|
||
dUWord retry_seq_num;
|
||
dUByte firmware_cmd;
|
||
dUByte firmware_error;
|
||
dUByte firmware_version;
|
||
dUByte drive_type;
|
||
dUByte device_unit;
|
||
dUByte drive_on_value;
|
||
dBoolean configured;
|
||
dBoolean selected;
|
||
dBoolean cmd_selected;
|
||
dBoolean no_pause;
|
||
dBoolean cms_mode;
|
||
dBoolean persistent_new_cart;
|
||
dBoolean pegasus_supported;
|
||
dBoolean trakker;
|
||
#if DBG
|
||
#define DBG_SIZE 4096
|
||
dUDWord dbg_command[DBG_SIZE];
|
||
dSWord dbg_head;
|
||
dSWord dbg_tail;
|
||
dBoolean dbg_lockout;
|
||
#define DBG_ADD_ENTRY(dbg_level, dbg_context, data) \
|
||
if (((dbg_level) & kdi_debug_level) != 0) { \
|
||
(dbg_context)->dbg_command[(dbg_context)->dbg_tail] = (data); \
|
||
\
|
||
if (!(dbg_context)->dbg_lockout) \
|
||
++(dbg_context)->dbg_tail; \
|
||
\
|
||
if ((dbg_context)->dbg_tail >= DBG_SIZE) { \
|
||
(dbg_context)->dbg_tail = 0; \
|
||
} \
|
||
}
|
||
|
||
|
||
#else
|
||
#define DBG_ADD_ENTRY(dbg_level, dbg_context, data)
|
||
#endif
|
||
|
||
} CqdContext, *CqdContextPtr;
|
||
|