2025-04-27 07:49:33 -04:00

4761 lines
161 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*****************************************************************************
*
* COPYRIGHT 1993 - COLORADO MEMORY SYSTEMS, INC.
* COPYRIGHT 1996, 1997 - COLORADO SOFTWARE ARCHITECTS, INC.
* ALL RIGHTS RESERVED.
*
******************************************************************************
*
* PURPOSE: This file contains all of the API's necessary to access
* the ADI interface.
*
* HISTORY:
* $Log: /ddk/src/nt50/storage/fdc/qic117/q117_dat.h $
*
* 3 11/15/97 3:06p John Moore
* Added NTMS support.
*
* 2 11/10/97 9:28a John Moore
* Update PnP.
*
* 1 11/01/97 11:30a John Moore
*
*****************************************************************************/
#include "ntddk.h" /* various NT definitions */
#include "ntdddisk.h" /* disk device driver I/O control codes */
NTSTATUS
q117Initialize(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT q117iDeviceObject,
IN PUNICODE_STRING RegistryPath
);
NTSTATUS
q117Unload(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
q117Read(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117Write(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117DeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117Create (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117Close (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
/* QIC117 device specific ioctls. *********************************************/
#define IOCTL_QIC117_BASE FILE_DEVICE_TAPE
#define IOCTL_QIC117_DRIVE_REQUEST CTL_CODE(IOCTL_QIC117_BASE, 0x0001, METHOD_NEITHER, FILE_ANY_ACCESS)
#define IOCTL_QIC117_CLEAR_QUEUE CTL_CODE(IOCTL_QIC117_BASE, 0x0002, METHOD_NEITHER, FILE_ANY_ACCESS)
/* ADI PUBLIC DATA STRUCTURES ***********************************************/
#pragma pack(4)
struct S_ADIRequestHdr {
NTSTATUS status; /* O: Status returned from device */
VOID (*callback_ptr)(dUDWord, dUDWord, dUWord, dStatus);
ULONG callback_host_id; /* I: (Optional) Add'l routing info for host */
PVOID cmd_buffer_ptr; /* I: Logical buffer pointer passed to ADI */
PVOID drv_physical_ptr; /* X: KDI physical pointer - internal use */
PVOID drv_logical_ptr; /* X: Common driver logical pointer - internal use */
USHORT driver_cmd; /* I: Device driver specific command */
USHORT drive_handle; /* I: Host generated device identifier */
BOOLEAN blocking_call; /* I: TRUE implies block until completion */
};
typedef struct S_ADIRequestHdr ADIRequestHdr, *ADIRequestHdrPtr;
#pragma pack()
/* ERROR CODES: *************************************************************/
#define GROUPID_CQD (UCHAR)0x11 /* GG = 11, CQD Common QIC117 Device Driver */
#define GROUPID_CSD (UCHAR)0x12 /* GG = 12, CSD Common SCSI Device Driver */
#define GROUPID_ADI (UCHAR)0x15 /* GG = 15, Application Driver Interface */
#define ERR_NO_ERR (NTSTATUS)0
#define ERR_SHIFT (UCHAR)8
#define ERR_SEQ_1 (UCHAR)0x01
#define ERR_SEQ_2 (UCHAR)0x02
#define ERR_SEQ_3 (UCHAR)0x03
#define ERR_SEQ_4 (UCHAR)0x04
#define ERR_SEQ_5 (UCHAR)0x05
#define ERR_SEQ_6 (UCHAR)0x06
/* ERROR ENCODE MACRO: **************************************************/
#define ERROR_ENCODE(m_error, m_fct, m_seq) \
(((m_fct & 0x00000fff) << 4) | m_seq) | ((unsigned long)m_error << 16)
/* RAW FIRMWARE ERROR CODES: *************** Hex **** Decimal ***********/
#define FW_NO_COMMAND (UCHAR)0x0000 /* 0 */
#define FW_NO_ERROR (UCHAR)0x0000 /* 0 */
#define FW_DRIVE_NOT_READY (UCHAR)0x0001 /* 1 */
#define FW_CART_NOT_IN (UCHAR)0x0002 /* 2 */
#define FW_MOTOR_SPEED_ERROR (UCHAR)0x0003 /* 3 */
#define FW_STALL_ERROR (UCHAR)0x0004 /* 4 */
#define FW_WRITE_PROTECTED (UCHAR)0x0005 /* 5 */
#define FW_UNDEFINED_COMMAND (UCHAR)0x0006 /* 6 */
#define FW_ILLEGAL_TRACK (UCHAR)0x0007 /* 7 */
#define FW_ILLEGAL_CMD (UCHAR)0x0008 /* 8 */
#define FW_ILLEGAL_ENTRY (UCHAR)0x0009 /* 9 */
#define FW_BROKEN_TAPE (UCHAR)0x000a /* 10 */
#define FW_GAIN_ERROR (UCHAR)0x000b /* 11 */
#define FW_CMD_WHILE_ERROR (UCHAR)0x000c /* 12 */
#define FW_CMD_WHILE_NEW_CART (UCHAR)0x000d /* 13 */
#define FW_CMD_UNDEF_IN_PRIME (UCHAR)0x000e /* 14 */
#define FW_CMD_UNDEF_IN_FMT (UCHAR)0x000f /* 15 */
#define FW_CMD_UNDEF_IN_VERIFY (UCHAR)0x0010 /* 16 */
#define FW_FWD_NOT_BOT_IN_FMT (UCHAR)0x0011 /* 17 */
#define FW_EOT_BEFORE_ALL_SEGS (UCHAR)0x0012 /* 18 */
#define FW_CART_NOT_REFERENCED (UCHAR)0x0013 /* 19 */
#define FW_SELF_DIAGS_FAILED (UCHAR)0x0014 /* 20 */
#define FW_EEPROM_NOT_INIT (UCHAR)0x0015 /* 21 */
#define FW_EEPROM_CORRUPTED (UCHAR)0x0016 /* 22 */
#define FW_TAPE_MOTION_TIMEOUT (UCHAR)0x0017 /* 23 */
#define FW_DATA_SEG_TOO_LONG (UCHAR)0x0018 /* 24 */
#define FW_CMD_OVERRUN (UCHAR)0x0019 /* 25 */
#define FW_PWR_ON_RESET (UCHAR)0x001a /* 26 */
#define FW_SOFTWARE_RESET (UCHAR)0x001b /* 27 */
#define FW_DIAG_MODE_1_ERROR (UCHAR)0x001c /* 28 */
#define FW_DIAG_MODE_2_ERROR (UCHAR)0x001d /* 29 */
#define FW_CMD_REC_DURING_CMD (UCHAR)0x001e /* 30 */
#define FW_SPEED_NOT_AVAILABLE (UCHAR)0x001f /* 31 */
#define FW_ILLEGAL_CMD_HIGH_SPEED (UCHAR)0x0020 /* 32 */
#define FW_ILLEGAL_SEEK_SEGMENT (UCHAR)0x0021 /* 33 */
#define FW_INVALID_MEDIA (UCHAR)0x0022 /* 34 */
#define FW_HEADREF_FAIL_ERROR (UCHAR)0x0023 /* 35 */
#define FW_EDGE_SEEK_ERROR (UCHAR)0x0024 /* 36 */
#define FW_MISSING_TRAINING_TABLE (UCHAR)0x0025 /* 37 */
#define FW_INVALID_FORMAT (UCHAR)0x0026 /* 38 */
#define FW_SENSOR_ERROR (UCHAR)0x0027 /* 39 */
#define FW_TABLE_CHECKSUM_ERROR (UCHAR)0x0028 /* 40 */
#define FW_WATCHDOG_RESET (UCHAR)0x0029 /* 41 */
#define FW_ILLEGAL_ENTRY_FMT_MODE (UCHAR)0x002a /* 42 */
#define FW_ROM_CHECKSUM_FAILURE (UCHAR)0x002b /* 43 */
#define FW_ILLEGAL_ERROR_NUMBER (UCHAR)0x002c /* 44 */
#define FW_NO_DRIVE (UCHAR)0x00ff /*255 */
/* DRIVER FIRMWARE ERROR CODES: ******* Range: 0x1100 - 0x112a & 0x11ff *****/
#define ERR_CQD (USHORT)(GROUPID_CQD<<ERR_SHIFT)
#define ERR_FW_NO_COMMAND (USHORT)(ERR_CQD + FW_NO_COMMAND)
#define ERR_FW_NO_ERROR (USHORT)(ERR_CQD + FW_NO_ERROR)
#define ERR_FW_DRIVE_NOT_READY (USHORT)(ERR_CQD + FW_DRIVE_NOT_READY)
#define ERR_FW_CART_NOT_IN (USHORT)(ERR_CQD + FW_CART_NOT_IN)
#define ERR_FW_MOTOR_SPEED_ERROR (USHORT)(ERR_CQD + FW_MOTOR_SPEED_ERROR)
#define ERR_FW_STALL_ERROR (USHORT)(ERR_CQD + FW_STALL_ERROR)
#define ERR_FW_WRITE_PROTECTED (USHORT)(ERR_CQD + FW_WRITE_PROTECTED)
#define ERR_FW_UNDEFINED_COMMAND (USHORT)(ERR_CQD + FW_UNDEFINED_COMMAND)
#define ERR_FW_ILLEGAL_TRACK (USHORT)(ERR_CQD + FW_ILLEGAL_TRACK)
#define ERR_FW_ILLEGAL_CMD (USHORT)(ERR_CQD + FW_ILLEGAL_CMD)
#define ERR_FW_ILLEGAL_ENTRY (USHORT)(ERR_CQD + FW_ILLEGAL_ENTRY)
#define ERR_FW_BROKEN_TAPE (USHORT)(ERR_CQD + FW_BROKEN_TAPE)
#define ERR_FW_GAIN_ERROR (USHORT)(ERR_CQD + FW_GAIN_ERROR)
#define ERR_FW_CMD_WHILE_ERROR (USHORT)(ERR_CQD + FW_CMD_WHILE_ERROR)
#define ERR_FW_CMD_WHILE_NEW_CART (USHORT)(ERR_CQD + FW_CMD_WHILE_NEW_CART)
#define ERR_FW_CMD_UNDEF_IN_PRIME (USHORT)(ERR_CQD + FW_CMD_UNDEF_IN_PRIME)
#define ERR_FW_CMD_UNDEF_IN_FMT (USHORT)(ERR_CQD + FW_CMD_UNDEF_IN_FMT)
#define ERR_FW_CMD_UNDEF_IN_VERIFY (USHORT)(ERR_CQD + FW_CMD_UNDEF_IN_VERIFY)
#define ERR_FW_FWD_NOT_BOT_IN_FMT (USHORT)(ERR_CQD + FW_FWD_NOT_BOT_IN_FMT)
#define ERR_FW_EOT_BEFORE_ALL_SEGS (USHORT)(ERR_CQD + FW_EOT_BEFORE_ALL_SEGS)
#define ERR_FW_CART_NOT_REFERENCED (USHORT)(ERR_CQD + FW_CART_NOT_REFERENCED)
#define ERR_FW_SELF_DIAGS_FAILED (USHORT)(ERR_CQD + FW_SELF_DIAGS_FAILED)
#define ERR_FW_EEPROM_NOT_INIT (USHORT)(ERR_CQD + FW_EEPROM_NOT_INIT)
#define ERR_FW_EEPROM_CORRUPTED (USHORT)(ERR_CQD + FW_EEPROM_CORRUPTED)
#define ERR_FW_TAPE_MOTION_TIMEOUT (USHORT)(ERR_CQD + FW_TAPE_MOTION_TIMEOUT)
#define ERR_FW_DATA_SEG_TOO_LONG (USHORT)(ERR_CQD + FW_DATA_SEG_TOO_LONG)
#define ERR_FW_CMD_OVERRUN (USHORT)(ERR_CQD + FW_CMD_OVERRUN)
#define ERR_FW_PWR_ON_RESET (USHORT)(ERR_CQD + FW_PWR_ON_RESET)
#define ERR_FW_SOFTWARE_RESET (USHORT)(ERR_CQD + FW_SOFTWARE_RESET)
#define ERR_FW_DIAG_MODE_1_ERROR (USHORT)(ERR_CQD + FW_DIAG_MODE_1_ERROR)
#define ERR_FW_DIAG_MODE_2_ERROR (USHORT)(ERR_CQD + FW_DIAG_MODE_2_ERROR)
#define ERR_FW_CMD_REC_DURING_CMD (USHORT)(ERR_CQD + FW_CMD_REC_DURING_CMD)
#define ERR_FW_SPEED_NOT_AVAILABLE (USHORT)(ERR_CQD + FW_SPEED_NOT_AVAILABLE)
#define ERR_FW_ILLEGAL_CMD_HIGH_SPEED (USHORT)(ERR_CQD + FW_ILLEGAL_CMD_HIGH_SPEED)
#define ERR_FW_ILLEGAL_SEEK_SEGMENT (USHORT)(ERR_CQD + FW_ILLEGAL_SEEK_SEGMENT)
#define ERR_FW_INVALID_MEDIA (USHORT)(ERR_CQD + FW_INVALID_MEDIA)
#define ERR_FW_HEADREF_FAIL_ERROR (USHORT)(ERR_CQD + FW_HEADREF_FAIL_ERROR)
#define ERR_FW_EDGE_SEEK_ERROR (USHORT)(ERR_CQD + FW_EDGE_SEEK_ERROR)
#define ERR_FW_MISSING_TRAINING_TABLE (USHORT)(ERR_CQD + FW_MISSING_TRAINING_TABLE)
#define ERR_FW_INVALID_FORMAT (USHORT)(ERR_CQD + FW_INVALID_FORMAT)
#define ERR_FW_SENSOR_ERROR (USHORT)(ERR_CQD + FW_SENSOR_ERROR)
#define ERR_FW_TABLE_CHECKSUM_ERROR (USHORT)(ERR_CQD + FW_TABLE_CHECKSUM_ERROR)
#define ERR_FW_WATCHDOG_RESET (USHORT)(ERR_CQD + FW_WATCHDOG_RESET)
#define ERR_FW_ILLEGAL_ENTRY_FMT_MODE (USHORT)(ERR_CQD + FW_ILLEGAL_ENTRY_FMT_MODE)
#define ERR_FW_ROM_CHECKSUM_FAILURE (USHORT)(ERR_CQD + FW_ROM_CHECKSUM_FAILURE)
#define ERR_FW_ILLEGAL_ERROR_NUMBER (USHORT)(ERR_CQD + FW_ILLEGAL_ERROR_NUMBER)
#define ERR_FW_NO_DRIVE (USHORT)(ERR_CQD + FW_NO_DRIVE)
/* JUMBO DRIVER ERROR CODES: ********** Range: 0x1150 - 0x116f **************/
#define ERR_ABORT (USHORT)(ERR_CQD + 0x0050)
#define ERR_BAD_BLOCK_FDC_FAULT (USHORT)(ERR_CQD + 0x0051)
#define ERR_BAD_BLOCK_HARD_ERR (USHORT)(ERR_CQD + 0x0052)
#define ERR_BAD_BLOCK_NO_DATA (USHORT)(ERR_CQD + 0x0053)
#define ERR_BAD_FORMAT (USHORT)(ERR_CQD + 0x0054)
#define ERR_BAD_MARK_DETECTED (USHORT)(ERR_CQD + 0x0055)
#define ERR_BAD_REQUEST (USHORT)(ERR_CQD + 0x0056)
#define ERR_CMD_FAULT (USHORT)(ERR_CQD + 0x0057)
#define ERR_CMD_OVERRUN (USHORT)(ERR_CQD + 0x0058)
#define ERR_DEVICE_NOT_CONFIGURED (USHORT)(ERR_CQD + 0x0059)
#define ERR_DEVICE_NOT_SELECTED (USHORT)(ERR_CQD + 0x005a)
#define ERR_DRIVE_FAULT (USHORT)(ERR_CQD + 0x005b)
#define ERR_DRV_NOT_READY (USHORT)(ERR_CQD + 0x005c)
#define ERR_FDC_FAULT (USHORT)(ERR_CQD + 0x005d)
#define ERR_FMT_MOTION_TIMEOUT (USHORT)(ERR_CQD + 0x005e)
#define ERR_FORMAT_TIMED_OUT (USHORT)(ERR_CQD + 0x005f)
#define ERR_INCOMPATIBLE_MEDIA (USHORT)(ERR_CQD + 0x0060)
#define ERR_INCOMPATIBLE_PARTIAL_FMT (USHORT)(ERR_CQD + 0x0061)
#define ERR_INVALID_COMMAND (USHORT)(ERR_CQD + 0x0062)
#define ERR_INVALID_FDC_STATUS (USHORT)(ERR_CQD + 0x0063)
#define ERR_NEW_TAPE (USHORT)(ERR_CQD + 0x0064)
#define ERR_NO_DRIVE (USHORT)(ERR_CQD + 0x0065)
#define ERR_NO_FDC (USHORT)(ERR_CQD + 0x0066)
#define ERR_NO_TAPE (USHORT)(ERR_CQD + 0x0067)
#define ERR_SEEK_FAILED (USHORT)(ERR_CQD + 0x0068)
#define ERR_SPEED_UNAVAILBLE (USHORT)(ERR_CQD + 0x0069)
#define ERR_TAPE_STOPPED (USHORT)(ERR_CQD + 0x006a)
#define ERR_UNKNOWN_TAPE_FORMAT (USHORT)(ERR_CQD + 0x006b)
#define ERR_UNKNOWN_TAPE_LENGTH (USHORT)(ERR_CQD + 0x006c)
#define ERR_UNSUPPORTED_FORMAT (USHORT)(ERR_CQD + 0x006d)
#define ERR_UNSUPPORTED_RATE (USHORT)(ERR_CQD + 0x006e)
#define ERR_WRITE_BURST_FAILURE (USHORT)(ERR_CQD + 0x006f)
#define ERR_MODE_CHANGE_FAILED (USHORT)(ERR_CQD + 0x0070)
#define ERR_CONTROLLER_STATE_ERROR (USHORT)(ERR_CQD + 0x0071)
#define ERR_TAPE_FAULT (USHORT)(ERR_CQD + 0x0072)
#define ERR_FORMAT_NOT_SUPPORTED (USHORT)(ERR_CQD + 0x0073)
/* ADI ERROR CODES: **************** Range: 0x1500 - 0x157F *******************/
#define ERR_ADI (USHORT)(GROUPID_ADI<<ERR_SHIFT)
#define ERR_NO_VXD (USHORT)(ERR_ADI + 0x0000)
#define ERR_QUEUE_FULL (USHORT)(ERR_ADI + 0x0001)
#define ERR_REQS_PENDING (USHORT)(ERR_ADI + 0x0002)
#define ERR_OUT_OF_MEMORY (USHORT)(ERR_ADI + 0x0003)
#define ERR_ALREADY_CLOSED (USHORT)(ERR_ADI + 0x0004)
#define ERR_OUT_OF_HANDLES (USHORT)(ERR_ADI + 0x0005)
#define ERR_ABORTED_COMMAND (USHORT)(ERR_ADI + 0x0006)
#define ERR_NOT_INITIALIZED (USHORT)(ERR_ADI + 0x0007)
#define ERR_NO_REQS_PENDING (USHORT)(ERR_ADI + 0x0008)
#define ERR_CHANNEL_NOT_OPEN (USHORT)(ERR_ADI + 0x0009)
#define ERR_NO_HOST_ADAPTER (USHORT)(ERR_ADI + 0x000a)
#define ERR_CMD_IN_PROGRESS (USHORT)(ERR_ADI + 0x000b)
#define ERR_IGNORE_ECC (USHORT)(ERR_ADI + 0x000c)
#define ERR_INVALID_VXD (USHORT)(ERR_ADI + 0x0010)
#define ERR_INVALID_CMD (USHORT)(ERR_ADI + 0x0011)
#define ERR_INVALID_CMD_ID (USHORT)(ERR_ADI + 0x0012)
#define ERR_INVALID_HANDLE (USHORT)(ERR_ADI + 0x0013)
#define ERR_INVALID_DEVICE_CLASS (USHORT)(ERR_ADI + 0x0014)
#define ERR_NO_ASPI_VXD (USHORT)(ERR_ADI + 0x0020)
#define ERR_INVALID_ASPI_VXD (USHORT)(ERR_ADI + 0x0021)
#define ERR_END_OF_TAPE (USHORT)(ERR_ADI + 0x0060)
#define ERR_TAPE_FULL (USHORT)(ERR_ADI + 0x0061)
#define ERR_TAPE_READ_FAILED (USHORT)(ERR_ADI + 0x0062)
#define ERR_TAPE_WRITE_FAILED (USHORT)(ERR_ADI + 0x0063)
#define ERR_TAPE_SEEK_FAILED (USHORT)(ERR_ADI + 0x0064)
#define ERR_TAPE_INFO_FAILED (USHORT)(ERR_ADI + 0x0065)
#define ERR_TAPE_WRITE_PROTECT (USHORT)(ERR_ADI + 0x0066)
#define ERR_INTERNAL_ERROR (USHORT)(ERR_ADI + 0x007f)
/* KDI ERROR CODES: **************** Range: 0x1580 - 0x15FF *******************/
#define ERR_HANDLE_EXISTS (USHORT)(ERR_ADI + 0x0080)
#define ERR_KDI_NOT_OPEN (USHORT)(ERR_ADI + 0x0081)
#define ERR_OUT_OF_BUFFERS (USHORT)(ERR_ADI + 0x0082)
#define ERR_INT13_HOOK_FAILED (USHORT)(ERR_ADI + 0x0083)
#define ERR_IO_VIRTUALIZE_FAILED (USHORT)(ERR_ADI + 0x0084)
#define ERR_INVALID_ADDRESS (USHORT)(ERR_ADI + 0x0085)
#define ERR_JUMPERLESS_CFG_FAILED (USHORT)(ERR_ADI + 0x0086)
#define ERR_TRK_NO_MEMORY (USHORT)(ERR_ADI + 0x0090)
#define ERR_TRK_MEM_TEST_FAILED (USHORT)(ERR_ADI + 0x0091)
#define ERR_TRK_MODE_NOT_SET (USHORT)(ERR_ADI + 0x0092)
#define ERR_TRK_MODE_SET_FAILED (USHORT)(ERR_ADI + 0x0093)
#define ERR_TRK_FIFO_FAILED (USHORT)(ERR_ADI + 0x0094)
#define ERR_TRK_DELAY_NOT_SET (USHORT)(ERR_ADI + 0x0095)
#define ERR_TRK_BAD_DATA_XFER (USHORT)(ERR_ADI + 0x0096)
#define ERR_TRK_BAD_CTRL_XFER (USHORT)(ERR_ADI + 0x0097)
#define ERR_TRK_TEST_WAKE_FAIL (USHORT)(ERR_ADI + 0x0098)
#define ERR_TRK_AUTO_CFG_FAIL (USHORT)(ERR_ADI + 0x0099)
#define ERR_TRK_CFG_NEEDS_UPDATE (USHORT)(ERR_ADI + 0x009A)
#define ERR_TRK_NO_IRQ_AVAIL (USHORT)(ERR_ADI + 0x009B)
#define ERR_DMA_CONFLICT (USHORT)(ERR_ADI + 0x009C)
#define ERR_DMA_BUFFER_NOT_AVAIL (USHORT)(ERR_ADI + 0x009D)
#define ERR_KDI_TO_EXPIRED (USHORT)(ERR_ADI + 0x00A0)
#define ERR_KDI_CONTROLLER_BUSY (USHORT)(ERR_ADI + 0x00A1)
#define ERR_KDI_CLAIMED_CONTROLLER (USHORT)(ERR_ADI + 0x00A2)
#define ERR_KDI_NO_VFBACKUP (USHORT)(ERR_ADI + 0x00A3)
#define ERR_LAST_KDI_ERROR (USHORT)(ERR_ADI + 0x00ff)
/* KDI ENTRY POINT DEFINES: *************************************************/
#define KDI_GET_VERSION (USHORT)0x0000
#define KDI_OPEN_DRIVER (USHORT)0x0101
#define KDI_CLOSE_DRIVER (USHORT)0x0102
#define KDI_SEND_DRIVER_CMD (USHORT)0x0103
#define KDI_GET_ASYNC_STATUS (USHORT)0x0104
#define KDI_DEBUG_OUTPUT (USHORT)0x0105
#define KDI_COPY_BUFFER (USHORT)0x0106
/* Trakker specific entry points */
#define KDI_CHECKXOR (USHORT)0x0201
#define KDI_FLUSHFIFOX (USHORT)0x0202
#define KDI_POPMASKTRAKKERINT (USHORT)0x0203
#define KDI_PUSHMASKTRAKKERINT (USHORT)0x0204
#define KDI_READREG (USHORT)0x0205
#define KDI_RECEIVEDATA (USHORT)0x0206
#define KDI_SENDDATA (USHORT)0x0207
#define KDI_SETFIFOXADDRESS (USHORT)0x0208
#define KDI_SWITCHTODATA (USHORT)0x0209
#define KDI_TRAKKERXFER (USHORT)0x020A
#define KDI_WRITEREG (USHORT)0x020B
#define KDI_FINDIRQ (USHORT)0x020C
#define KDI_CREATE_TRAKKER_CONTEXT (USHORT)0x020D
/*--------------------------------------------------
* This define is needed until the cbw.2 codebase
* goes away
*--------------------------------------------------*/
#define KDI_CONFIG_TRAKKER KDI_CREATE_TRAKKER_CONTEXT
#define KDI_CONFIGURE_TRAKKER (USHORT)0x020E
#define KDI_TRISTATE (USHORT)0x020F
#define KDI_AGRESSIVE_FINDIRQ (USHORT)0x0210
#define KDI_LOCATE_JUMPERLESS (USHORT)0x0211
#define KDI_ACTIVATE_JUMPERLESS (USHORT)0x0212
/* Miscellaneous functions */
#define KDI_PROGRAM_DMA (USHORT)0x0301
#define KDI_HALT_DMA (USHORT)0x0302
#define KDI_SHORT_TIMER (USHORT)0x0303
#define KDI_GET_DMA_BUFFER (USHORT)0x0304
#define KDI_FREE_DMA_BUFFER (USHORT)0x0305
#define KDI_GET_VALID_INTERRUPTS (USHORT)0x0306
/* KDI DEFINES: *************************************************************/
/* KDI_CLOSE_DRIVER parameter options */
#define KDI_ABORT_CLOSE (USHORT)0x1
#define KDI_NORMAL_CLOSE (USHORT)0x2
/*****************************************************************************
*
* FILE: microsol.h
*
* PURPOSE: This file contains all of the defines necessary to access
* the microsolutions API's
*
*****************************************************************************/
#ifndef _MICROSOL_H_
#define _MICROSOL_H_
#define msiWord unsigned short
#define msiDWord unsigned long
#define msiByte unsigned char
#pragma warning(disable:4001) //who says double slash is not nice
typedef struct S_MsiPPC {
// API portion of structure
msiWord
flag_word,
lpt_addr,
lpt_type,
fdc_type,
fdc_loops,
chip_type,
chip_mode,
irq_level,
max_secs,
rx_mode,
tx_mode,
rx_margin,
tx_margin,
tx_to_rx,
rx_factor,
tx_factor,
reserved[64];
} MsiPPC;
typedef struct S_MicroSol {
MsiPPC ppc_channel; /* MicroSolutions IO structure */
msiWord lpt_number; /* (I/O) parallel port number */
msiWord open_flags; /* flags to use on open call */
} MicroSol;
//
// Control Flags
//
#define MSI_NO_EEPROM 0x0001
#define MSI_NO_BIDIR 0x0002
#define MSI_NO_FWRITE 0x0004
#define MSI_NO_IBMPS2 0x0008
#define MSI_NO_EPP 0x0010
#define MSI_NO_IRQ 0x0020
#define MSI_NO_AUTOIRQ 0x0040
#define MSI_IRQ_MODE1 0x0080
#define MSI_IRQ_MODE2 0x0100
#define MSI_IRQ_MODE4 0x0200
#define MSI_NO_TPWIZARD 0x0400
//
// DMA Read and Write codes
//
#define MSI_FDC_2_PC 0x0001
#define MSI_PC_2_FDC 0x0000
#define MSI_MAP_MEM 0x0002
#define MSI_USE_CRC 0x0004 // OBSOLETE Always used on 50772
#define MSI_USE_ECC 0x0008
//
// Fault codes
//
#define MSI_FC_NOT_OPEN 0x0101
#define MSI_FC_NOT_CLOSED 0x0102
#define MSI_FC_CON_FAIL 0x0201
#define MSI_FC_FDC_RQM 0x0301
#define MSI_FC_FDC_DIO 0x0302
#define MSI_FC_FDC_BSY 0x0303
#define MSI_FC_DMA_ACT 0x0401
#define MSI_FC_DMA_ABORT 0x0402
#define MSI_FC_DMA_DIR 0x0403
#define MSI_FC_DMA_SIZE 0x0404
#define MSI_FC_DMA_FLOW 0x0405
#define MSI_FC_DMA_CRC 0x0406
#define MSI_FC_DMA_ECC 0x0407
#define MSI_FC_DMA_ZONE 0x0408
#define MSI_FC_DMA_ILLEGAL 0x0409
#define MSI_FC_NOT_IRQ 0x0501
#define MSI_FC_IRQ_ACT 0x0601
#define MSI_FC_EEP_BAD 0x0701
#define MSI_FC_REP_BIT 0x8001 // Application Fault Codes
#define MSI_FC_WRONG_BIT 0x8002
#define MSI_FC_ERR_STATUS 0x8003
#define MSI_FC_NO_CART 0x8004
#define MSI_FC_NEW_CART 0x8005
#define MSI_FC_ECC_FAIL 0x8006
#define MSI_FC_FDC_ABNORMAL 0x8040
#define MSI_FC_FDC_INVALID 0x8080
#define MSI_FC_FDC_CHANGED 0x80C0
//
// Interrupt type (for fc_par_execute_int)
//
#define MSI_FC_INT_HARDWARE 0 // a result of a hardware interrupt
#define MSI_FC_INT_SOFTWARE 1 // a result of a software poll
#define MSI_FC_INT_FORCE 2 // forced software interrupt
#define MSI_FC_INT_INTERNAL 3 // internally generated interrupt?
//
// Function Prototypes
//
extern msiWord cdecl fc_par_version(void);
extern msiWord cdecl fc_par_open(MsiPPC *,msiWord);
extern msiWord cdecl fc_par_close(void);
extern msiWord cdecl fc_par_rd_fdc(msiByte *, msiWord);
extern msiWord cdecl fc_par_wr_fdc(msiByte *, msiWord);
extern msiWord cdecl fc_par_rd_port(msiWord);
extern msiWord cdecl fc_par_wr_port(msiWord, msiByte);
extern msiWord cdecl fc_par_rd_eeprom(msiWord);
extern msiWord cdecl fc_par_wr_eeprom(msiWord, msiWord);
extern msiWord cdecl fc_par_rd_dma(msiByte *, msiWord, msiDWord);
extern msiWord cdecl fc_par_wr_dma(msiByte *, msiWord, msiDWord);
extern msiWord cdecl fc_par_chk_dma(msiByte *, msiWord, msiDWord);
extern msiWord cdecl fc_par_clr_dma(msiWord);
extern msiWord cdecl fc_par_prog_dma(msiWord, msiWord, msiDWord);
extern msiWord cdecl fc_par_term_dma(msiWord, msiWord);
extern msiWord cdecl fc_par_execute_int(msiWord);
extern msiWord cdecl fc_par_handle_int(void (cdecl *)(msiWord));
#ifdef NOT_NOW // As of version 6.02 of the microsolutions API, the code below is obsolete (EBX saved now)
//
// If this is a 32-bit compiler (not 8086 or 80286) then we need to preserve
// the EBX register on fc_par calls. The code below will do so.
//
#if !defined(M_I8086) && !defined(M_I286)
#pragma warning(disable:4505)
static __inline msiWord msifix_open(MsiPPC *a,msiWord b)
{
msiWord ret;
_asm push ebx;
ret = fc_par_open(a,b);
_asm pop ebx;
return ret;
}
static __inline msiWord msifix_close(void)
{
msiWord ret;
_asm push ebx;
ret = fc_par_close();
_asm pop ebx;
return ret;
}
static __inline msiWord msifix_rd_fdc(msiByte *a, msiWord b)
{
msiWord ret;
_asm push ebx;
ret = fc_par_rd_fdc(a,b);
_asm pop ebx;
return ret;
}
static __inline msiWord msifix_wr_fdc(msiByte *a, msiWord b)
{
msiWord ret;
_asm push ebx;
ret = fc_par_wr_fdc(a,b);
_asm pop ebx;
return ret;
}
static __inline msiWord msifix_rd_port(msiWord a)
{
msiWord ret;
_asm push ebx;
ret = fc_par_rd_port(a);
_asm pop ebx;
return ret;
}
static __inline msiWord msifix_wr_port(msiWord a, msiByte b)
{
msiWord ret;
_asm push ebx;
ret = fc_par_wr_port(a,b);
_asm pop ebx;
return ret;
}
static __inline msiWord msifix_rd_eeprom(msiWord a)
{
msiWord ret;
_asm push ebx;
ret = fc_par_rd_eeprom(a);
_asm pop ebx;
return ret;
}
static __inline msiWord msifix_wr_eeprom(msiWord a, msiWord b)
{
msiWord ret;
_asm push ebx;
ret = fc_par_wr_eeprom(a,b);
_asm pop ebx;
return ret;
}
static __inline msiWord msifix_rd_dma(msiByte *a, msiWord b, msiDWord c)
{
msiWord ret;
_asm push ebx;
ret = fc_par_rd_dma(a,b,c);
_asm pop ebx;
return ret;
}
static __inline msiWord msifix_wr_dma(msiByte *a, msiWord b, msiDWord c)
{
msiWord ret;
_asm push ebx;
ret = fc_par_wr_dma(a,b,c);
_asm pop ebx;
return ret;
}
static __inline msiWord msifix_chk_dma(msiByte *a, msiWord b, msiDWord c)
{
msiWord ret;
_asm push ebx;
ret = fc_par_chk_dma(a,b,c);
_asm pop ebx;
return ret;
}
static __inline msiWord msifix_clr_dma(msiWord a)
{
msiWord ret;
_asm push ebx;
ret = fc_par_clr_dma(a);
_asm pop ebx;
return ret;
}
static __inline msiWord msifix_prog_dma(msiWord a, msiWord b, msiDWord c)
{
msiWord ret;
_asm push ebx;
ret = fc_par_prog_dma(a,b,c);
_asm pop ebx;
return ret;
};
static __inline msiWord msifix_term_dma(msiWord a, msiWord b)
{
msiWord ret;
_asm push ebx;
ret = fc_par_term_dma(a,b);
_asm pop ebx;
return ret;
}
static __inline msiWord msifix_execute_int(msiWord a)
{
msiWord ret;
_asm push ebx;
ret = fc_par_execute_int(a);
_asm pop ebx;
return ret;
}
static __inline msiWord msifix_handle_int(void (cdecl *a)(msiWord))
{
msiWord ret;
_asm push ebx;
ret = fc_par_handle_int(a);
_asm pop ebx;
return ret;
}
// now use inline functions (that preserve ebx) for all calls into
// microsolutions api
#define fc_par_open(a,b) msifix_open(a,b)
#define fc_par_close msifix_close
#define fc_par_rd_port(a) msifix_rd_port(a)
#define fc_par_wr_port(a, b) msifix_wr_port(a, b)
#define fc_par_rd_eeprom(a) msifix_rd_eeprom(a)
#define fc_par_wr_eeprom(a, b) msifix_wr_eeprom(a, b)
#define fc_par_rd_dma(a, b, c) msifix_rd_dma(a, b, c)
#define fc_par_wr_dma(a, b, c) msifix_wr_dma(a, b, c)
#define fc_par_chk_dma(a, b, c) msifix_chk_dma(a, b, c)
#define fc_par_clr_dma(a) msifix_clr_dma(a)
#define fc_par_prog_dma(a, b, c) msifix_prog_dma(a, b, c)
#define fc_par_term_dma(a, b) msifix_term_dma(a, b)
#define fc_par_execute_int(a) msifix_execute_int(a)
#define fc_par_handle_int(a) msifix_handle_int(a)
#endif // !defined(M_I8086) && !defined(M_I286)
#endif // NOT_NOW
#endif // _MICROSOL_H_
/*****************************************************************************
*
* FILE: FRB_API.H
*
* PURPOSE: This file contains all of the API's necessary to access
* the common QIC117 device driver and build FRB's.
*
*****************************************************************************/
/* Valid Tape Formats *******************************************************/
/* S_CQDTapeCfg.tape_class */
#define QIC40_FMT (UCHAR)1 /* QIC-40 formatted tape */
#define QIC80_FMT (UCHAR)2 /* QIC-80 formatted tape */
#define QIC3010_FMT (UCHAR)3 /* QIC-3010 formatted tape */
#define QIC3020_FMT (UCHAR)4 /* QIC-3020 formatted tape */
#define QIC80W_FMT (UCHAR)5 /* QIC-80W formatted tape */
#define QIC3010W_FMT (UCHAR)6 /* QIC-3010W formatted tape */
#define QIC3020W_FMT (UCHAR)7 /* QIC-3020W formatted tape */
/* The following parameters are used to indicate the tape format code *******/
/* S_CQDTapeCfg.tape_format_code */
#define QIC_FORMAT (UCHAR)2 /* Indicates a standard or extended length tape */
#define QICEST_FORMAT (UCHAR)3 /* Indicates a 1100 foot tape */
#define QICFLX_FORMAT (UCHAR)4 /* Indicates a flexible format tape foot tape */
#define QIC_XLFORMAT (UCHAR)5 /* Indicates a 425ft tape */
/* Valid Drive Classes ******************************************************/
/* S_DeviceDescriptor.drive_class */
/* S_DeviceInfo.drive_class */
#define UNKNOWN_DRIVE (UCHAR)1 /* Unknown drive class */
#define QIC40_DRIVE (UCHAR)2 /* QIC-40 drive */
#define QIC80_DRIVE (UCHAR)3 /* QIC-80 drive */
#define QIC3010_DRIVE (UCHAR)4 /* QIC-3010 drive */
#define QIC3020_DRIVE (UCHAR)5 /* QIC-3020 drive */
#define QIC80W_DRIVE (UCHAR)6 /* QIC-80W drive */
#define QIC3010W_DRIVE (UCHAR)7 /* QIC-3010W drive */
#define QIC3020W_DRIVE (UCHAR)8 /* QIC-3020W drive */
/* Valid Tape Types *********************************************************/
/* The defined values match the QIC117-G spec. except for TAPE_205 */
/* S_CQDTapeCfg.tape_type */
#define TAPE_UNKNOWN (UCHAR)0x00 /* Unknown tape type */
#define TAPE_205 (UCHAR)0x11 /* 205 foot 550 Oe */
#define TAPE_425 (UCHAR)0x01 /* 425 foot 550 Oe */
#define TAPE_307 (UCHAR)0x02 /* 307.5 foot 550 Oe */
#define TAPE_FLEX_550 (UCHAR)0x03 /* Flexible Format 550 Oe */
#define TAPE_FLEX_900 (UCHAR)0x06 /* Flexible Format 900 Oe */
#define TAPE_FLEX_550_WIDE (UCHAR)0x0B /* Flexible Format 550 Oe Wide */
#define TAPE_FLEX_900_WIDE (UCHAR)0x0E /* Flexible Format 900 Oe Wide */
/* Valid Transfer Rates ******************************************************/
#define XFER_250Kbps (UCHAR)1 /* 250 Kbps transfer rate supported */
#define XFER_500Kbps (UCHAR)2 /* 500 Kbps transfer rate supported */
#define XFER_1Mbps (UCHAR)4 /* 1 Mbps transfer rate supported */
#define XFER_2Mbps (UCHAR)8 /* 2Mbps transfer rate supported */
/* Valid Commands for the driver ********************************************/
#define CMD_LOCATE_DEVICE (USHORT)0x1100
#define CMD_REPORT_DEVICE_CFG (USHORT)0x1101
#define CMD_SELECT_DEVICE (USHORT)0x1102
#define CMD_DESELECT_DEVICE (USHORT)0x1103
#define CMD_LOAD_TAPE (USHORT)0x1104
#define CMD_UNLOAD_TAPE (USHORT)0x1105
#define CMD_SET_SPEED (USHORT)0x1106
#define CMD_REPORT_STATUS (USHORT)0x1107
#define CMD_SET_TAPE_PARMS (USHORT)0x1108
#define CMD_READ (USHORT)0x1109
#define CMD_READ_RAW (USHORT)0x110A
#define CMD_READ_HEROIC (USHORT)0x110B
#define CMD_READ_VERIFY (USHORT)0x110C
#define CMD_WRITE (USHORT)0x110D
#define CMD_WRITE_DELETED_MARK (USHORT)0x110E
#define CMD_FORMAT (USHORT)0x110F
#define CMD_RETENSION (USHORT)0x1110
#define CMD_ISSUE_DIAGNOSTIC (USHORT)0x1111
#define CMD_ABORT (USHORT)0x1112
#define CMD_DELETE_DRIVE (USHORT)0x1113
#define CMD_REPORT_DEVICE_INFO (USHORT)0x1114
/* FC20 jumperless sequence size */
/* NOTE: This is a mirror of the SEQUENCE SIZE define in task.h and needs
* to be in sync with that define */
#define FC20_SEQUENCE_SIZE (UCHAR)0x10
/* DATA STRUCTURES: *********************************************************/
/* Note: The following structures are not aligned on DWord boundaries */
#pragma pack(4)
typedef struct S_DeviceCfg { /* QIC117 device configuration information */
BOOLEAN speed_change; /* device/FDC combination supports dual speeds */
BOOLEAN alt_retrys; /* Enable reduced retries */
BOOLEAN new_drive; /* indicates whether or not drive has been configured */
UCHAR select_byte; /* FDC select byte */
UCHAR deselect_byte; /* FDC deselect byte */
UCHAR drive_select; /* FDC drive select byte */
UCHAR perp_mode_select; /* FDC perpendicular mode select byte */
UCHAR supported_rates; /* Transfer rates supported by the device/FDC combo */
UCHAR drive_id; /* Tape device id */
} DeviceCfg, *DeviceCfgPtr;
typedef struct S_DeviceDescriptor { /* Physical characteristics of the tape device */
USHORT sector_size; /* sector size in bytes */
USHORT segment_size; /* Number of sectors per segment */
UCHAR ecc_blocks; /* Number of ECC sectors per segment */
USHORT vendor; /* Manufacturer of the tape drive */
UCHAR model; /* Model of the tape drive */
UCHAR drive_class; /* Class of tape drive. (QIC-40, QIC-80, etc) */
UCHAR native_class; /* Native class of tape drive (QIC-40, QIC-80, etc) */
UCHAR fdc_type; /* Floppy disk controller type */
} DeviceDescriptor, *DeviceDescriptorPtr;
typedef struct S_DeviceInfo { /* Physical information from the tape device */
UCHAR drive_class; /* Class of tape drive. (QIC-40, QIC-80, etc) */
USHORT vendor; /* Manufacturer of the tape drive */
UCHAR model; /* Model of the tape drive */
USHORT version; /* Firmware Version */
USHORT manufacture_date; /* days since Jan 1, 1992 */
ULONG serial_number; /* Cnnnnnnn where 'C' is an alpha character */
/* in the highest byte, and nnnnnnn is a 7 */
/* digit decimal number in the remaining 3 bytes */
UCHAR oem_string[20]; /* OEM the device is destined for */
UCHAR country_code[2]; /* Country code chars, "US", "UK", ... */
} DeviceInfo, *DeviceInfoPtr;
typedef struct S_CQDTapeCfg { /* Physical characteristics of the tape */
ULONG log_segments; /* number of logical segments on a tape UDWord formattable_segs */
ULONG formattable_segments; /* the number of formattable segments */
ULONG formattable_tracks; /* the number of formattable tracks */
ULONG seg_tape_track; /* segments per tape track */
USHORT num_tape_tracks; /* number of tape tracks */
BOOLEAN write_protected; /* tape is write protected */
BOOLEAN read_only_media; /* tape is read only by the current device i.e QIC40 in a QIC80 */
BOOLEAN formattable_media; /* tape can be formatted by the current device */
BOOLEAN speed_change_ok; /* tape/device combo supports dual speeds */
UCHAR tape_class; /* Format of tape in drive */
UCHAR max_floppy_side; /* maximum floppy side */
UCHAR max_floppy_track; /* maximum floppy track */
UCHAR max_floppy_sector; /* maximum floppy sector */
UCHAR xfer_slow; /* slow transfer rate */
UCHAR xfer_fast; /* fast transfer rate */
UCHAR tape_format_code;
UCHAR tape_type; /* from status bits 4-7, includes wide bit */
} CQDTapeCfg, *CQDTapeCfgPtr;
typedef struct S_RepositionData { /* reposition counts */
USHORT overrun_count; /* data overruns/underruns */
USHORT reposition_count; /* tape repositions */
USHORT hard_retry_count; /* tape repositions due to no data errors */
} RepositionData, *RepositionDataPtr;
typedef struct S_OperationStatus { /* Driver status */
ULONG current_segment; /* current logical segment */
USHORT current_track; /* current physical track */
BOOLEAN new_tape; /* new cartridge detected */
BOOLEAN no_tape; /* no tape in the deivce */
BOOLEAN cart_referenced; /* tape is not referenced */
BOOLEAN retry_mode; /* device is currently retrying an io operation */
UCHAR xfer_rate; /* Current transfer rate */
} OperationStatus, *OperationStatusPtr;
typedef struct S_QIC117 {
USHORT r_dor; /* Tape adapter board digital output register. */
USHORT dor; /* Floppy disk controller digital output register. */
UCHAR drive_id; /* Physical tape drive id. */
UCHAR reserved[3];
} QIC117;
typedef struct S_Trakker {
USHORT r_dor; /* Tape adapter board digital output register. */
USHORT dor; /* Floppy disk controller digital output register. */
ULONG trakbuf; /* pointer to the dymanic trakker buffer */
ULONG mem_size; /* Number of bytes on the Trakker */
UCHAR drive_id; /* Physical tape drive id. */
UCHAR port_mode; /* Current mode that the parallel port is operating in communication eith Trakker */
UCHAR lpt_type; /* 0=none, 1=uni, 2=bidi */
UCHAR lpt_number; /* 0=none, 1=LPT1, 2=LPT2, 3=LPT3 */
UCHAR wake_index; /* the wakeup sequence (of 8 possible) used to access the TRAKKER ASIC */
} Trakker;
/* port_mode: 0 - Unidirectional, Full Handshake, 500Kb, Full Delay
* 1 - Unidirectional, Full Handshake, 500Kb, Optimize Delays
* 2 - Unidirectional, Full Handshake, 1Mb, Optimize Delays
* 3 - Unidirectional, Self Latch, 1Mb, Optimize Delays
* 4 - Bidirectional, Full Handshake, 500Kb, Optimize Delays
* 5 - Bidirectional, Full Handshake, 1Mb, Optimize Delays
* 6 - Bidirectional, Self Latch, 1Mb, Optimize Delays */
/* Duplicated Grizzly Structure */ /* ------------------------- */
/* ------------------------------------------------------------ */
/* ------------------------------------------------------------ */
/* ---------------- --------------- */
/* ---------------- --------------- */
/* ---------------- This structure is --------------- */
/* ---------------- --------------- */
/* ---------------- must be kept in perfect --------------- */
/* ---------------- --------------- */
/* ---------------- synce with its evil twin --------------- */
/* ---------------- --------------- */
/* ---------------- struct S_GrizzlyDevice --------------- */
/* ---------------- --------------- */
/* ---------------- located in --------------- */
/* ---------------- --------------- */
/* ---------------- cbw\code\include\task.h --------------- */
/* ---------------- --------------- */
/* ---------------- --------------- */
/* ------------------------------------------------------------ */
/* ------------------------------------------------------------ */
/* ------------------------------------------------------------ */
typedef struct S_Grizzly {
UCHAR drive_id; /* Physical tape drive id. */
USHORT grizzly_ctrl; /* Grizzly special config control options */
USHORT xfer_mode; /* (I/O) parallel port transfer mode */
UCHAR xfer_rate; /* (I/O) device transfer rate selection */
SHORT lpt_type; /* (O) parallel port type */
UCHAR lpt_number; /* (I/O) parallel port number */
} Grizzly;
/* ------------------------------------------------------------ */
/* ------------------------------------------------------------ */
typedef union U_DevSpecific {
QIC117 q117_dev; /* Interface specific device parameters for QIC 117 */
Trakker trakker_dev; /* Interface specific device parameters for Trakker */
Grizzly grizzly_dev;
MicroSol microsol_dev;
} DevSpecific;
typedef struct S_DriveParms { /* Hardware parameters for DMA & IRQ enable. */
DevSpecific dev_parm; /* Interface specific device parameters */
USHORT drive_handle; /* Unique identifier for tape drive. */
USHORT base_address; /* Controller base address. */
USHORT mca_dma_address; /* DMA base address on MCA. */
USHORT mca_cdma_address; /* Compression DMA base address on MCA. */
BOOLEAN irq_share; /* (TRUE) interrupt sharing enabled. */
BOOLEAN io_card; /* (TRUE) IO controller present. */
BOOLEAN compress_hard; /* (TRUE) hardware compression present. */
BOOLEAN micro_channel; /* (TRUE) Micro Channel Architecture. */
BOOLEAN dual_port_mode; /* (TRUE) dual port mode enabled. */
BOOLEAN dma_width_mca; /* TRUE = 16-bit; FALSE = 8-bit */
UCHAR board_type; /* Identifies type of controller board */
UCHAR clk48mhz; /* if true, then use 48mhz clock if it's an 82078 */
UCHAR board_id; /* Hard-wired id of board, 0 - 3 */
UCHAR irq; /* Hardware interrupt vector. */
UCHAR dma; /* Tape drive dma channel. */
UCHAR compression_dma; /* Compression dma channel. */
UCHAR data_dma_16bit; /* TRUE-controller is in a 16bit slot */
UCHAR extended_irq; /* TRUE-IRQ is 10 or 11 */
UCHAR setup_reg_shadow; /* copy of the setup register used in hio */
UCHAR sequence[FC20_SEQUENCE_SIZE]; /* the jumperless sequence used to wake up the FC20 */
} DriveParms, *DriveParmsPtr;
/* JUMBO DRIVER FRB STRUCTURES **********************************************/
typedef struct S_ReportDeviceInfo { /* Device Information FRB */
ADIRequestHdr adi_hdr; /* I/O ADI packet header */
DeviceInfo device_info; /* O device information */
} ReportDeviceInfo, *ReportDeviceInfoPtr;
typedef struct S_DriveCfgData { /* Device Configuration FRB */
ADIRequestHdr adi_hdr; /* I/O ADI packet header */
DeviceCfg device_cfg; /* I/O device configuration */
DriveParms hardware_cfg; /* I the Hardware I/O Parameters of the drive */
DeviceDescriptor device_descriptor; /* O device description */
OperationStatus operation_status; /* O Current status of the device */
} DriveCfgData, *DriveCfgDataPtr;
typedef struct S_DeviceOp { /* Generic Device operation FRB */
ADIRequestHdr adi_hdr; /* I/O ADI packet header */
OperationStatus operation_status; /* O Current status of the device */
ULONG data; /* Command dependent data area */
} DeviceOp, *DeviceOpPtr;
typedef struct S_LoadTape { /* New Tape configuration FRB */
ADIRequestHdr adi_hdr; /* I/O ADI packet header */
CQDTapeCfg tape_cfg; /* O Tape configuration information */
OperationStatus operation_status; /* O Current status of the device */
} LoadTape, *LoadTapePtr;
typedef struct S_TapeParms { /* Tape length configuration FRB */
ADIRequestHdr adi_hdr; /* I/O ADI packet header */
ULONG segments_per_track; /* I Segments per tape track */
CQDTapeCfg tape_cfg; /* O Tape configuration information */
} TapeLength, *TapeLengthPtr;
typedef struct S_DeviceIO { /* Device I/O FRB */
ADIRequestHdr adi_hdr; /* I/O ADI packet header */
ULONG starting_sector; /* I Starting sector for the I/O operation */
ULONG number; /* I Number of sectors in the I/O operation (including bad) */
ULONG bsm; /* I Bad sector map for the requested I/O operation */
ULONG crc; /* O map of sectors that failed CRC check */
ULONG retrys; /* O map of sectors that had to be retried */
RepositionData reposition_data; /* O reposition counts for the current operation */
OperationStatus operation_status; /* O Current status of the device */
} DeviceIO, *DeviceIOPtr;
typedef struct S_FormatRequest { /* Format request FRB */
ADIRequestHdr adi_hdr; /* I/O ADI packet header */
CQDTapeCfg tape_cfg; /* O Tape configuration information */
USHORT start_track; /* I Starting track */
USHORT tracks; /* I Number of tracks to format */
} FormatRequest, *FormatRequestPtr;
typedef struct S_DComFirm { /* Direct firmware communication FRB */
ADIRequestHdr adi_hdr; /* I/O ADI packet header */
UCHAR command_str[32]; /* I Firmware command sequence */
} DComFirm, *DComFirmPtr;
#pragma pack()
/*****************************************************************************
*
* FILE: VENDOR.H
*
* PURPOSE: This file contains all of the defines for each of the vendor
* numbers and model numbers. The vendor number data is from the
* QIC 117 specification.
*
*****************************************************************************/
/* Valid Drive Vendors ******************************************************/
/* The defined values match the QIC117-G spec. */
/* S_DeviceDescriptor.vendor */
/* S_DeviceInfo.vendor */
#define VENDOR_UNASSIGNED (USHORT)0
#define VENDOR_ALLOY_COMP (USHORT)1
#define VENDOR_3M (USHORT)2
#define VENDOR_TANDBERG (USHORT)3
#define VENDOR_CMS_OLD (USHORT)4
#define VENDOR_CMS (USHORT)71
#define VENDOR_ARCHIVE_CONNER (USHORT)5
#define VENDOR_MOUNTAIN_SUMMIT (USHORT)6
#define VENDOR_WANGTEK_REXON (USHORT)7
#define VENDOR_SONY (USHORT)8
#define VENDOR_CIPHER (USHORT)9
#define VENDOR_IRWIN (USHORT)10
#define VENDOR_BRAEMAR (USHORT)11
#define VENDOR_VERBATIM (USHORT)12
#define VENDOR_CORE (USHORT)13
#define VENDOR_EXABYTE (USHORT)14
#define VENDOR_TEAC (USHORT)15
#define VENDOR_GIGATEK (USHORT)16
#define VENDOR_COMBYTE (USHORT)17
#define VENDOR_PERTEC (USHORT)18
#define VENDOR_IOMEGA (USHORT)546
#define VENDOR_CMS_ENHANCEMENTS (USHORT)1021 /* drive_type = CMS Enhancements */
#define VENDOR_UNSUPPORTED (USHORT)1022 /* drive_type = Unsupported */
#define VENDOR_UNKNOWN (USHORT)1023 /* drive_type = unknown */
/* Valid Drive Models *******************************************************/
/* S_DeviceDescriptor.model */
/* S_DeviceInfo.model */
#define MODEL_CMS_QIC40 (UCHAR)0x00 /* CMS QIC40 Model # */
#define MODEL_CMS_QIC80 (UCHAR)0x01 /* CMS QIC80 Model # */
#define MODEL_CMS_QIC3010 (UCHAR)0x02 /* CMS QIC3010 Model # */
#define MODEL_CMS_QIC3020 (UCHAR)0x03 /* CMS QIC3020 Model # */
#define MODEL_CMS_QIC80_STINGRAY (UCHAR)0x04 /* CMS QIC80 STINGRAY Model # */
#define MODEL_CMS_QIC80W (UCHAR)0x05 /* CMS QIC80W Model # */
#define MODEL_CMS_TR3 (UCHAR)0x06 /* CMS TR3 Model # */
#define MODEL_CONNER_QIC80 (UCHAR)0x0e /* Conner QIC80 Model # */
#define MODEL_CONNER_QIC80W (UCHAR)0x10 /* Conner QIC80 Wide Model # */
#define MODEL_CONNER_QIC3010 (UCHAR)0x12 /* Conner QIC3010 Model # */
#define MODEL_CONNER_QIC3020 (UCHAR)0x14 /* Conner QIC3020 Model # */
#define MODEL_CORE_QIC80 (UCHAR)0x21 /* Core QIC80 Model # */
#define MODEL_IOMEGA_QIC80 (UCHAR)0x00 /* Iomega QIC80 Model # */
#define MODEL_IOMEGA_QIC3010 (UCHAR)0x01 /* Iomega QIC3010 Model # */
#define MODEL_IOMEGA_QIC3020 (UCHAR)0x02 /* Iomega QIC3020 Model # */
#define MODEL_SUMMIT_QIC80 (UCHAR)0x01 /* Summit QIC80 Model # */
#define MODEL_SUMMIT_QIC3010 (UCHAR)0x15 /* Summit QIC 3010 Model # */
#define MODEL_WANGTEK_QIC80 (UCHAR)0x0a /* Wangtek QIC80 Model # */
#define MODEL_WANGTEK_QIC40 (UCHAR)0x02 /* Wangtek QIC40 Model # */
#define MODEL_WANGTEK_QIC3010 (UCHAR)0x0C /* Wangtek QIC3010 Model # */
#define MODEL_TEAC_TR1 (UCHAR)0x0e
#define MODEL_TEAC_TR2 (UCHAR)0x0f
#define MODEL_PERTEC_TR1 (UCHAR)0x01
#define MODEL_PERTEC_TR2 (UCHAR)0x02
#define MODEL_PERTEC_TR3 (UCHAR)0x03
#define MODEL_UNKNOWN (UCHAR)0xFF /* drive_model = unknown */
/*****************************************************************************
*
* FILE: KDIWPRIV.H
*
* PURPOSE: This file contains all of the internal structures and types needed
* in the KDI.
*
*****************************************************************************/
/* Miscellaneous defines. */
#define NANOSEC_PER_MILLISEC 0x0004f2f0
/* STRUCTURES: **************************************************************/
/* Define the maximum number of controllers and floppies per controller */
/* that this driver will support. */
/* The number of floppies per controller is fixed at 4, since the */
/* controllers don't have enough bits to select more than that (and */
/* actually, many controllers will only support 2). The number of */
/* controllers per machine is arbitrary; 3 should be more than enough. */
#define MAXIMUM_CONTROLLERS_PER_MACHINE 3
/* MACROS to access the controller. Note that the *_PORT_UCHAR macros */
/* work on all machines, whether the I/O ports are separate or in */
/* memory space. */
#define READ_CONTROLLER( Address ) \
READ_PORT_UCHAR( ( PUCHAR )Address )
#define WRITE_CONTROLLER( Address, Value ) \
WRITE_PORT_UCHAR( ( PUCHAR )Address, ( UCHAR )Value )
/* Define the maximum number of tape drives per controller */
/* that this driver will support. */
/* The number of tape drives per controller is fixed at 1, since the */
/* software select schemes generally work for one drive only. */
#define MAXIMUM_TAPE_DRIVES_PER_CONTROLLER 1
/* This structure holds all of the configuration data. It is filled in */
/* by FlGetConfigurationInformation(), which gets the information from */
/* the configuration manager or the hardware architecture layer (HAL). */
typedef struct s_controllerInfo {
UCHAR floppyEnablerApiSupported;
UCHAR dmaDirection;
PDEVICE_OBJECT apiDeviceObject;
BOOLEAN fdcSupported;
PDEVICE_OBJECT fdcDeviceObject;
UNICODE_STRING fdcUnicodeString;
WCHAR idstr[200];
} ControllerInfo;
typedef struct S_KdiContext {
KEVENT interrupt_event;
KEVENT allocate_adapter_channel_event;
PKINTERRUPT interrupt_object;
PVOID map_register_base;
LONG actual_controller_number;
PDEVICE_OBJECT device_object;
ULONG base_address;
PVOID cqd_context;
UCHAR interface_type;
BOOLEAN own_floppy_event;
BOOLEAN current_interrupt;
BOOLEAN interrupt_pending;
NTSTATUS interrupt_status;
BOOLEAN adapter_locked;
LIST_ENTRY list_entry;
KSEMAPHORE request_semaphore;
KSPIN_LOCK list_spin_lock;
KEVENT clear_queue_event;
BOOLEAN unloading_driver;
UCHAR number_of_tape_drives;
BOOLEAN clear_queue;
BOOLEAN abort_requested;
ULONG error_sequence;
ULONG tape_number;
ControllerInfo controller_data;
HANDLE thread_handle;
} KdiContext, *KdiContextPtr;
typedef struct S_QICDeviceContext {
PDEVICE_OBJECT UnderlyingPDO;
PDEVICE_OBJECT TargetObject;
BOOLEAN DeviceInitialized;
UNICODE_STRING InterfaceString;
PDEVICE_OBJECT device_object;
PDEVICE_OBJECT TapeDeviceObject;
KdiContextPtr kdi_context;
BOOLEAN Paused;
LIST_ENTRY PauseQueue;
KSPIN_LOCK PauseQueueSpinLock;
} QICDeviceContext, *QICDeviceContextPtr;
/* PROTOTYPES: **************************************************************/
NTSTATUS
DriverEntry(
IN PDRIVER_OBJECT driver_object_ptr,
IN PUNICODE_STRING registry_path
);
NTSTATUS
kdi_DispatchDeviceControl(
IN PDEVICE_OBJECT device_object_ptr,
IN OUT PIRP irp
);
BOOLEAN
kdi_Hardware(
IN PKINTERRUPT interrupt,
IN PVOID context
);
VOID
kdi_DeferredProcedure(
IN PKDPC dpc,
IN PVOID deferred_context,
IN PVOID system_argument_1,
IN PVOID system_argument_2
);
VOID
kdi_UnloadDriver(
IN PDRIVER_OBJECT driver_object
);
VOID
kdi_ThreadRun(
IN KdiContextPtr kdi_context
);
IO_ALLOCATION_ACTION
kdi_AllocateAdapterChannel(
IN PDEVICE_OBJECT device_object,
IN PIRP irp,
IN PVOID map_register_base,
IN PVOID context
);
NTSTATUS
kdi_ConfigCallBack(
IN PVOID context,
IN PUNICODE_STRING path_name,
IN INTERFACE_TYPE bus_type,
IN ULONG bus_number,
IN PKEY_VALUE_FULL_INFORMATION *bus_information,
IN CONFIGURATION_TYPE controller_type,
IN ULONG controller_number,
IN PKEY_VALUE_FULL_INFORMATION *controller_information,
IN CONFIGURATION_TYPE peripheral_type,
IN ULONG peripheral_number,
IN PKEY_VALUE_FULL_INFORMATION *peripheral_information
);
NTSTATUS
kdi_InitializeDrive(
IN KdiContextPtr kdi_context,
IN PVOID cqd_context,
IN PDRIVER_OBJECT driver_object_ptr,
IN PDEVICE_OBJECT PhysicalDeviceObject
);
#if 0
//
// (fcf) kdi_GetControllerBase() does not appear to be used, so I removed it
// to get rid of the 64bit-related warnings it was generating.
//
ULONG
kdi_GetControllerBase(
IN INTERFACE_TYPE bus_type,
IN ULONG bus_number,
IN PHYSICAL_ADDRESS io_address,
IN ULONG number_of_bytes,
IN BOOLEAN in_io_space,
IN PBOOLEAN mapped_address
);
#endif
NTSTATUS
kdi_TranslateError(
IN PDEVICE_OBJECT device_object,
IN NTSTATUS return_value
);
NTSTATUS
kdi_ClearIO(
IN PIRP irp
);
NTSTATUS
q117MapStatus(
IN NTSTATUS status
);
VOID
q117LogError(
PDEVICE_OBJECT device_object,
ULONG sequence_number,
UCHAR major_function_code,
UCHAR retry_count,
ULONG unique_error_value,
NTSTATUS final_status,
NTSTATUS specific_IO_status
);
NTSTATUS kdi_FloppyEnabler(
PDEVICE_OBJECT device_object,
int ioctl,
void *data
);
/*****************************************************************************
*
* FILE: KDI_PUB.H
*
* PURPOSE: Prototypes for the functions required by the common driver.
*
*****************************************************************************/
#if DBG
#define DBG_SEEK_FWD ((ULONG)0x1234566d)
#define DBG_SEEK_REV ((ULONG)0x1234566f)
#define DBG_SEEK_OFFSET ((ULONG)0x12345670)
#define DBG_RW_NORMAL ((ULONG)0x12345671)
#define DBG_SEEK_PHASE ((ULONG)0x12345672)
#define DBG_L_SECT ((ULONG)0x12345673)
#define DBG_C_SEG ((ULONG)0x12345674)
#define DBG_D_SEG ((ULONG)0x12345675)
#define DBG_C_TRK ((ULONG)0x12345676)
#define DBG_D_TRK ((ULONG)0x12345677)
#define DBG_SEEK_ERR ((ULONG)0x12345678)
#define DBG_IO_TYPE ((ULONG)0x12345679)
#define DBG_PGM_FDC ((ULONG)0x1234567a)
#define DBG_READ_FDC ((ULONG)0x1234567b)
#define DBG_PGM_DMA ((ULONG)0x1234567c)
#define DBG_SEND_BYTE ((ULONG)0x1234567d)
#define DBG_RECEIVE_BYTE ((ULONG)0x1234567e)
#define DBG_IO_CMD_STAT ((ULONG)0x1234567f)
#define DBG_TIMER_ACK ((ULONG)0x12345680)
#define DBG_INT_ACK ((ULONG)0x12345681)
#define DBG_SLEEP ((ULONG)0x12345682)
#define DBG_WAKEUP ((ULONG)0x12345683)
#define DBG_ARMINT ((ULONG)0x12345684)
#define DBG_STATUS ((ULONG)0x12345685)
#define DBG_READ_BUF ((ULONG)0x12345686)
#define DBG_WRITE_BUF ((ULONG)0x12345687)
#define DBG_CALLBACK ((ULONG)0x12345688)
#define DBG_WAITCC ((ULONG)0x12345689)
#define DBG_WAITFAULT ((ULONG)0x1234568a)
#define DBG_FIFO_FDC ((ULONG)0x1234568b)
extern ULONG kdi_debug_level;
#define KDI_SET_DEBUG_LEVEL(X) (kdi_debug_level = X)
#else
#define KDI_SET_DEBUG_LEVEL(X)
#define kdi_CheckedDump(X,Y,Z)
#endif
#define MACHINE_TYPE_MASK 0x0F
#define MICRO_CHANNEL 0x01
#define ISA 0x02
#define EISA 0x03
#define PCMCIA 0x04
#define PCI_BUS 0x05
#define CPU_486 0x10
#define DMA_DIR_UNKNOWN 0xff /* The DMA direction is not currently known */
#define DMA_WRITE 0 /* Program the DMA to write (FDC->DMA->RAM) */
#define DMA_READ 1 /* Program the DMA to read (RAM->DMA->FDC) */
#define NO_ABORT_PENDING (UCHAR)0xFF
#define ABORT_LEVEL_0 (UCHAR)0
#define ABORT_LEVEL_1 (UCHAR)1
/* Definitions for the bits in the interrupt status/clear register */
#define INTS_FLOP 0x01 /* Floppy controller interrupt status */
/* Status & control registers */
#define ASIC_INT_STAT 26 /* Interrupt status / clear register */
#define ASIC_DATA_XOR 27 /* data XOR register */
/* DATA TYPES: **************************************************************/
/* Timing values for kdi_Sleep */
#define kdi_wt10us (ULONG)10l
#define kdi_wt12us (ULONG)12l
#define kdi_wt500us (ULONG)500l
#define kdi_wt0ms (ULONG)0l
#define kdi_wt001ms (ULONG)1l
#define kdi_wt002ms (ULONG)2l
#define kdi_wt003ms (ULONG)3l
#define kdi_wt004ms (ULONG)4l
#define kdi_wt005ms (ULONG)5l
#define kdi_wt010ms (ULONG)10l
#define kdi_wt025ms (ULONG)25l
#define kdi_wt031ms (ULONG)31l
#define kdi_wt090ms (ULONG)90l
#define kdi_wt100ms (ULONG)100l
#define kdi_wt200ms (ULONG)200l
#define kdi_wt265ms (ULONG)265l
#define kdi_wt390ms (ULONG)390l
#define kdi_wt500ms (ULONG)500l
#define kdi_wt001s (ULONG)1000l
#define kdi_wt003s (ULONG)3000l
#define kdi_wt004s (ULONG)4000l
#define kdi_wt005s (ULONG)5000l
#define kdi_wt007s (ULONG)7000l
#define kdi_wt010s (ULONG)10000l
#define kdi_wt016s (ULONG)16000l
#define kdi_wt035s (ULONG)35000l
#define kdi_wt045s (ULONG)45000l
#define kdi_wt050s (ULONG)50000l
#define kdi_wt055s (ULONG)55000l
#define kdi_wt060s (ULONG)60000l
#define kdi_wt065s (ULONG)65000l
#define kdi_wt085s (ULONG)85000l
#define kdi_wt090s (ULONG)90000l
#define kdi_wt100s (ULONG)100000l
#define kdi_wt105s (ULONG)105000l
#define kdi_wt125s (ULONG)125000l
#define kdi_wt130s (ULONG)130000l
#define kdi_wt150s (ULONG)150000l
#define kdi_wt180s (ULONG)180000l
#define kdi_wt200s (ULONG)200000l
#define kdi_wt228s (ULONG)228000l
#define kdi_wt250s (ULONG)250000l
#define kdi_wt260s (ULONG)260000l
#define kdi_wt300s (ULONG)300000l
#define kdi_wt350s (ULONG)350000l
#define kdi_wt455s (ULONG)455000l
#define kdi_wt460s (ULONG)460000l
#define kdi_wt475s (ULONG)475000l
#define kdi_wt650s (ULONG)650000l
#define kdi_wt670s (ULONG)670000l
#define kdi_wt700s (ULONG)700000l
#define kdi_wt910s (ULONG)910000l
#define kdi_wt1300s (ULONG)1300000l
/* PROTOTYPES: *** ***********************************************************/
VOID
kdi_ClaimInterrupt(
IN PVOID kdi_context
);
NTSTATUS
kdi_Error(
IN USHORT group_and_type,
IN ULONG grp_fct_id,
IN UCHAR sequence
);
VOID
kdi_FlushDMABuffers(
IN PVOID kdi_context,
IN BOOLEAN write_operation,
IN PVOID phy_data_ptr,
IN ULONG bytes_transferred_so_far,
IN ULONG total_bytes_of_transfer,
IN BOOLEAN xfer_error
);
VOID
kdi_FlushIOBuffers(
IN PVOID physical_addr,
IN BOOLEAN dma_direction,
IN BOOLEAN flag
);
USHORT
kdi_GetErrorType(
IN NTSTATUS status
);
NTSTATUS
kdi_GetFloppyController(
IN PVOID kdi_context
);
UCHAR
kdi_GetInterfaceType(
IN PVOID kdi_context
);
VOID
kdi_LockUnlockDMA(
IN PVOID kdi_context,
IN BOOLEAN lock
);
VOID
kdi_ProgramDMA(
IN PVOID kdi_context,
IN BOOLEAN write_operation,
IN PVOID phy_data_ptr,
IN ULONG bytes_transferred_so_far,
IN OUT PULONG total_bytes_of_transfer
);
BOOLEAN
kdi_QueueEmpty(
IN PVOID kdi_context
);
UCHAR
kdi_ReadPort(
IN PVOID kdi_context,
IN ULONG address
);
VOID
kdi_ReleaseFloppyController(
IN PVOID kdi_context
);
BOOLEAN
kdi_ReportAbortStatus(
IN PVOID kdi_context
);
VOID
kdi_ResetInterruptEvent(
IN PVOID kdi_context
);
VOID
kdi_ClearInterruptEvent(
IN PVOID kdi_context
);
VOID
kdi_ShortTimer(
IN USHORT time
);
NTSTATUS
kdi_Sleep(
IN PVOID kdi_context,
IN ULONG time
);
BOOLEAN
kdi_SetDMADirection(
IN PVOID kdi_context,
IN BOOLEAN dma_direction
);
NTSTATUS
kdi_FdcDeviceIo(
IN PDEVICE_OBJECT DeviceObject,
IN ULONG Ioctl,
IN OUT PVOID Data
);
BOOLEAN
kdi_Trakker(
IN PVOID kdi_context
);
BOOLEAN
kdi_ParallelDriveSlowRate(
IN PVOID kdi_context
);
NTSTATUS
kdi_CheckXOR(
IN USHORT xor_register
);
VOID
kdi_PopMaskTrakkerInt(
);
UCHAR
kdi_PushMaskTrakkerInt(
);
NTSTATUS
kdi_TrakkerXfer(
IN PVOID host_data_ptr,
IN ULONG trakker_address,
IN USHORT count,
IN UCHAR direction,
IN BOOLEAN in_format
);
VOID
kdi_UpdateRegistryInfo(
IN PVOID kdi_context,
IN PVOID device_descriptor,
IN PVOID device_cfg
);
VOID
kdi_WritePort(
IN PVOID kdi_context,
IN ULONG address,
IN UCHAR byte
);
#if DBG
VOID
kdi_CheckedDump(
IN ULONG debug_level,
IN PCHAR format_str,
IN ULONG_PTR argument
);
#endif
VOID
kdi_DumpDebug(
IN PVOID cqd_context
);
VOID
kdi_Nuke(
IN PVOID io_req,
IN ULONG index,
IN BOOLEAN destruct
);
ULONG
kdi_Rand(
);
VOID
kdi_SetFloppyRegisters(
IN PVOID kdi_context,
IN ULONG r_dor,
IN ULONG dor
);
ULONG
kdi_GetSystemTime(
);
VOID
kdi_QIC117ClearIRQ(
IN PVOID kdi_context
);
UCHAR
kdi_GetFDCSpeed(
IN PVOID kdi_context,
IN UCHAR dma
);
BOOLEAN
kdi_Grizzly(
IN PVOID kdi_context
);
BOOLEAN
kdi_Backpack( // a microsolutions chipset
IN PVOID kdi_context
);
NTSTATUS
kdi_GrizzlyXfer(
IN PVOID host_data_ptr, /* Address of ADI data buffer */
IN ULONG grizzly_address, /* Address of Grizzly RAM buffer */
IN USHORT count, /* Number of bytes to be transferred */
IN UCHAR direction, /* SEND_DATA or RECEIVE_DATA */
IN BOOLEAN in_format, /* TRUE if performing format operation */
IN PVOID kdi_context /* Ptr to kdi context */
);
NTSTATUS
kdi_CloseGrizzly(
);
/*****************************************************************************
*
* FILE: CQD_PUB.h
*
* PURPOSE: Public KDI->CQD entry points.
*
*****************************************************************************/
/* CQD Function Templates: ****************************************************/
BOOLEAN
cqd_CheckFormatMode(
IN PVOID cqd_context
);
NTSTATUS
cqd_ClearInterrupt(
IN PVOID cqd_context,
IN BOOLEAN expected_interrupt
);
VOID
cqd_ConfigureBaseIO(
IN PVOID cqd_context,
IN ULONG base_io
);
BOOLEAN
cqd_FormatInterrupt(
IN PVOID cqd_context
);
VOID
cqd_InitializeContext(
IN PVOID cqd_context,
IN PVOID kdi_context
);
NTSTATUS
cqd_LocateDevice(
IN PVOID cqd_context,
IN BOOLEAN *vendor_detected
);
NTSTATUS
cqd_ProcessFRB(
IN PVOID cqd_context,
IN OUT PVOID frb
);
VOID
cqd_ReportAsynchronousStatus(
IN PVOID cqd_context,
IN OUT PVOID dev_op_ptr
);
USHORT
cqd_ReportContextSize(
);
VOID
cqd_InitializeCfgInformation(
IN PVOID cqd_context,
IN PVOID dev_cfg_ptr
);
/*****************************************************************************
*
* FILE: CQD_DEFS.H
*
* PURPOSE: This file contains all of the defines required by the common driver.
*
****************************************************************************/
// Drive timeing constants
#define INTERVAL_CMD kdi_wt031ms
#define INTERVAL_WAIT_ACTIVE kdi_wt031ms
#define INTERVAL_TRK_CHANGE kdi_wt007s
#define INTERVAL_LOAD_POINT kdi_wt670s
#define INTERVAL_SPEED_CHANGE kdi_wt010s
// Drive firmware revisions
#define FIRM_VERSION_38 38 // First jumbo A firmware version
#define FIRM_VERSION_40 40 // Last jumbo A firmware version
#define FIRM_VERSION_60 60 // First jumbo B firmware version
#define FIRM_VERSION_63 63 // Cart in problems
#define FIRM_VERSION_64 64 // First Firmware version to support Skip_n_Seg through the Erase Gap
#define FIRM_VERSION_65 65 // First Firmware version to support Pegasus
#define FIRM_VERSION_80 80 // First Firmware version to support Jumbo c
#define FIRM_VERSION_87 87 // First Firmware revision to support QIC-117 C
#define FIRM_VERSION_88 88 // First Firmware revision to support no reverse seek slop
#define FIRM_VERSION_110 110 // First Firmware version to support Eagle
#define FIRM_VERSION_112 112 // First Firmware version to support QIC-117 E
#define FIRM_VERSION_128 128 // First Firmware version to support set n segments in qic 80
#define PROTOTYPE_BIT 0x80 // 8th bit in the firmware is prototype flag
// Drive status bit masks
#define STATUS_READY (UCHAR)0x01
#define STATUS_ERROR (UCHAR)0x02
#define STATUS_CART_PRESENT (UCHAR)0x04
#define STATUS_WRITE_PROTECTED (UCHAR)0x08
#define STATUS_NEW_CART (UCHAR)0x10
#define STATUS_CART_REFERENCED (UCHAR)0x20
#define STATUS_BOT (UCHAR)0x40
#define STATUS_EOT (UCHAR)0x80
// Drive config bit masks
#define CONFIG_QIC80 (UCHAR)0x80
#define CONFIG_XL_TAPE (UCHAR)0x40
#define CONFIG_SPEED (UCHAR)0x38
#define CONFIG_250KBS (UCHAR)0x00
#define CONFIG_500KBS (UCHAR)0x10
#define CONFIG_1MBS (UCHAR)0x18
#define CONFIG_2MBS (UCHAR)0x08
#define XFER_RATE_MASK (UCHAR)0x18
#define XFER_RATE_SHIFT (UCHAR)0x03
// CMS proprietary status bit masks
#define CMS_STATUS_NO_BURST_SEEK (UCHAR)0x01
#define CMS_STATUS_CMS_MODE (UCHAR)0x02
#define CMS_STATUS_THRESHOLD_LOAD (UCHAR)0x04
#define CMS_STATUS_DENSITY (UCHAR)0x08
#define CMS_STATUS_BURST_ONLY_GAIN (UCHAR)0x10
#define CMS_STATUS_PEGASUS_CART (UCHAR)0x20
#define CMS_STATUS_EAGLE (UCHAR)0x40
#define CMS_STATUS_DRIVE_MASK (UCHAR)0x48
#define CMS_STATUS_QIC_40 (UCHAR)0x08
#define CMS_STATUS_QIC_80 (UCHAR)0x00
// Tape Types
#define QIC40_SHORT (UCHAR)1 // normal length cart (205 ft)
#define QIC40_LONG (UCHAR)2 // extended length cart (310 ft)
#define QICEST_40 (UCHAR)3 // QIC-40 formatted tape (1100 ft)
#define QIC80_SHORT (UCHAR)4 // QIC-80 format 205 ft tape
#define QIC80_LONG (UCHAR)5 // QIC-80 format 310 ft tape
#define QICEST_80 (UCHAR)6 // QIC-80 formatted tape (1100 ft)
#define QIC3010_SHORT (UCHAR)7 // QIC-3010 formatted tape
#define QICEST_3010 (UCHAR)8 // QIC-3010 formatted tape (1100 ft)
#define QICFLX_3010 (UCHAR)9 // QIC-3010 formatted tape (Flexible length)
#define QIC3020_SHORT (UCHAR)9 // QIC-3020 formatted tape
#define QICEST_3020 (UCHAR)10 // QIC-3020 formatted tape (1100 ft)
#define QICFLX_3020 (UCHAR)11 // QIC-3020 formatted tape (Flexible length)
#define QIC40_XLONG (UCHAR)12 // QIC-40 format 425 ft tape
#define QIC80_XLONG (UCHAR)13 // QIC-80 format 425 ft tape
#define QICFLX_80W (UCHAR)14 // QIC-80W formatted tape (Flexible length)
#define QIC80_EXLONG (UCHAR)15 // QIC-80 format 1000 ft tape
#define QICFLX_3010_WIDE (UCHAR)16 // QIC-3010 formatted tape (Flexible length) Wide tape
#define QICFLX_3020_WIDE (UCHAR)17 // QIC-3020 formatted tape (Flexible length) Wide tape
// EQU's for QIC-40 firmware commands
#define FW_CMD_SOFT_RESET (UCHAR)1 // soft reset of tape drive
#define FW_CMD_RPT_NEXT_BIT (UCHAR)2 // report next bit (in report subcontext)
#define FW_CMD_PAUSE (UCHAR)3 // pause tape motion
#define FW_CMD_MICRO_PAUSE (UCHAR)4 // pause and microstep the head
#define FW_CMD_ALT_TIMEOUT (UCHAR)5 // set alternate command timeout
#define FW_CMD_REPORT_STATUS (UCHAR)6 // report drive status
#define FW_CMD_REPORT_ERROR (UCHAR)7 // report drive error code
#define FW_CMD_REPORT_CONFG (UCHAR)8 // report drive configuration
#define FW_CMD_REPORT_ROM (UCHAR)9 // report ROM version
#define FW_CMD_RPT_SIGNATURE (UCHAR)9 // report drive signature (model dependant diagnostic mode)
#define FW_CMD_LOGICAL_FWD (UCHAR)10 // move tape in logical forward mo
#define FW_CMD_PHYSICAL_REV (UCHAR)11 // move tape in physical reverse mode
#define FW_CMD_PHYSICAL_FWD (UCHAR)12 // move tape in physical forward mode
#define FW_CMD_SEEK_TRACK (UCHAR)13 // seek head to track position
#define FW_CMD_SEEK_LP (UCHAR)14 // seek load poSWord
#define FW_CMD_FORMAT_MODE (UCHAR)15 // enter format mode
#define FW_CMD_WRITE_REF (UCHAR)16 // write reference burst
#define FW_CMD_VERIFY_MODE (UCHAR)17 // enter verify mode
#define FW_CMD_PARK_HEAD (UCHAR)17 // park head (model dependant diagnostic mode)
#define FW_CMD_TOGGLE_PARAMS (UCHAR)17 // toggle internal modes (model dependant diagnostic mode)
#define FW_CMD_STOP_TAPE (UCHAR)18 // stop the tape
#define FW_CMD_READ_NOISE_CODE (UCHAR)18 // check noise on drive (model dependent diagnostic mode)
#define FW_CMD_MICROSTEP_UP (UCHAR)21 // microstep head up
#define FW_CMD_DISABLE_WP (UCHAR)21 // disable write protect line (model dependent diagnostic mode)
#define FW_CMD_MICROSTEP_DOWN (UCHAR)22 // microstep head down
#define FW_CMD_SET_GAIN (UCHAR)22 // set absolute drive gain (model dependant diagnostic mode)
#define FW_CMD_READ_PORT2 (UCHAR)23 // read the drive processor port 2 (diagnostic command)
#define FW_CMD_REPORT_VENDOR (UCHAR)24 // report vendor number
#define FW_CMD_SKIP_N_REV (UCHAR)25 // skip n segments reverse
#define FW_CMD_SKIP_N_FWD (UCHAR)26 // skip n segments forward
#define FW_CMD_SELECT_SPEED (UCHAR)27 // select tape speed
#define FW_CMD_DIAG_1_MODE (UCHAR)28 // enter diagnostic mode 1
#define FW_CMD_DIAG_2_MODE (UCHAR)29 // enter diagnostic mode 2
#define FW_CMD_PRIMARY_MODE (UCHAR)30 // enter primary mode
#define FW_CMD_REPORT_VENDOR32 (UCHAR)32 // report vendor number (for firmware versions > 33)
#define FW_CMD_REPORT_TAPE_STAT (UCHAR)33 // reports the tape format of the currently loaded tape
#define FW_CMD_SKIP_N_REV_EXT (UCHAR)34 // skip n segments reverse (extended format)
#define FW_CMD_SKIP_N_FWD_EXT (UCHAR)35 // skip n segments forward (extended format)
#define FW_CMD_CAL_TAPE_LENGTH (UCHAR)36 // Determine the number of seg/trk available on the tape
#define FW_CMD_REPORT_TAPE_LENGTH (UCHAR)37 // Report the number of seg/trk available on the tape
#define FW_CMD_SET_FORMAT_SEGMENTS (UCHAR)38 // Set the number of segments the drive shall use for generating index pulses
#define FW_CMD_RPT_CMS_STATUS (UCHAR)37 // report CMS status byte (model dependant - diagnostic mode)
#define FW_CMD_SET_RAM_HIGH (UCHAR)40 // set the high nibble of the ram
#define FW_CMD_SET_RAM_LOW (UCHAR)41 // set the low nibble of the ram
#define FW_CMD_SET_RAM_PTR_HIGH (UCHAR)42 // set the high nibble of the ram address
#define FW_CMD_SET_RAM_PTR_LOW (UCHAR)43 // set the low nibble of the ram address
#define FW_CMD_READ_RAM (UCHAR)44 // read tape drive RAM
#define FW_CMD_NEW_TAPE (UCHAR)45 // load tape sequence
#define FW_CMD_SELECT_DRIVE (UCHAR)46 // select the tape drive
#define FW_CMD_DESELECT_DRIVE (UCHAR)47 // deselect the tape drive
#define FW_CMD_REPORTPROTOVER (UCHAR)50 // reports firmware prototype version number (model dependant - diagnostic mode)
#define FW_CMD_DTRAIN_INFO (UCHAR)53 // enter Drive Train Information mode (model dependant - diagnostic mode)
#define FW_CMD_GDESP_INFO (UCHAR)5 // display drive train information
#define FW_CMD_CONNER_SELECT_1 (UCHAR)23 // Mountain select byte 1
#define FW_CMD_CONNER_SELECT_2 (UCHAR)20 // Mountain select byte 2
#define FW_CMD_CONNER_DESELECT (UCHAR)24 // Mountain deselect byte
#define FW_CMD_RPT_CONNER_NATIVE_MODE (UCHAR)40 // Conner Native Mode diagnostic command
#define FW_CMD_CMS_MODE_OLD (UCHAR)32 // toggle CMS mode (model dependant - diagnostic mode)
// Floppy Disk Command Bit defines
#define FIFO_MASK (UCHAR)0x0f // Mask for FIFO threshold field in config cmd
#define FDC_EFIFO (UCHAR)0x20 // Mask for disabling FIFO in config cmd
#define FDC_CLK48 (UCHAR)0x80 // Bit of config command that enables 48Mhz clocks on 82078
#define FDC_PRECOMP_ON (UCHAR)0x00 // Mask for enabling write precomp
#define FDC_PRECOMP_OFF (UCHAR)0x1C // Mask for disabling write precomp
// Floppy Disk Controller I/O Ports
#define FDC_NORM_BASE (ULONG)0x000003f0 // base for normal floppy controller
#define DCR_OFFSET (ULONG)0X00000007 // Digital control register offset
#define DOR_OFFSET (ULONG)0X00000002 // Digital-output Register offset
#define RDOR_OFFSET (ULONG)0X00000002 // Digital-output Register offset
#define MSR_OFFSET (ULONG)0X00000004 // Main Status Register offset
#define DSR_OFFSET (ULONG)0X00000004 // Data Rate Select Register offset
#define TDR_OFFSET (ULONG)0X00000003 // Tape drive register offset
#define DR_OFFSET (ULONG)0X00000005 // Data Register offset
#define DUAL_PORT_MASK (ULONG)0x00000080
// Floppy Disk Port constants
// normal drive B
#define curb 1
#define selb 0x2d // 00101101: motor B + enable DMA/IRQ/FDC + sel B
#define dselb 0x0c // 00001100: enable DMA/IRQ/FDC + sel A
// unselected drive
#define curu 0
#define selu 0x0d // 00001101: enable DMA/IRQ/FDC + sel B
#define dselu 0x0c // 00001100: enable DMA/IRQ/FDC + sel A
// normal drive D
#define curd 3
#define seld 0x8f // 10001111: motor D + enable DMA/IRQ/FDC + sel D
#define dseld 0x0e // 00001110 motor D + enable DMA/IRQ/FDC + sel C
// laptop unselected drive
#define curub 0
#define selub 0x2d // 00101101: motor B + enable DMA/IRQ/FDC + sel B
#define dselub 0x0c // 00001100: enable DMA/IRQ/FDC + sel A
#define alloff 0x08 // no motor + enable DMA/IRQ + disable FDC + sel A
#define fdc_idle 0x0c // no motor + enable DMA/IRQ/FDC + sel A
#define DRIVE_ID_MASK 0x03
#define DRIVE_SELECT_OFFSET 0x05
#define DRIVE_SPECIFICATION 0x8E
#define DRIVE_SPEC 0x08
#define DONE_MARKER 0xC0
// Floppy configuration parameters
#define FMT_DATA_PATTERN 0x6b // Format data pattern
#define FDC_FIFO 15 // FIFO size for an 82077
#define FDC_HLT 0x02 // FDC head load time
#define FMT_GPL 233 // gap length for format (QIC-40 QIC-80)
#define FMT_GPL_3010 241 // gap length for format (QIC-3010)
#define FMT_GPL_3020 248 // gap length for format (QIC-3020)
#define WRT_GPL 1 // gap length for write (QIC-40 QIC-80 QIC-3010 QIC-3020)
#define FMT_BPS 03 // bytes per sector for formatting(1024)
#define WRT_BPS FMT_BPS // bytes per sector for reading/writing (1024)
#define FSC_SEG 32 // floppy sectors per segment (QIC-40 205ft & 310ft)
#define SEG_FTK 4 // segments per floppy track (QIC-40 205ft & 310ft)
#define FSC_FTK (FSC_SEG*SEG_FTK) // floppy sectors per floppy track (QIC-40 205ft & 310ft)
#define SEG_TTRK_40 68 // segments per tape track (QIC-40 205ft)
#define SEG_TTRK_40L 102 // segments per tape track (QIC-40 310ft)
#define SEG_TTRK_40XL 141 // segments per tape track (QIC-40 425ft)
#define SEG_TTRK_80 100 // segments per tape track (QIC-80 205ft)
#define SEG_TTRK_80L 150 // segments per tape track (QIC-80 310ft)
#define SEG_TTRK_80W 365 // segments per tape track (QIC-80 310ft)
#define SEG_TTRK_80XL 207 // segments per tape track (QIC-80 425ft)
#define SEG_TTRK_80EX 490 // segments per tape track (QIC-80 1000ft)
#define SEG_TTRK_QICEST_40 365 // segments per tape track (QIC-40 QICEST)
#define SEG_TTRK_QICEST_80 537 // segments per tape track (QIC-80 QICEST)
#define SEG_TTRK_3010 800 // segments per tape track (QIC-3010 1000ft)
#define SEG_TTRK_3020 1480 // segments per tape track (QIC-3020 1000ft)
#define SEG_TTRK_3010_400ft 300 // segments per tape track (QIC-3010 400ft)
#define SEG_TTRK_3020_400ft 422 // segments per tape track (QIC-3020)
#define FTK_FSD_40 170 // floppy tracks per floppy side (QIC-40 205ft)
#define FTK_FSD_40L 255 // floppy tracks per floppy side (QIC-40 310ft)
#define FTK_FSD_40XL 170 // floppy tracks per floppy side (QIC-40 425ft)
#define FTK_FSD_80 150 // floppy tracks per floppy side (QIC-80 205ft)
#define FTK_FSD_80L 150 // floppy tracks per floppy side (QIC-80 310ft)
#define FTK_FSD_80XL 150 // floppy tracks per floppy side (QIC-80 425ft)
#define FTK_FSD_QICEST_40 254 // floppy tracks per floppy side (QIC-40 QICEST)
#define FTK_FSD_QICEST_80 254 // floppy tracks per floppy side (QIC-80 QICEST)
#define FTK_FSD_FLEX80 255 // floppy tracks per floppy side (QIC-80 Flexible)
#define FTK_FSD_3010 255 // floppy tracks per floppy side (QIC-3010)
#define FTK_FSD_3020 255 // floppy tracks per floppy side (QIC-3020)
#define NUM_TTRK_40 20 // number of tape tracks (QIC-40 205ft & 310ft)
#define NUM_TTRK_80 28 // number of tape tracks (QIC-40 205ft & 310ft)
#define NUM_TTRK_80W 36 //
#define NUM_TTRK_3010 40 // number of tape tracks (QIC-3010)
#define NUM_TTRK_3020 40 // number of tape tracks (QIC-3020)
#define NUM_TTRK_3010W 50 // number of tape tracks (QIC-3010 wide)
#define NUM_TTRK_3020W 50 // number of tape tracks (QIC-3020 wide)
#define PHY_SECTOR_SIZE (USHORT)1024 // number of bytes per sector
#define ECC_SEG (UCHAR)3 // ecc sectors per segment
#define MAX_FDC_SEEK (USHORT)128
// Tape Format Types and lengths/Coercivity
#define QIC_UNKNOWN 0 // Unknown Tape Format and Length
#define QIC_40 1 // QIC-40 Tape Format
#define QIC_80 2 // QIC-80 Tape Format
#define QIC_3020 3 // QIC-3020 Tape Format
#define QIC_3010 4 // QIC-3010 Tape Format
#define QIC_SHORT 1 // Length = 205 & Coercivity = 550 Oe
// or Length = 425 & Coercivity = 550 Oe
#define QIC_LONG 2 // Length = 307.5 & Coercivity = 550 Oe
#define QIC_SHORT_900 3 // Length = 295 & Coercivity = 900 Oe
#define QICEST 4 // Length = 1100 & Coercivity = 550 Oe
#define QICEST_900 5 // Length = 1100 & Coercivity = 900 Oe
#define QIC_FLEXIBLE_550_WIDE 0x0B // Flexible format tape 550 Oe Wide tape
#define QIC_FLEXIBLE_900 6 // Flexible format tape 900 Oe
#define QIC_FLEXIBLE_900_WIDE 0x0E // Flexible format tape 900 Oe Wide tape
// Floppy disk controller misc constants
// 82077 version number
#define VALID_NEC_FDC 0x90 // version number
#define NSC_PRIMARY_VERSION 0x70 // National 8477 verion number
#define NSC_MASK 0xF0 // mask for National version number
#define FDC_82078_44_MASK 0x40 // mask for 82078 44 pin part id
#define FDC_DCR_MASK 0x03 // mask for fdc's configuration control register xfer rates
#define FDC_CONFIG_NULL_BYTE 0x00
#define FDC_CONFIG_PRETRACK 0x00
// main status register
#define MSR_RQM 0x80 // request for master
#define MSR_DIO 0x40 // data input/output (0=input, 1=output)
#define MSR_EXM 0x20 // execution mode
#define MSR_CB 0x10 // FDC busy
#define MSR_D3B 0x08 // FDD 3 busy
#define MSR_D2B 0x04 // FDD 2 busy
#define MSR_D1B 0x02 // FDD 1 busy
#define MSR_D0B 0x01 // FDD 0 busy
// status register 0
#define ST0_IC 0xC0 // Interrupt code (00=Normal, 01=Abnormal, 10=Illegal cmd, 11=Abnormal)
#define ST0_SE 0x20 // Seek end
#define ST0_EC 0x10 // Equipment check
#define ST0_NR 0x08 // Not Ready
#define ST0_HD 0x04 // Head Address
#define ST0_US 0x03 // Unit Select (0-3)
// status register 1
#define ST1_EN 0x80 // End of Cylinder
#define ST1_DE 0x20 // Data Error (CRC error)
#define ST1_OR 0x10 // Over Run
#define ST1_ND 0x04 // No Data
#define ST1_NW 0x02 // Not Writable (write protect error)
#define ST1_MA 0x01 // Missing Address Mark
// status register 2
#define ST2_CM 0x40 // Control Mark (Deleted Data Mark)
#define ST2_DD 0x20 // Data Error in Data Field
#define ST2_WC 0x10 // Wrong Cylinder
#define ST2_SH 0x08 // Scan Equal Hit
#define ST2_SN 0x04 // Scan Not Satisfied
#define ST2_BC 0x02 // Bad Cylinder
#define ST2_MD 0x01 // Missing Address Mark in Data Field
// status register 3
#define ST3_FT 0x80 // Fault
#define ST3_WP 0x40 // Write Protected
#define ST3_RY 0x20 // Ready
#define ST3_T0 0x10 // Track 0
#define ST3_TS 0x08 // Two Side
#define ST3_HD 0x04 // Head address
#define ST3_US 0x03 // Unit Select (0-3)
// Misc. constants
#define FWD 0 // seek in the logical forward direction
#define REV 1 // seek in the logical reverse direction
#define STOP_LEN 5 // approximate number of blocks used to stop the tape
#define SEEK_SLOP 3 // number of blocks to overshoot at high speed in a seek
#define SEEK_TIMED 0x01 // Perform a timed seek
#define SEEK_SKIP 0x02 // perform a skip N segemnts seek
#define SEEK_SKIP_EXTENDED 0x03 // perform an extended skip N segemnts seek
// number of blocks to overshoot when performing a high speed reverve seek
#define QIC_REV_OFFSET 3
#define QIC_REV_OFFSET_L 4
#define QICEST_REV_OFFSET 14
#define MAX_SKIP 255 // Max number of segments that a Skip N Segs command can skip
#define MAX_SEEK_NIBBLES 3 // Maximum number of nibbles in an extended mode seek
#define TRACK_0 (UCHAR)0
#define TRACK_5 (UCHAR)5
#define TRACK_7 (UCHAR)7
#define TRACK_9 (UCHAR)9
#define TRACK_11 (UCHAR)11
#define TRACK_13 (UCHAR)13
#define TRACK_15 (UCHAR)15
#define TRACK_17 (UCHAR)17
#define TRACK_19 (UCHAR)19
#define TRACK_21 (UCHAR)21
#define TRACK_23 (UCHAR)23
#define TRACK_25 (UCHAR)25
#define TRACK_27 (UCHAR)27
#define ILLEGAL_TRACK (USHORT)0xffff
#define ODD_TRACK (USHORT)0x0001
#define EVEN_TRACK (USHORT)0x0000
#define ALL_BAD (ULONG)0xffffffff
#define QIC3010_OFFSET (ULONG)2
#define QIC3020_OFFSET (ULONG)4
#define NUM_BAD 10 // number of bad READ ID's in row for no_data error
#define OR_TRYS 10 // number of Over Runs ignored per block (system 50)
#define PRIMARY_MODE 0 // tape drive is in primary mode
#define FORMAT_MODE 1 // tape drive is in format mode
#define VERIFY_MODE 2 // tape drive is in verify mode
#define DIAGNOSTIC_1_MODE 3 // tape drive is in diagnostic mode 1
#define DIAGNOSTIC_2_MODE 4 // tape drive is in diagnostic mode 2
#define READ_BYTE 8 // Number of Bytes to receive from the tape
#define READ_WORD 16 // drive during communication.
#define HD_SELECT 0x01 // High Density Select bit from the PS/2 DCR
#define TAPE_250Kbps 0 // Program drive for 250 Kbps transfer rate
#define TAPE_2Mbps 1 // Program drive for 2Mbps transfer rate
#define TAPE_500Kbps 2 // Program drive for 500 Kbps transfer rate
#define TAPE_1Mbps 3 // Program drive for 1 Mbps transfer rate
#define FDC_250Kbps 2 // Program FDC for 250 Kbps transfer rate
#define FDC_500Kbps 0 // Program FDC for 500 Kbps transfer rate
#define FDC_1Mbps 3 // Program FDC for 1 Mbps transfer rate
#define FDC_2Mbps 1 // Program FDC for 2 Mbps transfer rate
#define SRT_250Kbps 0xff // FDC step rate for 250 Kbps transfer rate
#define SRT_500Kbps 0xef // FDC step rate for 500 Kbps transfer rate
#define SRT_1Mbps 0xcf // FDC step ratefor 1 Mbps transfer rate
#define SRT_2Mbps 0x8f // FDC step rate for 2 Mbps transfer rate
#define SPEED_MASK 0x03 // FDC speed mask for lower bits
#define FDC_2MBPS_TABLE 2 // 2 Mbps data rate table for the 82078
#define CMS_SIG 0xa5 // drive signature for CMS drives
#define CMS_VEND_NO_OLD 0x0047 // CMS vendor number old
#define CMS_VEND_NO_NEW 0x11c0 // CMS vendor number new
#define CMS_QIC40 0x0000 // CMS QIC40 Model #
#define CMS_QIC80 0x0001 // CMS QIC80 Model #
#define CMS_QIC3010 0x0002 // CMS QIC3010 Model #
#define CMS_QIC3020 0x0003 // CMS QIC3020 Model #
#define CMS_QIC80_STINGRAY 0x0004 // CMS QIC80 STINGRAY Model #
#define CMS_QIC80W 0x0005 // CMS QIC80W Model #
#define CMS_TR3 0x0006 // CMS TR3 Model #
#define EXABYTE_VEND_NO 0x0380 // Summit vendor number
#define SUMMIT_VEND_NO 0x0180 // Summit vendor number
#define IOMEGA_VEND_NO 0x8880 // Iomega vendor number
#define WANGTEK_VEND_NO 0x01c0 // Wangtek vendor number
#define TECHMAR_VEND_NO 0x01c0 // Techmar vendor number
#define CORE_VEND_NO 0x0000 // Core vendor number
#define CONNER_VEND_NO_OLD 0x0005 // Conner vendor number (old mode)
#define CONNER_VEND_NO_NEW 0x0140 // Conner vendor number (new mode)
#define VENDOR_MASK 0xffc0 // Vendor id mask
#define IOMEGA_QIC80 0x0000 // Iomega QIC80 Model #
#define IOMEGA_QIC3010 0x0001 // Iomega QIC3010 Model #
#define IOMEGA_QIC3020 0x0002 // Iomega QIC3020 Model #
#define SUMMIT_QIC80 0x0001 // Summit QIC80 Model #
#define SUMMIT_QIC3010 0x0015 // Summit QIC 3010 Model #
#define WANGTEK_QIC80 0x000a // Wangtek QIC80 Model #
#define WANGTEK_QIC40 0x0002 // Wangtek QIC40 Model #
#define WANGTEK_QIC3010 0x000C // Wangtek QIC3010 Model #
#define CORE_QIC80 0x0021 // Core QIC80 Model #
#define TEAC_VEND_NO 0x03c0 // TEAC vendor number
#define TEAC_TR1 0x000e // TEAC TR-1 Model
#define TEAC_TR2 0x000f // TEAC TR-2 Model
#define GIGATEC_VEND_NO 0x0400
#define COMBYTE_VEND_NO 0x0440
#define PERTEC_VEND_NO 0x0480
#define PERTEC_TR1 0x0001 // TR-1 drive
#define PERTEC_TR2 0x0002 // TR-2 drive
#define PERTEC_TR3 0x0003 // TR-3 drive
// Conner Native mode defines
#define CONNER_500KB_XFER 0x0400 // 500 KB xfer rate
#define CONNER_1MB_XFER 0x0800 // 1 MB xfer rate
#define CONNER_20_TRACK 0x0001 // Drive supports 20 tracks
#define CONNER_28_TRACK 0x000e // Drive supports 28 tracks
#define CONNER_40_TRACK 0x0020 // Drive supports 40 tracks
#define CONNER_MODEL_5580 0x0002 // Conner Model 5580 series (Hornet)
#define CONNER_MODEL_XKE 0x0004 // Conner 11250 series (1" drives) XKE
#define CONNER_MODEL_XKEII 0x0008 // Conner 11250 series (1" drives) XKEII
#define FDC_INVALID_CMD 0x80 // invalid cmd sent to FDC returns this value
#define RTIMES 3 // times to retry on a read of a sector (retry mode)
#define NTIMES 2 // times to retry on a read of a sector (normaly)
#define WTIMES 10 // times to retry on a write of a sector
#define VTIMES 0 // times to retry on verify
#define ANTIMES 0
#define ARTIMES 6
#define DRIVE_SPEC_SAVE 2 // sizeof the drive spec save command
#define INTEL_MASK 0xe0
#define INTEL_44_PIN_VERSION 0x40
#define INTEL_64_PIN_VERSION 0x00
#define FIND_RETRIES 2
#define REPORT_RPT 6 // Number of times to attempt drive communication when
// an ESD induced error is suspected.
//
// Kurt changed the timeout count for program/read nec from 40 to 20000
// This was done because the kdi_ShortTimer was removed from these routines
// Microsoft's floppy driver does NOT use a timer and works, so
// this fix is being tested in M8 Windows 95 beta. If it does not work,
// then we probably need to change it back (see read/program NEC).
#define FDC_MSR_RETRIES 50 // Number of times to read the FDC Main
#define DRIVEA 0
#define DRIVEB 1
#define DRIVEC 2
#define DRIVED 3
#define DRIVEU 4
#define DRIVEUB 5
#define DISABLE_PRECOMP 1 // Value used by the 82078's Drive Spec
// command to disable Precomp
#define FDC_BOOT_MASK 0x06 // Mask used to isolate the Boot Select
// Bits in the TDR Register
#define MAX_SEEK_COUNT_SKIP 10
#define MAX_SEEK_COUNT_TIME 10
#define WRITE_REF_RPT 2
#define _DISK_RESET 0
#define WRITE_PROTECT_MASK 0x20 // bit from byte from port 2 of the jumbo B
// processor that indicates write protect
// Constants for sense_speed algorithm
// These ranges are based on 1.5 sec @ 250kb. The units are 54.95ms (1 IBM PC
// timer tick (18.2 times a second)) and are +-1 tick from nominal due to time
// base fluctuation (in FDC and IBM PC TIMER).
// The threshold for the 750kb transfer rate is < 11 ticks due to the
// uncertaSWordy of this future transfer rate.
// If a transfer rate of 750kb is needed code MUST be added to verify that
// 750kb does exist
#define sect_cnt 35 // .04285 sec. per sector * 35 = 1.4997 sec.
#define MIN1000 0
#define MAX1000 11
#define MIN500 12
#define MAX500 15
#define MIN250 26
#define MAX250 29
// Array indices and size for the time_out array. The time out array contains the *
// time outs for the QIC-117 commands.
#define L_SLOW 0
#define L_FAST 1
#define PHYSICAL 2
#define TIME_OUT_SIZE 3
// Constants for the arrays defined in the S_O_DGetInfo structure
#define OEM_LENGTH 20
#define SERIAL_NUM_LENGTH 4
#define MAN_DATE_LENGTH 2
#define PEGASUS_START_DATE 517
#define PLACE_OF_ORIGIN_LENGTH 2
// Constant for the array dimension used in q117i_HighSpeedSeek
#define FOUR_NIBS 4
// Constants for identifing bytes in a word array
#define LOW_BYTE 0
#define HI_BYTE 1
#define DCOMFIRM_MAX_BYTES 10 // Max number of SBytes in a DComFirm string
#define FDC_ISR_RESET_THRESHOLD 20
#define SINGLE_BYTE (UCHAR)0x01
#define REPORT_BYTE (UCHAR)0x08 // Number of Bits to receive from the tape
#define REPORT_WORD (UCHAR)0x10 // drive during communication.
#define DATA_BIT (USHORT)0x8000 // data bit to or into the receive word
#define SINGLE_SHIFT (USHORT)0x0001 // number of bits to shift the receive data when adding a bit
#define NIBBLE_SHIFT (USHORT)0x0004 // number of bits to shift the receive data when adding a bit
#define BYTE_SHIFT (USHORT)0x0008 // number of bits to shift the receive data when size is byte
#define NIBBLE_MASK (USHORT)0x000f
#define BYTE_MASK (USHORT)0x00ff // byte mask
#define SEGMENT_MASK 0x1f
// Various addresses used as arguments in the set ram command for the Sankyo
// motor fix hack
#define DOUBLE_HOLE_CNTR_ADDRESS 0x5d
#define HOLE_FLAG_BYTE_ADDRESS 0x48
#define TAPE_ZONE_ADDRESS 0x68
// Miscellaneous defines used in the Sankyo Motor fix hack
#define REVERSE 0
#define FORWARD 1
#define HOLE_INDICATOR_MASK 0X40
#define EOT_ZONE_COUNTER 0x29
#define BOT_ZONE_COUNTER 0x23
#define FDC_TDR_MASK 0x03 // mask for 82077aa tdr test
#define FDC_REPEAT 0x04 // number of times to loop through the tdr test
#define CMD_OFFSET (UCHAR)0x02
#define MAX_FMT_NIBBLES 3
#define MAX_FDC_STATUS 16
#define CLOCK_48 (UCHAR)0x80
// Toggle parameter command arguements
#define WRITE_EQ 0
#define AUTO_FILTER_PROG 1
#define AGC_ENABLE 2
#define DISABLE_FIND_BOT 3
#define WRITE_DATA_DELAY_ENABLE 4
#define REF_HEAD_ON_AUTOLOAD 5
#define DRIVE_CLASS 6
#define CUE_INDEX_PULSE_SHUTOFF 7
#define CMS_MODE 8
#define SEG_LENGTH_80W (ULONG)246 // unit in inches * 10
#define SEG_LENGTH_3010 (ULONG)165 // unit in inches * 10
#define SEG_LENGTH_3020 (ULONG)84 // unit in inches * 10
#define SPEED_SLOW_30n0 (ULONG)226
#define SPEED_FAST_30n0 (ULONG)452
#define SPEED_PHYSICAL_30n0 (ULONG)900
#define SPEED_TOLERANCE (ULONG)138
#define SPEED_FACTOR (ULONG)100
#define SPEED_ROUNDING_FACTOR (ULONG)50
// Perpendicular mode setup values
#define PERP_OVERWRITE_ON (UCHAR)0x80
#define PERP_WGATE_ON (UCHAR)0x01
#define PERP_GAP_ON (UCHAR)0x02
#define PERP_SELECT_SHIFT (UCHAR)0x02
// Misc format defines
#define HDR_1 (USHORT)0
#define HDR_2 (USHORT)1
#define MAX_HDR_BLOCKS (USHORT)2
#define CQD_DMA_PAGE_SIZE (ULONG)0x00000800
// Select Format defines, from QIC117 spec, command 27
#define SELECT_FORMAT_80 (UCHAR)0x09
#define SELECT_FORMAT_80W (UCHAR)0x0b
#define SELECT_FORMAT_3010 (UCHAR)0x11
#define SELECT_FORMAT_3010W (UCHAR)0x13
#define SELECT_FORMAT_3020 (UCHAR)0x0d
#define SELECT_FORMAT_3020W (UCHAR)0x0f
#define SELECT_FORMAT_UNSUPPORTED (UCHAR)0x00
// Issue Diagnostic defines
#define DIAG_WAIT_CMD_COMPLETE (UCHAR)0xff
#define DIAG_WAIT_INTERVAL (UCHAR)0xfe
#define DIAG_NO_PAUSE_RECEIVE (UCHAR)0xfd
/****************************************************************************
*
* FILE: CQD_STRC.H
*
* PURPOSE: This file contains all of the structures
* required by the common driver.
*
*****************************************************************************/
#pragma pack(1)
typedef struct _TAPE_FORMAT_LENGTH {
UCHAR format; // Format of the tape
UCHAR length; // Length of the tape
} TAPE_FORMAT_LENGTH, *PTAPE_FORMAT_LENGTH;
//
// 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 _FDC_CMD_READ_DATA {
UCHAR command; // command UCHAR
UCHAR drive; // drive specifier
UCHAR C; // cylinder number
UCHAR H; // head address
UCHAR R; // record (sector number)
UCHAR N; // number of UCHARs per sector
UCHAR EOT; // end of track
UCHAR GPL; // gap length
UCHAR DTL; // data length
} FDC_CMD_READ_DATA, *PFDC_CMD_READ_DATA;
typedef struct _FDC_CMD_READ_ID {
UCHAR command; // command byte
UCHAR drive; // drive specifier
} FDC_CMD_READ_ID, *PFDC_CMD_READ_ID;
typedef struct _FDC_CMD_FORMAT {
UCHAR command; // command byte
UCHAR drive; // drive specifier
UCHAR N; // number of bytes per sector
UCHAR SC; // sectors per track (segment)
UCHAR GPL; // gap length
UCHAR D; // format filler byte
} FDC_CMD_FORMAT, *PFDC_CMD_FORMAT;
typedef struct _FDC_CMD_SENSE_INTERRUPT_STATUS {
UCHAR command; // command byte
} FDC_CMD_SENSE_INTERRUPT_STATUS, *PFDC_CMD_SENSE_INTERRUPT_STATUS;
typedef struct _FDC_CMD_VERSION {
UCHAR command; // command byte
} FDC_CMD_VERSION, *PFDC_CMD_VERSION;
typedef struct _FDC_CMD_SPECIFY {
UCHAR command; // command byte
UCHAR SRT_HUT; // step rate time (bits 7-4)
// head unload time bits (3-0)
UCHAR HLT_ND; // head load time (bits 7-1)
// non-DMA mode flag (bit 0)
} FDC_CMD_SPECIFY, *PFDC_CMD_SPECIFY;
typedef struct _FDC_CMD_SENSE_DRIVE_STATUS {
UCHAR command; // command byte
UCHAR drive; // drive specifier
} FDC_CMD_SENSE_DRIVE_STATUS, *PFDC_CMD_SENSE_DRIVE_STATUS;
typedef struct _FDC_CMD_RECALIBRATE {
UCHAR command; // command byte
UCHAR drive; // drive specifier
} FDC_CMD_RECALIBRATE, *PFDC_CMD_RECALIBRATE;
typedef struct _FDC_CMD_SEEK {
UCHAR cmd; // command byte
UCHAR drive; // drive specifier
UCHAR NCN; // new cylinder number
} FDC_CMD_SEEK, *PFDC_CMD_SEEK;
typedef struct _FDC_CMD_CONFIGURE {
UCHAR cmd; // command byte
UCHAR czero; // null byte
UCHAR config; // FDC configuration info (EIS EFIFO POLL FIFOTHR)
UCHAR pretrack; // Pre-compensation start track number
} FDC_CMD_CONFIGURE, *PFDC_CMD_CONFIGURE;
typedef struct _FDC_CMD_INVALID {
UCHAR command; // command byte
} FDC_CMD_INVALID, *PFDC_CMD_INVALID;
typedef struct _FDC_STATUS {
UCHAR ST0; // status register 0
UCHAR ST1; // status register 1
UCHAR ST2; // status register 2
UCHAR C; // cylinder number
UCHAR H; // head address
UCHAR R; // record (sector number)
UCHAR N; // number of bytes per sector
} FDC_STATUS, *PFDC_STATUS;
typedef struct _FDC_RESULT {
UCHAR ST0; // status register 0
UCHAR PCN; // present cylinder number
} FDC_RESULT, *PFDC_RESULT;
typedef struct _FDC_CMD_PERPENDICULAR_MODE {
UCHAR command;
UCHAR perp_setup;
} FDC_CMD_PERPENDICULAR_MODE, *PFDC_CMD_PERPENDICULAR_MODE;
// This command is only valid on the 82078 64 pin Enhanced controller
typedef struct _FDC_CMD_DRIVE_SPECIFICATION {
UCHAR command;
UCHAR drive_spec;
UCHAR done;
} FDC_CMD_DRIVE_SPECIFICATION, *PFDC_CMD_DRIVE_SPECIFICATION;
typedef struct _FDC_CMD_SAVE {
UCHAR command;
} FDC_CMD_SAVE, *PFDC_CMD_SAVE;
typedef struct _FDC_SAVE_RESULT {
UCHAR clk48;
UCHAR reserved2;
UCHAR reserved3;
UCHAR reserved4;
UCHAR reserved5;
UCHAR reserved6;
UCHAR reserved7;
UCHAR reserved8;
UCHAR reserved9;
UCHAR reserved10;
UCHAR reserved11;
UCHAR reserved12;
UCHAR reserved13;
UCHAR reserved14;
UCHAR reserved15;
UCHAR reserved16;
} FDC_SAVE_RESULT, *PFDC_SAVE_RESULT;
// FDC Sector Header Data used for formatting
typedef union U_FormatHeader {
struct {
UCHAR C; // cylinder number
UCHAR H; // head address
UCHAR R; // record (sector number)
UCHAR N; // bytes per sector
} hdr_struct;
ULONG hdr_all;
} FormatHeader, *FormatHeaderPtr;
#pragma pack()
// Tape Drive Parameters
typedef struct S_DriveParameters {
UCHAR seek_mode; // seek mode supported by the drive
CHAR mode; // drive mode (Primary, Format, Verify)
USHORT conner_native_mode; // Conner Native Mode Data
} DriveParameters, *DriveParametersPtr;
// Tape Parameters
typedef struct S_FloppyTapeParameters {
USHORT fsect_seg; // floppy sectors per segment
USHORT seg_ftrack; // segments per floppy track
USHORT fsect_ftrack; // floppy sectors per floppy track
USHORT rw_gap_length; // write gap length
USHORT ftrack_fside; // floppy tracks per floppy side
ULONG fsect_fside; // floppy sectors per floppy side
ULONG log_sectors; // number of logical sectors on a tape
ULONG fsect_ttrack; // floppy sectors per tape track
UCHAR tape_rates; // supported tape transfer rates
UCHAR tape_type; // tape type
TAPE_FORMAT_LENGTH tape_status;
ULONG 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 {
UCHAR tape; // Program tape drive slow (250 or 500 Kbps)
UCHAR fdc; // Program FDC slow (250 or 500 Kbps)
UCHAR srt; // FDC step rate for slow xfer rate
} TransferRate, *TransferRatePtr;
struct S_FormatParameters {
UCHAR cylinder; // floppy cylinder number
UCHAR head; // floppy head number
UCHAR sector; // floppy sector number
UCHAR NCN; // new cylinder number
ULONG *hdr_ptr[2]; // pointer to sector id data for format
ULONG hdr_offset[2]; // offset of header_ptr
ULONG *phy_ptr; // pointer to physical sector id data for format
USHORT current_hdr; // current format hdr
USHORT next_hdr; // next format hdr
NTSTATUS 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 {
ULONG dcr;
ULONG dr;
ULONG msr;
ULONG dsr;
ULONG tdr;
ULONG dor;
ULONG r_dor;
BOOLEAN dual_port;
} FDCAddress, *FDCAddressPtr;
typedef struct S_FDControllerData {
FDCAddress fdc_addr;
FDC_CMD_FORMAT fmt_cmd;
FDC_STATUS fdc_stat;
USHORT isr_reentered;
BOOLEAN command_has_result_phase;
UCHAR number_of_tape_drives;
UCHAR fdc_pcn;
UCHAR fifo_byte;
BOOLEAN perpendicular_mode;
BOOLEAN start_format_mode;
BOOLEAN end_format_mode;
} FDControllerData, *FDControllerDataPtr;
typedef struct S_TapeOperationStatus {
ULONG bytes_transferred_so_far;
ULONG total_bytes_of_transfer;
ULONG cur_lst;
USHORT data_amount;
USHORT s_count;
USHORT no_data;
USHORT d_amt;
USHORT retry_count;
USHORT retry_times;
ULONG d_segment; // desired tape segment, (floppy track)
USHORT d_track; // desired physical tape track
UCHAR d_ftk;
UCHAR d_sect;
UCHAR d_head;
UCHAR retry_sector_id;
UCHAR seek_flag;
UCHAR s_sect;
BOOLEAN log_fwd; // indicates that the tape is going logical forward
BOOLEAN bot;
BOOLEAN 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;
PVOID kdi_context;
USHORT retry_seq_num;
UCHAR firmware_cmd;
UCHAR firmware_error;
UCHAR firmware_version;
UCHAR drive_type;
UCHAR device_unit;
UCHAR drive_on_value;
UCHAR deselect_cmd;
UCHAR drv_stat;
ULONG media_change_count;
BOOLEAN configured;
BOOLEAN selected;
BOOLEAN cmd_selected;
BOOLEAN no_pause;
BOOLEAN cms_mode;
BOOLEAN persistent_new_cart;
BOOLEAN pegasus_supported;
BOOLEAN trakker;
#if DBG
#define DBG_SIZE (1024*4)
ULONG dbg_command[DBG_SIZE];
ULONG dbg_head;
ULONG dbg_tail;
BOOLEAN dbg_lockout;
#endif
} CqdContext, *CqdContextPtr;
#if DBG
#define DBG_ADD_ENTRY(dbg_level, dbg_context, data) \
if (((dbg_level) & kdi_debug_level) != 0 && \
(((kdi_debug_level & QIC117BYPASSLOCKOUT) == 0) || (dbg_context)->dbg_lockout == 0)) {\
(dbg_context)->dbg_command[(dbg_context)->dbg_tail] = (data); \
(dbg_context)->dbg_tail = ((dbg_context)->dbg_tail + 1) % DBG_SIZE; \
}
#else
#define DBG_ADD_ENTRY(dbg_level, dbg_context, data)
#endif
/*****************************************************************************
*
* FILE: CQD_HDRI.H
*
* PURPOSE: This file contains all of the headers for the common driver.
*
*****************************************************************************/
/* CQD Function Templates: **************************************************/
NTSTATUS
cqd_CmdReportStatus(
IN CqdContextPtr cqd_context,
IN DeviceOpPtr dev_op_ptr
);
NTSTATUS
cqd_CmdRetension(
IN CqdContextPtr cqd_context,
OUT PULONG segments_per_track
);
NTSTATUS
cqd_CmdSetSpeed(
IN CqdContextPtr cqd_context,
IN UCHAR tape_speed
);
NTSTATUS
cqd_CmdReportDeviceCfg(
IN CqdContextPtr cqd_context,
IN DriveCfgDataPtr drv_cfg
);
NTSTATUS
cqd_CmdUnloadTape(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_DeselectDevice(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_Seek(
IN CqdContextPtr cqd_context
);
VOID
cqd_CmdDeselectDevice(
IN CqdContextPtr cqd_context,
IN BOOLEAN drive_selected
);
NTSTATUS
cqd_GetFDCType(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_ConfigureDevice(
IN CqdContextPtr cqd_context
);
VOID
cqd_GetRetryCounts(
IN CqdContextPtr cqd_context,
IN USHORT command
);
NTSTATUS
cqd_NextTry(
IN CqdContextPtr cqd_context,
IN USHORT command
);
NTSTATUS
cqd_CmdFormat(
IN CqdContextPtr cqd_context,
IN FormatRequestPtr fmt_request
);
NTSTATUS
cqd_GetDeviceInfo(
IN CqdContextPtr cqd_context,
IN BOOLEAN report_failed,
IN USHORT vendor_id
);
NTSTATUS
cqd_DoReadID(
IN CqdContextPtr cqd_context,
IN ULONG read_id_delay,
IN PFDC_STATUS read_id_status
);
NTSTATUS
cqd_GetDeviceError(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_GetDeviceType(
IN CqdContextPtr cqd_context,
IN BOOLEAN vendor_detected
);
NTSTATUS
cqd_FormatTrack(
IN CqdContextPtr cqd_context,
IN USHORT track
);
NTSTATUS
cqd_CmdReportDeviceInfo(
IN CqdContextPtr cqd_context,
IN DeviceInfoPtr device_info
);
NTSTATUS
cqd_LookForDevice(
IN CqdContextPtr cqd_context,
IN UCHAR drive_selector,
IN BOOLEAN *vendor_detected,
IN BOOLEAN *found
);
NTSTATUS
cqd_ChangeTrack(
IN CqdContextPtr cqd_context,
IN USHORT destination_track
);
NTSTATUS
cqd_LogicalBOT(
IN CqdContextPtr cqd_context,
IN USHORT destination_track
);
NTSTATUS
cqd_ConnerPreamble(
IN CqdContextPtr cqd_context,
IN BOOLEAN select
);
NTSTATUS
cqd_RWTimeout(
IN CqdContextPtr cqd_context,
IN OUT DeviceIOPtr io_request,
OUT NTSTATUS *drv_status
);
NTSTATUS
cqd_HighSpeedSeek(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_GetStatus(
IN CqdContextPtr cqd_context,
OUT PUCHAR status_register_3
);
NTSTATUS
cqd_CmdReadWrite(
IN CqdContextPtr cqd_context,
IN OUT DeviceIOPtr io_request
);
NTSTATUS
cqd_ReadIDRepeat(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_CmdLoadTape(
IN CqdContextPtr cqd_context,
IN LoadTapePtr load_tape_ptr
);
VOID
cqd_NextGoodSectors(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_PauseTape(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_CmdSelectDevice(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_SendPhantomSelect(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_RWNormal(
IN CqdContextPtr cqd_context,
IN OUT DeviceIOPtr io_request,
OUT NTSTATUS *drv_status
);
NTSTATUS
cqd_ReadFDC(
IN CqdContextPtr cqd_context,
OUT UCHAR *drv_status,
OUT USHORT length
);
NTSTATUS
cqd_SetDeviceMode(
IN CqdContextPtr cqd_context,
IN UCHAR mode
);
NTSTATUS
cqd_ProgramFDC(
IN CqdContextPtr cqd_context,
IN PUCHAR command,
IN USHORT length,
IN BOOLEAN result
);
NTSTATUS
cqd_IssueFDCCommand(
IN CqdContextPtr cqd_context,
IN PUCHAR FifoIn,
IN PUCHAR FifoOut,
IN PVOID IoHandle,
IN ULONG IoOffset,
IN ULONG TransferBytes,
IN ULONG TimeOut
);
NTSTATUS
cqd_ReadWrtProtect(
IN CqdContextPtr cqd_context,
OUT PBOOLEAN write_protect
);
NTSTATUS
cqd_ReceiveByte(
IN CqdContextPtr cqd_context,
IN USHORT receive_length,
OUT PUSHORT receive_data
);
NTSTATUS
cqd_SendByte(
IN CqdContextPtr cqd_context,
IN UCHAR command
);
NTSTATUS
cqd_DispatchFRB(
IN CqdContextPtr cqd_context,
IN OUT ADIRequestHdrPtr frb
);
NTSTATUS
cqd_Report(
IN CqdContextPtr cqd_context,
IN UCHAR command,
IN PUSHORT report_data,
IN USHORT report_size,
IN OUT PBOOLEAN esd_retry
);
NTSTATUS
cqd_RetryCode(
IN CqdContextPtr cqd_context,
IN OUT DeviceIOPtr io_request,
OUT PFDC_STATUS fdc_status,
OUT PNTSTATUS op_status
);
NTSTATUS
cqd_SetBack(
IN CqdContextPtr cqd_context,
IN USHORT command
);
NTSTATUS
cqd_SenseSpeed(
IN CqdContextPtr cqd_context,
IN UCHAR dma
);
NTSTATUS
cqd_WaitSeek(
IN CqdContextPtr cqd_context,
IN ULONG seek_delay
);
NTSTATUS
cqd_StartTape(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_StopTape(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_WaitActive(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_WaitCommandComplete(
IN CqdContextPtr cqd_context,
IN ULONG wait_time,
IN BOOLEAN non_interruptible
);
NTSTATUS
cqd_WriteReferenceBurst(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_CalcPosition(
IN CqdContextPtr cqd_context,
IN ULONG block,
IN ULONG number
);
NTSTATUS
cqd_DCROut(
IN CqdContextPtr cqd_context,
IN UCHAR speed
);
NTSTATUS
cqd_DSROut(
IN CqdContextPtr cqd_context,
IN UCHAR precomp
);
NTSTATUS
cqd_TDROut(
IN CqdContextPtr cqd_context,
IN UCHAR tape_mode
);
VOID
cqd_ResetFDC(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_ClearTapeError(
IN CqdContextPtr cqd_context
);
VOID
cqd_CalcFmtSegmentsAndTracks(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_GetTapeParameters(
IN CqdContextPtr cqd_context,
IN ULONG segments_per_track
);
NTSTATUS
cqd_ConfigureFDC(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_SetRamPtr(
IN CqdContextPtr cqd_context,
IN UCHAR ram_addr
);
NTSTATUS
cqd_CmdIssueDiagnostic(
IN CqdContextPtr cqd_context,
IN OUT PUCHAR command_string
);
VOID
cqd_InitDeviceDescriptor(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_CmdSetTapeParms(
IN CqdContextPtr cqd_context,
IN ULONG segments_per_track,
IN TapeLengthPtr tape_length_ptr
);
NTSTATUS
cqd_PrepareTape(
IN CqdContextPtr cqd_context,
OUT FormatRequestPtr fmt_request
);
VOID
cqd_InitializeRate(
IN CqdContextPtr cqd_context,
IN UCHAR tape_xfer_rate
);
NTSTATUS
cqd_GetTapeFormatInfo(
IN CqdContextPtr cqd_context,
IN FormatRequestPtr fmt_request,
OUT PULONG segments_per_track
);
NTSTATUS
cqd_SetRam(
IN CqdContextPtr cqd_context,
IN UCHAR ram_data
);
NTSTATUS
cqd_CMSSetupTrack(
IN CqdContextPtr cqd_context,
OUT PBOOLEAN new_track
);
NTSTATUS
cqd_ReportCMSVendorInfo(
IN CqdContextPtr cqd_context,
IN USHORT vendor_id
);
NTSTATUS
cqd_ReportConnerVendorInfo(
IN CqdContextPtr cqd_context,
IN USHORT vendor_id
);
NTSTATUS
cqd_ReportSummitVendorInfo(
IN CqdContextPtr cqd_context,
IN USHORT vendor_id
);
NTSTATUS
cqd_ToggleParams(
IN CqdContextPtr cqd_context,
IN UCHAR parameter
);
NTSTATUS
cqd_EnablePerpendicularMode(
IN CqdContextPtr cqd_context,
IN BOOLEAN enable_perp_mode
);
BOOLEAN
cqd_AtLogicalBOT(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_DoFormat(
IN CqdContextPtr cqd_context
);
VOID
cqd_BuildFormatHdr(
IN CqdContextPtr cqd_context,
IN USHORT header
);
NTSTATUS
cqd_VerifyMapBad(
IN CqdContextPtr cqd_context,
IN OUT DeviceIOPtr io_request
);
NTSTATUS
cqd_CheckMediaCompatibility(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_SetFWTapeSegments(
IN CqdContextPtr cqd_context,
IN ULONG segments_per_track
);
VOID
cqd_SetTempFDCRate(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_SelectFormat(
IN CqdContextPtr cqd_context
);
VOID
cqd_SetXferRates(
IN CqdContextPtr cqd_context
);
NTSTATUS
cqd_SetFormatSegments(
IN CqdContextPtr cqd_context,
IN ULONG segments_per_track
);
NTSTATUS
cqd_PrepareIomega3010PhysRev(
IN CqdContextPtr cqd_context
);
/*++
Copyright (c) 1993 - Colorado Memory Systems, Inc.
All Rights Reserved
Module Name:
common.h
Abstract:
Data structures shared by drivers q117 and q117i
Revision History:
--*/
#if DBG
//
// For checked kernels, define a macro to print out informational
// messages.
//
// QIC117Debug is normally 0. At compile-time or at run-time, it can be
// set to some bit patter for increasingly detailed messages.
//
// Big, nasty errors are noted with DBGP. Errors that might be
// recoverable are handled by the WARN bit. More information on
// unusual but possibly normal happenings are handled by the INFO bit.
// And finally, boring details such as routines entered and register
// dumps are handled by the SHOW bit.
//
// Lower level driver defines (do not change) These mirror kdi_pub.h.
#define QIC117DBGP 0x00000001 // Display error information
#define QIC117WARN 0x00000002 // Displays seek warings (from low level driver)
#define QIC117INFO 0x00000004 // Display extra info (brief)
#define QIC117SHOWTD 0x00000008 // Display KDI tape commands (verbose)
#define QIC117SHOWMCMDS 0x00000010 // does nothing unless QIC117DBGARRAY is on
// shows drive commands, and FDC information
// This is VERY VERBOSE and will affect system
// performance
#define QIC117SHOWPOLL 0x00000020 // unused
#define QIC117STOP 0x00000080 // only one info message (not very useful)
#define QIC117MAKEBAD 0x00000100 // Creates (simulated) bad sectors to test bad
// sector re-mapping code
#define QIC117SHOWBAD 0x00000200 // unused
#define QIC117DRVSTAT 0x00000400 // Show drive status (verbose)
#define QIC117SHOWINT 0x00000800 // unused
#define QIC117DBGSEEK 0x00001000 // (does nothing unless QIC117DBGARRAY is on)
// Shows drive seek information (verbose)
#define QIC117DBGARRAY 0x00002000 // Shows async messages (does nothing unless
// QIC117DBGSEEK and/or QIC117SHOWMCMDS is set)
// Displays VERBOSE FDC command information if
// QIC117SHOWMCMDS is set.
#define QIC117BYPASSLOCKOUT 0x00004000
// Upper level driver defines (only used in upper level driver)
#define QIC117SHOWAPI ((ULONG)0x00010000) // Shows Tape API commands
#define QIC117SHOWAPIPOLL ((ULONG)0x00020000) // Shows Tape API commands used in NTBACKUP polling
// These are not displayed with QIC117SHOWAPI
#define QIC117SHOWKDI ((ULONG)0x00040000) // Shows request to KDI (VERBOSE)
#define QIC117SHOWBSM ((ULONG)0x00080000) // Display bad sector information (brief)
#define Q117DebugLevel kdi_debug_level
extern unsigned long kdi_debug_level;
#define CheckedDump(LEVEL,STRING) \
if (kdi_debug_level & LEVEL) { \
DbgPrint STRING; \
}
#else
#define CheckedDump(LEVEL,STRING)
#endif
#define BUFFER_SPLIT
typedef unsigned char UBYTE;
typedef unsigned short UWORD;
typedef unsigned short SEGMENT;
typedef unsigned long BLOCK;
#ifndef TRUE
#define TRUE 1
#endif
#ifndef NULL
#define NULL 0
#endif
#ifndef FALSE
#define FALSE 0
#endif
#define MAXLINE 100
//
// The following parameters are used to indicate the tape format code
//
#define MAX_PASSWORD_SIZE 8 // max volume password size
#define QIC_END 0xffea6dff // 12-31-2097, 23:59:59 in qictime
//
// Tape Constants
//
#define UNIX_MAXBFS 4 // max. data buffers supported in the UNIX kernel
#define MAGIC 0x636d // "cm"
#define DRIVER_COMMAND USHORT
//
// Prototypes for common functions
//
VOID
q117LogError(
IN PDEVICE_OBJECT DeviceObject,
IN ULONG SequenceNumber,
IN UCHAR MajorFunctionCode,
IN UCHAR RetryCount,
IN ULONG UniqueErrorValue,
IN NTSTATUS FinalStatus,
IN NTSTATUS SpecificIOStatus
);
NTSTATUS q117MapStatus(
IN NTSTATUS Status
);
#ifdef POOL_TAGGING
#ifdef ExAllocatePool
#undef ExAllocatePool
#endif
#define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,'h71q')
#endif
/*++
Module Name:
q117.h
Abstract:
Data structures used only by q117 driver. Contains QIC-40 structures
and Context for q117.
Revision History:
--*/
//
// For NTBACKUP to work, an early warning is required to allow the
// application to perform tape linking. To achive this, a 5 segment
// region at the end of the tape is RESERVED to genterate early warning
// status. This value is used in q117WriteTape for this purpose.
//
#define SEGMENTS_OF_EARLY_WARNING 5
#define FORMAT_BYTE 0x6b
#define MAX_BAD_BLOCKS ((1024*27)/sizeof(ULONG))
#define LIST_ENTRY_SIZE 3
#define MAX_BAD_LIST (((1024*27)/LIST_ENTRY_SIZE) - 1)
#define MAX_TITLE_SIZE 44 // max volume title entry size in far memory array
#define MAX_PASSWORD_SIZE 8 // max volume password size
#define MAX_QIC40_FILENAME 13
#define MAX_HEADER_SIZE 256 // maximum QIC-40 header size
#define DATA_HEADER_SIG_SIZE 4 // data header signature size
#define ECC_BLOCKS_PER_SEGMENT 3 // number of correction sectors ber block
#define BLOCKS_PER_SEGMENT 32 // Number of sectors per block on the tape.
// number of data sectors per block
#define DATA_BLOCKS_PER_SEGMENT (BLOCKS_PER_SEGMENT - ECC_BLOCKS_PER_SEGMENT)
#define BYTES_PER_SECTOR 1024
#define BYTES_PER_SEGMENT (BYTES_PER_SECTOR*BLOCKS_PER_SEGMENT)
#define TapeHeaderSig 0xaa55aa55l
#define VolumeTableSig (((ULONG)'L'<<24) + ((ULONG)'B'<<16) + ('T'<<8) + 'V')
#define FileHeaderSig 0x33cc33ccl
#define QIC40_VENDOR_UNIQUE_SIZE 106
#define VENDOR_TYPE_NONE 0
#define VENDOR_TYPE_CMS 1
#define MOUNTAIN_SEMISPECED_SPACE 9
#define VU_SIGNATURE_SIZE 4
#define VU_TAPE_NAME_SIZE 11
#define VU_SEGS_PER_TRACK 68
#define VU_SEGS_PER_TRACK_XL 102
#define VU_80SEGS_PER_TRACK 100
#define VU_80SEGS_PER_TRACK_XL 150
#define VU_MAX_FLOPPY_TRACK 169
#define VU_MAX_FLOPPY_TRACK_XL 254
#define VU_80MAX_FLOPPY_TRACK 149
#define VU_80MAX_FLOPPY_TRACK_XL 149
#define VU_TRACKS_PER_CART 20
#define VU_80TRACKS_PER_CART 28
#define VU_MAX_FLOPPY_SIDE 1
#define VU_80MAX_FLOPPY_SIDE 4
#define VU_80MAX_FLOPPY_SIDE_XL 6
#define VU_MAX_FLOPPY_SECT 128
#define NEW_SPEC_TAPE_NAME_SIZE 44
#define FILE_VENDOR_SPECIFIC 0
#define FILE_UNIX_SPECIFIC 1
#define FILE_DATA_BAD 2
#define OP_MS_DOS 0
#define OP_UNIX 1
#define OP_UNIX_PUBLIC 2
#define OP_OS_2 3
#define OP_WINDOWS_NT 4
// Valid values for compression code
#define COMP_STAC 0x01
#define COMP_VEND 0x3f
//
// The following section specifies QIC-40 data structures.
// These structures are aligned on byte boundaries.
//
typedef struct _SEGMENT_BUFFER {
PVOID logical;
PHYSICAL_ADDRESS physical;
} SEGMENT_BUFFER, *PSEGMENT_BUFFER;
typedef struct _IO_REQUEST {
union {
ADIRequestHdr adi_hdr;
/* Device Configuration FRB */
struct S_DriveCfgData ioDriveCfgData;
/* Generic Device operation FRB */
struct S_DeviceOp ioDeviceOp;
/* New Tape configuration FRB */
struct S_LoadTape ioLoadTape;
/* Tape length configuration FRB */
struct S_TapeParms ioTapeLength;
/* Device I/O FRB */
struct S_DeviceIO ioDeviceIO;
/* Format request FRB */
struct S_FormatRequest ioFormatRequest;
/* Direct firmware communication FRB */
struct S_DComFirm ioDComFirm;
/* Direct firmware communication FRB */
struct S_TapeParms ioTapeParms;
/* device info FRB (CMD_REPORT_DEVICE_INFO) */
struct S_ReportDeviceInfo ioDeviceInfo;
} x;
KEVENT DoneEvent; // Event that IoCompleteReqeust will set
IO_STATUS_BLOCK IoStatus; // Status of request
PSEGMENT_BUFFER BufferInfo; // Buffer information
struct _IO_REQUEST *Next;
} *PIO_REQUEST, IO_REQUEST;
#pragma pack(1)
struct _FAIL_DATE {
UWORD Year:7; // year +1970 (1970-2097)
UWORD Month:4; // month (1-12)
UWORD Day:5; // day (1-31)
};
struct _CMS_VENDOR_UNIQUE {
UBYTE type; // 0 = none; 1 = CMS
CHAR signature[VU_SIGNATURE_SIZE]; // "CMS" , ASCIIZ string
ULONG creation_time; // QIC40/QIC113 date/time format
CHAR tape_name[VU_TAPE_NAME_SIZE]; // space padded name
CHAR checksum; // checksum of UBYTEs 0 - 19 of this struct
};
struct _CMS_NEW_TAPE_NAME {
CHAR reserved[MOUNTAIN_SEMISPECED_SPACE]; // leave room for Mountain stuff
CHAR tape_name[NEW_SPEC_TAPE_NAME_SIZE]; // space padded name
ULONG creation_time; // QIC40/QIC113 date/time format
};
struct _CMS_CORRECT_TAPE_NAME {
UWORD unused2;
UWORD TrackSeg; // Tape segments per tape track
UBYTE CartTracks; // Tape tracks per cartridge
UBYTE MaxFlopSide; // Maximum floppy sides
UBYTE MaxFlopTrack; // Maximum floppy tracks
UBYTE MaxFlopSect; // Maximum floppy sectors
CHAR tape_name[NEW_SPEC_TAPE_NAME_SIZE]; // space padded name
ULONG creation_time; // QIC40/QIC113 date/time format
};
typedef union _QIC40_VENDOR_UNIQUE {
struct _CMS_VENDOR_UNIQUE cms;
CHAR vu[QIC40_VENDOR_UNIQUE_SIZE];
struct _CMS_NEW_TAPE_NAME new_name;
struct _CMS_CORRECT_TAPE_NAME correct_name;
} QIC40_VENDOR_UNIQUE, *PQIC40_VENDOR_UNIQUE;
typedef struct S_BadList {
UBYTE ListEntry[LIST_ENTRY_SIZE];
} BAD_LIST, *BAD_LIST_PTR;
typedef union U_BadMap {
ULONG BadSectors[MAX_BAD_BLOCKS];
BAD_LIST BadList[MAX_BAD_LIST];
} BAD_MAP, *BAD_MAP_PTR;
// Tape Header (sectors 0-1) and BadSector Array (2-13)
typedef struct _TAPE_HEADER {
ULONG Signature; // set to 0xaa55aa55l
UBYTE FormatCode; // set to 0x01
UBYTE SubFormatCode; // Zero for pre-rev L tapes and
// value + 'A' for rev L and above
SEGMENT HeaderSegment; // segment number of header
SEGMENT DupHeaderSegment; // segment number of duplicate header
SEGMENT FirstSegment; // segment number of Data area
SEGMENT LastSegment; // segment number of End of Data area
ULONG CurrentFormat; // time of most recent format
ULONG CurrentUpdate; // time of most recent write to cartridge
union _QIC40_VENDOR_UNIQUE VendorUnique; // Vendor unique stuff
UBYTE ReformatError; // 0xff if any of remaining data is lost
UBYTE unused3;
ULONG SegmentsUsed; // incremented every time a segment is used
UBYTE unused4[4];
ULONG InitialFormat; // time of initial format
UWORD FormatCount; // number of times tape has been formatted
UWORD FailedSectors; // the number entries in failed sector log
CHAR ManufacturerName[44]; // name of manufacturer that pre-formatted
CHAR LotCode[44]; // pre-format lot code
UBYTE unused5[22];
struct S_Failed {
SEGMENT Segment; // number of segment that failed
struct _FAIL_DATE DateFailed; // date of failure
} Failed[(1024+768)/4]; // fill out remaining UBYTEs of sector + next
BAD_MAP BadMap;
} TAPE_HEADER, *PTAPE_HEADER;
//
// CMS Vendor specific area
//
typedef struct _CMS_VOLUME_VENDOR {
CHAR Signature[4]; // set to "CMS" (null terminated) if it is our backup
UWORD FirmwareRevision; // firmware version
UWORD SoftwareRevision; // software version
CHAR RightsFiles; // if 0xff = novell rights information present
UWORD NumFiles; // number of files in volume
CHAR OpSysType; // flavor of operating system at creation
} CMS_VOLUME_VENDOR, PCMS_VOLUME_VENDOR;
//
// QIC-40 Volume table structure
//
typedef struct _VOLUME_TABLE_ENTRY {
ULONG Signature; // this entry will be "VTBL" if volume exists
SEGMENT StartSegment; // starting segment of volume for this cart
SEGMENT EndingSegment; // ending segment of volume for this cart
CHAR Description[MAX_TITLE_SIZE]; // user description of volume
ULONG CreationTime; // time of creation of the volume
UWORD VendorSpecific:1; // set if remainder of volume entry is vend spec
UWORD MultiCartridge:1; // set if volume spans another tape
UWORD NotVerified:1; // set if volume not verified yet
UWORD NoNewName:1; // set if new file names (redirection) disallowed
UWORD StacCompress:1;
UWORD reserved:3;
UWORD SequenceNumber:8; // multi-cartridge sequence number
union {
CMS_VOLUME_VENDOR cms_QIC40;
UBYTE reserved[26]; // vendor extension data
} Vendor;
CHAR Password[MAX_PASSWORD_SIZE];// password for volume
ULONG DirectorySize; // number of UBYTEs reserved for directory
ULONG DataSize; // size of data area (includes other cartridges)
UWORD OpSysVersion; // operating system version
CHAR VolumeLabel[16]; // volume label of source drive
UBYTE LogicalDevice; // who knows
UBYTE PhysicalDevice; // who knows
UWORD CompressCode:6; // type of compression, 3Fh = vendor specific
UWORD CompressAlwaysZero:1; // must be 0
UWORD CompressSwitch:1; // compression use flag
UWORD reserved1:8;
UBYTE reserved2[6];
} VOLUME_TABLE_ENTRY, *PVOLUME_TABLE_ENTRY;
#pragma pack()
//
// The following structure is the context for the q117 driver. It contains
// all current "state" information for the tape drive.
//
typedef struct _Q117_CONTEXT {
struct {
BOOLEAN VerifyOnlyOnFormat; // Verify only on format. If TRUE
// Then do NOT perform LOW-LEVEL
// Format
BOOLEAN DetectOnly; // If TRUE, allow only the CMS_DETECT
// ioctl, and do not allocate memory
BOOLEAN FormatDisabled; // If TRUE, Tape API format will be
// Disabled.
} Parameters;
ULONG TapeNumber; // Tape number of this context (used
// for DEVICEMAP\tape\Unit {x} and
// device \\.\tape{x}
BOOLEAN DriverOpened; // Set if q117Create called (this driver opened)
BOOLEAN DeviceConfigured; // Set if CMD_REPORT_DEVICE_CFG performed
BOOLEAN DeviceSelected; // Set if CMD_SELECT_DEVICE performed,
// Reset if CMD_DESELECT_DEVICE performed
struct S_DriveCfgData DriveCfg;
PVOID PageHandle;
VOLUME_TABLE_ENTRY ActiveVolume; // volume currently being saved to (nt volume)
USHORT ActiveVolumeNumber; // The sequence number of the current struct VolDir.
PDEVICE_OBJECT q117iDeviceObject;
PDEVICE_OBJECT FdcDeviceObject;
ULONG MaxTransferPages;
//
// Error tracking
//
ULONG ErrorSequence;
UCHAR MajorFunction;
//
// Queue management globals
//
SEGMENT_BUFFER SegmentBuffer[UNIX_MAXBFS]; // Array of segment buffers
ULONG SegmentBuffersAvailable;
ULONG QueueTailIndex; // Index in the IORequest array that indexes the tail.
ULONG QueueHeadIndex; // This is the head of the Filer IORequest ring-tail array.
PIO_REQUEST IoRequest; // pointer to array of IORequests
//
// current buffer information
//
struct {
enum {
NoOperation,
BackupInProgress,
RestoreInProgress
} Type;
//
// Information associated with currently active segment
//
PVOID SegmentPointer;
USHORT SegmentBytesRemaining;
SEGMENT LastSegmentRead;
SEGMENT CurrentSegment; // in backup (active segment) in restore (read-ahead segment)
USHORT BytesZeroFilled; // Bytes at end of backup that were zeroed (not part of backup)
NTSTATUS SegmentStatus;
SEGMENT EndOfUsedTape;
SEGMENT LastSegment; // Last segment of volume
ULONG BytesOnTape;
BOOLEAN UpdateBadMap; // if true then update bad sector map
ULONG BytesRead;
ULONG Position; // type of last IOCTL_TAPE_SET_POSITION
} CurrentOperation;
//
// current tape information
//
struct {
enum {
TapeInfoLoaded,
BadTapeInDrive,
NeedInfoLoaded
} State;
NTSTATUS BadTapeError;
SEGMENT LastUsedSegment;
SEGMENT VolumeSegment;
ULONG BadSectors;
SEGMENT LastSegment; // Last formatted segment.
USHORT MaximumVolumes; // Maximum volumes entries available
PTAPE_HEADER TapeHeader; // Header from tape
struct _TAPE_GET_MEDIA_PARAMETERS *MediaInfo;
BAD_MAP_PTR BadMapPtr;
ULONG BadSectorMapSize;
USHORT CurBadListIndex;
USHORT TapeFormatCode;
enum {
BadMap3ByteList,
BadMap8ByteList,
BadMap4ByteArray,
BadMapFormatUnknown
} BadSectorMapFormat;
} CurrentTape;
// if this global is set then the tape directory has been loaded
PIO_REQUEST tapedir;
char drive_type; // QIC40 or QIC80
//
// The following pointers are allocated when open is called and
// freed at close time.
//
#ifndef NO_MARKS
#define MAX_MARKS 255
ULONG CurrentMark;
struct _MARKENTRIES {
ULONG TotalMarks;
ULONG MarksAllocated; // size of mark entry buffer (in entries not bytes)
ULONG MaxMarks;
struct _MARKLIST {
ULONG Type;
ULONG Offset;
} *MarkEntry;
} MarkArray;
#endif
} Q117_CONTEXT, *PQ117_CONTEXT;
typedef enum _DEQUEUE_TYPE {
FlushItem,
WaitForItem
} DEQUEUE_TYPE;
//
// Common need: convert block into segment
//
#define BLOCK_TO_SEGMENT(block) ((SEGMENT)((block) / BLOCKS_PER_SEGMENT))
#define SEGMENT_TO_BLOCK(segment) ((BLOCK)(segment) * BLOCKS_PER_SEGMENT)
//
// This define is the block size used by position commands
// Note: It is 512 to be compatible with the Maynstream backup
// that does not do a getmedia parameters
//
#define BLOCK_SIZE BYTES_PER_SECTOR
#define ERROR_DECODE(val) (val >> 16)
#define ERR_BAD_TAPE 0x0101 /* BadTape */
#define ERR_BAD_SIGNATURE 0x0102 /* Unformat */
#define ERR_UNKNOWN_FORMAT_CODE 0x0103 /* UnknownFmt */
#define ERR_CORRECTION_FAILED 0x0104 /* error recovery failed */
#define ERR_PROGRAM_FAILURE 0x0105 /* coding error */
#define ERR_WRITE_PROTECTED 0x0106
#define ERR_TAPE_NOT_FORMATED 0x0107
#define ERR_UNRECOGNIZED_FORMAT 0x0108 /* badfmt */
#define ERR_END_OF_VOLUME 0x0109 /*EndOfVol */
#define ERR_UNUSABLE_TAPE 0x010a /* badtape - could not format */
#define ERR_SPLIT_REQUESTS 0x010b /* SplitRequests */
#define ERR_EARLY_WARNING 0x010c
#define ERR_SET_MARK 0x010d
#define ERR_FILE_MARK 0x010e
#define ERR_LONG_FILE_MARK 0x010f
#define ERR_SHORT_FILE_MARK 0x0110
#define ERR_NO_VOLUMES 0x0111
#define ERR_NO_MEMORY 0x0112
#define ERR_ECC_FAILED 0x0113
//#define ERR_END_OF_TAPE 0x0114
//#define ERR_TAPE_FULL 0x0115
#define ERR_WRITE_FAILURE 0x0116
#define ERR_BAD_BLOCK_DETECTED 0x0117
#define ERR_OP_PENDING_COMPLETION 0x0118
#define ERR_INVALID_REQUEST 0x0119
/*++
Module Name:
protos.h
Abstract:
Prototypes for internal functions of the High-Level portion (data
formatter) of the QIC-117 device driver.
Revision History:
--*/
NTSTATUS
q117Format(
OUT LONG *NumberBad,
IN UCHAR DoFormat,
IN PQIC40_VENDOR_UNIQUE VendorUnique,
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117ReqIO(
IN PIO_REQUEST IoRequest,
IN PSEGMENT_BUFFER BufferInfo,
IN PIO_COMPLETION_ROUTINE CompletionRoutine,
IN PVOID CompletionContext,
IN PQ117_CONTEXT Context
);
NTSTATUS
q117WaitIO(
IN PIO_REQUEST IoRequest,
IN BOOLEAN Wait,
IN PQ117_CONTEXT Context
);
NTSTATUS
q117DoIO(
IN PIO_REQUEST IoRequest,
IN PSEGMENT_BUFFER BufferInfo,
IN PQ117_CONTEXT Context
);
NTSTATUS
q117AbortIo(
IN PQ117_CONTEXT Context,
IN PKEVENT DoneEvent,
IN PIO_STATUS_BLOCK IoStatus
);
NTSTATUS
q117AbortIoDone(
IN PQ117_CONTEXT Context,
IN PKEVENT DoneEvent
);
NTSTATUS
q117DoCmd(
IN OUT PIO_REQUEST IoRequest,
IN DRIVER_COMMAND Command,
IN PVOID Data,
IN PQ117_CONTEXT Context
);
NTSTATUS
q117EndRest(
IN PQ117_CONTEXT Context
);
NTSTATUS
q117MapBadBlock (
IN PIO_REQUEST IoRequest,
OUT PVOID *DataPointer,
IN OUT USHORT *BytesLeft,
IN OUT SEGMENT *CurrentSegment,
IN OUT USHORT *Remainder,
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117NewTrkRC(
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117SelectVol(
IN PVOLUME_TABLE_ENTRY TheVolumeTable,
IN PQ117_CONTEXT Context
);
NTSTATUS
q117UpdateHeader(
IN PTAPE_HEADER Header,
IN PQ117_CONTEXT Context
);
NTSTATUS
q117Update(
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117DoUpdateBad(
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117DoUpdateMarks(
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117GetMarks(
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117FillTapeBlocks(
IN OUT DRIVER_COMMAND Command,
IN SEGMENT CurrentSegment,
IN SEGMENT EndSegment,
IN OUT PVOID Buffer,
IN SEGMENT FirstGood,
IN SEGMENT SecondGood,
IN PSEGMENT_BUFFER BufferInfo,
IN PQ117_CONTEXT Context
);
NTSTATUS
q117IssIOReq(
IN OUT PVOID Data,
IN DRIVER_COMMAND Command,
IN LONG Block,
IN OUT PSEGMENT_BUFFER BufferInfo,
IN OUT PQ117_CONTEXT Context
);
BOOLEAN
q117QueueFull(
IN PQ117_CONTEXT Context
);
BOOLEAN
q117QueueEmpty(
IN PQ117_CONTEXT Context
);
PVOID
q117GetFreeBuffer(
OUT PSEGMENT_BUFFER *BufferInfo,
IN PQ117_CONTEXT Context
);
PVOID
q117GetLastBuffer(
IN PQ117_CONTEXT Context
);
PIO_REQUEST
q117Dequeue(
IN DEQUEUE_TYPE Type,
IN OUT PQ117_CONTEXT Context
);
VOID
q117ClearQueue(
IN OUT PQ117_CONTEXT Context
);
VOID
q117QueueSingle(
IN OUT PQ117_CONTEXT Context
);
VOID
q117QueueNormal(
IN OUT PQ117_CONTEXT Context
);
PIO_REQUEST
q117GetCurReq(
IN PQ117_CONTEXT Context
);
ULONG
q117GetQueueIndex(
IN PQ117_CONTEXT Context
);
VOID
q117SetQueueIndex(
IN ULONG Index,
OUT PQ117_CONTEXT Context
);
NTSTATUS
q117LoadTape (
IN OUT PTAPE_HEADER*HeaderPointer,
IN OUT PQ117_CONTEXT Context,
IN PUCHAR driver_format_code
);
NTSTATUS
q117InitFiler (
IN OUT PQ117_CONTEXT Context
);
void
q117GetBadSectors (
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117ReadHeaderSegment (
OUT PTAPE_HEADER*HeaderPointer,
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117WriteTape(
IN OUT PVOID FromWhere,
IN OUT ULONG HowMany,
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117EndBack(
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117ReadVolumeEntry(
PVOLUME_TABLE_ENTRY VolumeEntry,
PQ117_CONTEXT Context
);
VOID
q117FakeDataSize(
IN OUT PVOLUME_TABLE_ENTRY TheVolumeTable,
IN PQ117_CONTEXT Context
);
NTSTATUS
q117AppVolTD(
IN OUT PVOLUME_TABLE_ENTRY TheVolumeTable,
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117SelectTD(
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117Start (
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117Stop (
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117OpenForWrite (
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117EndWriteOperation (
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117OpenForRead (
IN ULONG StartPosition,
IN OUT PQ117_CONTEXT Context,
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
q117EndReadOperation (
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117StartBack(
IN OUT PVOLUME_TABLE_ENTRY TheVolumeTable,
IN PQ117_CONTEXT Context
);
NTSTATUS
q117StartAppend(
IN OUT ULONG BytesAlreadyThere,
IN PVOLUME_TABLE_ENTRY TheVolumeTable,
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117StartComm(
OUT PVOLUME_TABLE_ENTRY TheVolumeTable,
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117SelVol (
PVOLUME_TABLE_ENTRY TheVolumeTable,
PQ117_CONTEXT Context
);
NTSTATUS
q117ReadTape (
OUT PVOID ToWhere,
IN OUT ULONG *HowMany,
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117ConvertStatus(
IN PDEVICE_OBJECT DeviceObject,
IN NTSTATUS status
);
VOID
q117SetTpSt(
PQ117_CONTEXT Context
);
NTSTATUS
q117GetEndBlock (
OUT PVOLUME_TABLE_ENTRY TheVolumeTable,
OUT LONG *NumberVolumes,
IN PQ117_CONTEXT Context
);
NTSTATUS
q117BuildHeader(
OUT PQIC40_VENDOR_UNIQUE VendorUnique,
IN SEGMENT *HeaderSect,
IN OUT PTAPE_HEADER Header,
IN CQDTapeCfg *tparms, // tape parameters from the driver
IN PQ117_CONTEXT Context
);
NTSTATUS
q117IoCtlGetMediaParameters (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117IoCtlGetMediaTypesEx (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117IoCtlSetMediaParameters (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117IoCtlGetDeviceNumber (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117IoCtlGetDriveParameters (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117IoCtlSetDriveParameters (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117IoCtlWriteMarks (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117IoCtlSetPosition (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117FindMark(
ULONG Type,
LONG Number,
PQ117_CONTEXT Context,
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
q117SeekToOffset(
ULONG Offset,
PQ117_CONTEXT Context,
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
q117IoCtlErase (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117IoCtlPrepare (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117IoCtlGetStatus (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117IoCtlGetPosition (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117CheckNewTape (
PQ117_CONTEXT Context
);
NTSTATUS
q117NewTrkBk(
PQ117_CONTEXT Context
);
NTSTATUS
q117GetTapeCapacity(
struct S_O_DGetCap *ptr,
PQ117_CONTEXT Context
);
VOID
q117RdsInitReed (
VOID
);
UCHAR
q117RdsMultiplyTuples (
IN UCHAR tup1,
IN UCHAR tup2
);
UCHAR
q117RdsDivideTuples (
IN UCHAR tup1,
IN UCHAR tup2
);
UCHAR
q117RdsExpTuple (
IN UCHAR tup1,
IN UCHAR xpnt
);
VOID
q117RdsMakeCRC (
IN OUT UCHAR *Array, // pointer to 32K data area (segment)
IN UCHAR Count // number of sectors (1K blocks)(1-32)
);
BOOLEAN
q117RdsReadCheck (
IN UCHAR *Array, // pointer to 32K data area (segment)
IN UCHAR Count // number of sectors (1K blocks)(1-32)
);
BOOLEAN
q117RdsCorrect(
IN OUT UCHAR *Array, // pointer to 32K data area (segment)
IN UCHAR Count, // number of good sectors in segment (4-32)
IN UCHAR CRCErrors, // number of crc errors
IN UCHAR e1,
IN UCHAR e2,
IN UCHAR e3 // sectors where errors occurred
);
VOID
q117RdsGetSyndromes (
IN OUT UCHAR *Array, // pointer to 32K data area (segment)
IN UCHAR Count, // number of good sectors in segment (4-32)
IN UCHAR *ps1,
IN UCHAR *ps2,
IN UCHAR *ps3
);
BOOLEAN
q117RdsCorrectFailure (
IN OUT UCHAR *Array, // pointer to 32K data area (segment)
IN UCHAR Count, // number of good sectors in segment (4-32)
IN UCHAR s1,
IN UCHAR s2,
IN UCHAR s3
);
BOOLEAN
q117RdsCorrectOneError (
IN OUT UCHAR *Array, // pointer to 32K data area (segment)
IN UCHAR Count, // number of good sectors in segment (4-32)
IN UCHAR ErrorLocation,
IN UCHAR s1,
IN UCHAR s2,
IN UCHAR s3
);
BOOLEAN
q117RdsCorrectTwoErrors (
IN OUT UCHAR *Array, // pointer to 32K data area (segment)
IN UCHAR Count, // number of good sectors in segment (4-32)
IN UCHAR ErrorLocation1,
IN UCHAR ErrorLocation2,
IN UCHAR s1,
IN UCHAR s2,
IN UCHAR s3
);
BOOLEAN
q117RdsCorrectThreeErrors (
IN OUT UCHAR *Array, // pointer to 32K data area (segment)
IN UCHAR Count, // number of good sectors in segment (4-32)
IN UCHAR ErrorLocation1,
IN UCHAR ErrorLocation2,
IN UCHAR ErrorLocation3,
IN UCHAR s1,
IN UCHAR s2,
UCHAR s3
);
BOOLEAN
q117RdsCorrectOneErrorAndOneFailure (
IN OUT UCHAR *Array, // pointer to 32K data area (segment)
IN UCHAR Count, // number of good sectors in segment (4-32)
IN UCHAR ErrorLocation1,
IN UCHAR s1,
IN UCHAR s2,
IN UCHAR s3
);
void
q117SpacePadString(
IN OUT CHAR *InputString,
IN LONG StrSize
);
NTSTATUS
q117VerifyFormat(
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117EraseQ(
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117EraseS(
IN OUT PQ117_CONTEXT Context
);
VOID
q117ClearVolume (
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117SkipBlock (
IN OUT ULONG *HowMany,
IN OUT PQ117_CONTEXT Context
);
NTSTATUS
q117ReconstructSegment(
IN PIO_REQUEST IoReq,
IN PQ117_CONTEXT Context
);
NTSTATUS
q117DoCorrect(
IN PVOID DataBuffer,
IN ULONG BadSectorMap,
IN ULONG SectorsInError
);
UCHAR
q117CountBits(
IN PQ117_CONTEXT Context,
IN SEGMENT Segment,
ULONG Map
);
ULONG q117ReadBadSectorList (
IN PQ117_CONTEXT Context,
IN SEGMENT Segment
);
USHORT
q117GoodDataBytes(
IN SEGMENT Segment,
IN PQ117_CONTEXT Context
);
NTSTATUS
q117AllocatePermanentMemory(
PQ117_CONTEXT Context,
PDEVICE_OBJECT FdcDeviceObject
);
NTSTATUS
q117GetTemporaryMemory(
PQ117_CONTEXT Context
);
VOID
q117FreeTemporaryMemory(
PQ117_CONTEXT Context
);
NTSTATUS
q117IoCtlReadAbs (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117IoCtlWriteAbs (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117IoCtlDetect (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117UpdateBadMap(
IN OUT PQ117_CONTEXT Context,
IN SEGMENT Segment,
IN ULONG BadSectors
);
int
q117BadMapToBadList(
IN SEGMENT Segment,
IN ULONG BadSectors,
IN BAD_LIST_PTR BadListPtr
);
ULONG
q117BadListEntryToSector(
IN UCHAR *ListEntry,
OUT BOOLEAN *hiBitSet
);
NTSTATUS
q117AllocateBuffers (
PQ117_CONTEXT Context
);
NTSTATUS
q117Read(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117Write(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117DeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117Create (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117Close (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117CreateKey(
IN HANDLE Root,
IN PSTR key,
OUT PHANDLE NewKey
);
NTSTATUS
q117CreateRegistryInfo(
IN ULONG TapeNumber,
IN PUNICODE_STRING RegistryPath,
IN PQ117_CONTEXT Context
);
cms_IoCtl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
q117DoRewind(
PQ117_CONTEXT Context
);
NTSTATUS q117MakeMarkArrayBigger(
PQ117_CONTEXT Context,
int MinimumToAdd
);
int
q117SelectBSMLocation(
IN OUT PQ117_CONTEXT Context
);
NTSTATUS kdi_WriteRegString(
HANDLE unit_key,
PSTR name,
PSTR value
);
NTSTATUS kdi_FdcDeviceIo(
IN PDEVICE_OBJECT DeviceObject,
IN ULONG Ioctl,
IN OUT PVOID Data
);
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGEQICH,q117Initialize)
#pragma alloc_text(PAGEQICH,q117CreateRegistryInfo)
#pragma alloc_text(PAGEQICH,q117CreateKey)
#pragma alloc_text(PAGEQICH,q117AllocatePermanentMemory)
#endif
#ifndef NOCODELOCK
#ifdef ALLOC_PRAGMA
//#pragma alloc_text(PAGEQICH, q117Create)
//#pragma alloc_text(PAGEQICH, q117Close)
#pragma alloc_text(PAGEQICH, cms_IoCtl)
#pragma alloc_text(PAGEQICH, q117Read)
#pragma alloc_text(PAGEQICH, q117Write)
#pragma alloc_text(PAGEQICH, q117DeviceControl)
#pragma alloc_text(PAGEQICH, q117DoRewind)
#pragma alloc_text(PAGEQICH, q117AbortIo)
#pragma alloc_text(PAGEQICH, q117AbortIoDone)
#pragma alloc_text(PAGEQICH, q117AllocateBuffers )
#pragma alloc_text(PAGEQICH, q117AppVolTD)
#pragma alloc_text(PAGEQICH, q117BadListEntryToSector)
#pragma alloc_text(PAGEQICH, q117BadMapToBadList)
#pragma alloc_text(PAGEQICH, q117BuildHeader)
#pragma alloc_text(PAGEQICH, q117CheckNewTape )
#pragma alloc_text(PAGEQICH, q117ClearQueue)
#pragma alloc_text(PAGEQICH, q117ClearVolume )
#pragma alloc_text(PAGEQICH, q117ConvertStatus)
#pragma alloc_text(PAGEQICH, q117CountBits)
#pragma alloc_text(PAGEQICH, q117Dequeue)
#pragma alloc_text(PAGEQICH, q117DoCmd)
#pragma alloc_text(PAGEQICH, q117DoCorrect)
#pragma alloc_text(PAGEQICH, q117DoIO)
#pragma alloc_text(PAGEQICH, q117DoUpdateBad)
#pragma alloc_text(PAGEQICH, q117DoUpdateMarks)
#pragma alloc_text(PAGEQICH, q117EndBack)
#pragma alloc_text(PAGEQICH, q117EndReadOperation )
#pragma alloc_text(PAGEQICH, q117EndRest)
#pragma alloc_text(PAGEQICH, q117EndWriteOperation )
#pragma alloc_text(PAGEQICH, q117EraseQ)
#pragma alloc_text(PAGEQICH, q117EraseS)
#pragma alloc_text(PAGEQICH, q117FakeDataSize)
#pragma alloc_text(PAGEQICH, q117FillTapeBlocks)
#pragma alloc_text(PAGEQICH, q117FindMark)
#pragma alloc_text(PAGEQICH, q117Format)
#pragma alloc_text(PAGEQICH, q117FreeTemporaryMemory)
#pragma alloc_text(PAGEQICH, q117GetBadSectors )
#pragma alloc_text(PAGEQICH, q117GetCurReq)
#pragma alloc_text(PAGEQICH, q117GetEndBlock )
#pragma alloc_text(PAGEQICH, q117GetFreeBuffer)
#pragma alloc_text(PAGEQICH, q117GetLastBuffer)
#pragma alloc_text(PAGEQICH, q117GetMarks)
#pragma alloc_text(PAGEQICH, q117GetQueueIndex)
#pragma alloc_text(PAGEQICH, q117GetTapeCapacity)
#pragma alloc_text(PAGEQICH, q117GetTemporaryMemory)
#pragma alloc_text(PAGEQICH, q117GoodDataBytes)
#pragma alloc_text(PAGEQICH, q117InitFiler )
#pragma alloc_text(PAGEQICH, q117IoCtlErase )
#pragma alloc_text(PAGEQICH, q117IoCtlGetDeviceNumber )
#pragma alloc_text(PAGEQICH, q117IoCtlGetDriveParameters )
#pragma alloc_text(PAGEQICH, q117IoCtlGetMediaParameters )
#pragma alloc_text(PAGEQICH, q117IoCtlGetPosition )
#pragma alloc_text(PAGEQICH, q117IoCtlGetStatus )
#pragma alloc_text(PAGEQICH, q117IoCtlPrepare )
#pragma alloc_text(PAGEQICH, q117IoCtlReadAbs )
#pragma alloc_text(PAGEQICH, q117IoCtlSetDriveParameters )
#pragma alloc_text(PAGEQICH, q117IoCtlSetMediaParameters )
#pragma alloc_text(PAGEQICH, q117IoCtlSetPosition )
#pragma alloc_text(PAGEQICH, q117IoCtlWriteAbs )
#pragma alloc_text(PAGEQICH, q117IoCtlWriteMarks )
#pragma alloc_text(PAGEQICH, q117IssIOReq)
#pragma alloc_text(PAGEQICH, q117LoadTape )
#pragma alloc_text(PAGEQICH, q117MapBadBlock )
#pragma alloc_text(PAGEQICH, q117NewTrkBk)
#pragma alloc_text(PAGEQICH, q117NewTrkRC)
#pragma alloc_text(PAGEQICH, q117OpenForRead )
#pragma alloc_text(PAGEQICH, q117OpenForWrite )
#pragma alloc_text(PAGEQICH, q117QueueEmpty)
#pragma alloc_text(PAGEQICH, q117QueueFull)
#pragma alloc_text(PAGEQICH, q117QueueNormal)
#pragma alloc_text(PAGEQICH, q117QueueSingle)
#pragma alloc_text(PAGEQICH, q117RdsCorrect)
#pragma alloc_text(PAGEQICH, q117RdsCorrectFailure )
#pragma alloc_text(PAGEQICH, q117RdsCorrectOneError )
#pragma alloc_text(PAGEQICH, q117RdsCorrectOneErrorAndOneFailure )
#pragma alloc_text(PAGEQICH, q117RdsCorrectThreeErrors )
#pragma alloc_text(PAGEQICH, q117RdsCorrectTwoErrors )
#pragma alloc_text(PAGEQICH, q117RdsDivideTuples )
#pragma alloc_text(PAGEQICH, q117RdsExpTuple )
#pragma alloc_text(PAGEQICH, q117RdsGetSyndromes )
#pragma alloc_text(PAGEQICH, q117RdsInitReed )
#pragma alloc_text(PAGEQICH, q117RdsMakeCRC )
#pragma alloc_text(PAGEQICH, q117RdsMultiplyTuples )
#pragma alloc_text(PAGEQICH, q117RdsReadCheck )
#pragma alloc_text(PAGEQICH, q117ReadBadSectorList )
#pragma alloc_text(PAGEQICH, q117ReadHeaderSegment )
#pragma alloc_text(PAGEQICH, q117ReadTape )
#pragma alloc_text(PAGEQICH, q117ReadVolumeEntry)
#pragma alloc_text(PAGEQICH, q117ReconstructSegment)
#pragma alloc_text(PAGEQICH, q117ReqIO)
#pragma alloc_text(PAGEQICH, q117SeekToOffset)
#pragma alloc_text(PAGEQICH, q117SelectTD)
#pragma alloc_text(PAGEQICH, q117SelectVol)
#pragma alloc_text(PAGEQICH, q117SelVol )
#pragma alloc_text(PAGEQICH, q117SetQueueIndex)
#pragma alloc_text(PAGEQICH, q117SetTpSt)
#pragma alloc_text(PAGEQICH, q117SkipBlock )
#pragma alloc_text(PAGEQICH, q117SpacePadString)
#pragma alloc_text(PAGEQICH, q117Start )
#pragma alloc_text(PAGEQICH, q117StartAppend)
#pragma alloc_text(PAGEQICH, q117StartBack)
#pragma alloc_text(PAGEQICH, q117StartComm)
#pragma alloc_text(PAGEQICH, q117Stop )
#pragma alloc_text(PAGEQICH, q117Update)
#pragma alloc_text(PAGEQICH, q117UpdateBadMap)
#pragma alloc_text(PAGEQICH, q117UpdateHeader)
#pragma alloc_text(PAGEQICH, q117VerifyFormat)
#pragma alloc_text(PAGEQICH, q117WaitIO)
#pragma alloc_text(PAGEQICH, q117WriteTape)
#endif
#endif