mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
417 lines
9.2 KiB
417 lines
9.2 KiB
/*++
|
|
|
|
Copyright (c) 1993 Conner Peripherals Inc.
|
|
|
|
Module Name:
|
|
|
|
4mmsony.h
|
|
|
|
Abstract:
|
|
|
|
This file contains structures and defines that are used
|
|
specifically for the 4mmsony.sys tape driver.
|
|
|
|
Author:
|
|
|
|
Mike Colandreo (Conner Software)
|
|
|
|
Revision History:
|
|
|
|
|
|
$Log$
|
|
|
|
|
|
--*/
|
|
|
|
#include "scsi.h"
|
|
#include "class.h"
|
|
|
|
//
|
|
// Define the maximum inquiry data length.
|
|
//
|
|
|
|
#define MAXIMUM_TAPE_INQUIRY_DATA 252
|
|
|
|
//
|
|
// Tape device data
|
|
//
|
|
|
|
typedef struct _TAPE_DATA {
|
|
ULONG Flags;
|
|
ULONG CurrentPartition;
|
|
PVOID DeviceSpecificExtension;
|
|
PSCSI_INQUIRY_DATA InquiryData;
|
|
} TAPE_DATA, *PTAPE_DATA;
|
|
|
|
#define DEVICE_EXTENSION_SIZE sizeof(DEVICE_EXTENSION) + sizeof(TAPE_DATA)
|
|
|
|
|
|
//
|
|
// Define Device Configuration Page
|
|
//
|
|
|
|
typedef struct _MODE_DEVICE_CONFIGURATION_PAGE {
|
|
|
|
UCHAR PageCode : 6;
|
|
UCHAR Reserved1 : 1;
|
|
UCHAR PS : 1;
|
|
UCHAR PageLength;
|
|
UCHAR ActiveFormat : 5;
|
|
UCHAR CAFBit : 1;
|
|
UCHAR CAPBit : 1;
|
|
UCHAR Reserved2 : 1;
|
|
UCHAR ActivePartition;
|
|
UCHAR WriteBufferFullRatio;
|
|
UCHAR ReadBufferEmptyRatio;
|
|
UCHAR WriteDelayTime[2];
|
|
UCHAR REW : 1;
|
|
UCHAR RBO : 1;
|
|
UCHAR SOCF : 2;
|
|
UCHAR AVC : 1;
|
|
UCHAR RSmk : 1;
|
|
UCHAR BIS : 1;
|
|
UCHAR DBR : 1;
|
|
UCHAR GapSize;
|
|
UCHAR Reserved3 : 3;
|
|
UCHAR SEW : 1;
|
|
UCHAR EEG : 1;
|
|
UCHAR EODdefined : 3;
|
|
UCHAR BufferSize[3];
|
|
UCHAR DCAlgorithm;
|
|
UCHAR Reserved4;
|
|
|
|
} MODE_DEVICE_CONFIGURATION_PAGE, *PMODE_DEVICE_CONFIGURATION_PAGE;
|
|
|
|
//
|
|
// Define Medium Partition Page
|
|
//
|
|
|
|
typedef struct _MODE_MEDIUM_PARTITION_PAGE {
|
|
|
|
UCHAR PageCode : 6;
|
|
UCHAR Reserved1 : 1;
|
|
UCHAR PSBit : 1;
|
|
UCHAR PageLength;
|
|
UCHAR MaximumAdditionalPartitions;
|
|
UCHAR AdditionalPartitionDefined;
|
|
UCHAR Reserved2 : 3;
|
|
UCHAR PSUMBit : 2;
|
|
UCHAR IDPBit : 1;
|
|
UCHAR SDPBit : 1;
|
|
UCHAR FDPBit : 1;
|
|
UCHAR MediumFormatRecognition;
|
|
UCHAR Reserved3[2];
|
|
UCHAR Partition0Size[2];
|
|
UCHAR Partition1Size[2];
|
|
|
|
} MODE_MEDIUM_PARTITION_PAGE, *PMODE_MEDIUM_PARTITION_PAGE;
|
|
|
|
//
|
|
// Define Data Compression Page
|
|
//
|
|
|
|
typedef struct _MODE_DATA_COMPRESSION_PAGE {
|
|
|
|
UCHAR PageCode : 6;
|
|
UCHAR Reserved1 : 2;
|
|
UCHAR PageLength;
|
|
UCHAR Reserved2 : 6;
|
|
UCHAR DCC : 1;
|
|
UCHAR DCE : 1;
|
|
UCHAR Reserved3 : 5;
|
|
UCHAR RED : 2;
|
|
UCHAR DDE : 1;
|
|
UCHAR CompressionAlgorithm[4];
|
|
UCHAR DecompressionAlgorithm[4];
|
|
UCHAR Reserved4[4];
|
|
|
|
} MODE_DATA_COMPRESSION_PAGE, *PMODE_DATA_COMPRESSION_PAGE;
|
|
|
|
//
|
|
// Mode parameter list header and medium partition page -
|
|
// used in creating partitions
|
|
//
|
|
|
|
typedef struct _MODE_MEDIUM_PART_PAGE {
|
|
|
|
MODE_PARAMETER_HEADER ParameterListHeader;
|
|
MODE_PARAMETER_BLOCK ParameterListBlock;
|
|
MODE_MEDIUM_PARTITION_PAGE MediumPartPage;
|
|
|
|
} MODE_MEDIUM_PART_PAGE, *PMODE_MEDIUM_PART_PAGE;
|
|
|
|
|
|
//
|
|
// Mode parameters for retrieving tape or media information
|
|
//
|
|
|
|
typedef struct _MODE_TAPE_MEDIA_INFORMATION {
|
|
|
|
MODE_PARAMETER_HEADER ParameterListHeader;
|
|
MODE_PARAMETER_BLOCK ParameterListBlock;
|
|
MODE_MEDIUM_PARTITION_PAGE MediumPartPage;
|
|
|
|
} MODE_TAPE_MEDIA_INFORMATION, *PMODE_TAPE_MEDIA_INFORMATION;
|
|
|
|
//
|
|
// Mode parameter list header and device configuration page -
|
|
// used in retrieving device configuration information
|
|
//
|
|
|
|
typedef struct _MODE_DEVICE_CONFIG_PAGE {
|
|
|
|
MODE_PARAMETER_HEADER ParameterListHeader;
|
|
MODE_PARAMETER_BLOCK ParameterListBlock;
|
|
MODE_DEVICE_CONFIGURATION_PAGE DeviceConfigPage;
|
|
|
|
} MODE_DEVICE_CONFIG_PAGE, *PMODE_DEVICE_CONFIG_PAGE;
|
|
|
|
|
|
//
|
|
// Mode parameter list header and data compression page -
|
|
// used in retrieving data compression information
|
|
//
|
|
|
|
typedef struct _MODE_DATA_COMPRESS_PAGE {
|
|
|
|
MODE_PARAMETER_HEADER ParameterListHeader;
|
|
MODE_PARAMETER_BLOCK ParameterListBlock;
|
|
MODE_DATA_COMPRESSION_PAGE DataCompressPage;
|
|
|
|
} MODE_DATA_COMPRESS_PAGE, *PMODE_DATA_COMPRESS_PAGE;
|
|
|
|
//
|
|
// Defines for Log Sense Pages
|
|
//
|
|
|
|
#define LOGSENSEPAGE0 0x00
|
|
#define LOGSENSEPAGE2 0x02
|
|
#define LOGSENSEPAGE3 0x03
|
|
#define LOGSENSEPAGE30 0x30
|
|
#define LOGSENSEPAGE31 0x31
|
|
|
|
//
|
|
// Defined Log Sense Page Header
|
|
//
|
|
|
|
typedef struct _LOG_SENSE_PAGE_HEADER {
|
|
|
|
UCHAR PageCode : 6;
|
|
UCHAR Reserved1 : 2;
|
|
UCHAR Reserved2;
|
|
UCHAR Length[2]; // [0]=MSB ... [1]=LSB
|
|
|
|
} LOG_SENSE_PAGE_HEADER, *PLOG_SENSE_PAGE_HEADER;
|
|
|
|
|
|
//
|
|
// Defined Log Sense Parameter Header
|
|
//
|
|
|
|
typedef struct _LOG_SENSE_PARAMETER_HEADER {
|
|
|
|
UCHAR ParameterCode[2]; // [0]=MSB ... [1]=LSB
|
|
UCHAR LPBit : 1;
|
|
UCHAR Reserved1 : 1;
|
|
UCHAR TMCBit : 2;
|
|
UCHAR ETCBit : 1;
|
|
UCHAR TSDBit : 1;
|
|
UCHAR DSBit : 1;
|
|
UCHAR DUBit : 1;
|
|
UCHAR ParameterLength;
|
|
|
|
} LOG_SENSE_PARAMETER_HEADER, *PLOG_SENSE_PARAMETER_HEADER;
|
|
|
|
|
|
//
|
|
// Defined Log Page Information - statistical values, accounts
|
|
// for maximum parameter values that is returned for each page
|
|
//
|
|
|
|
typedef struct _LOG_SENSE_PAGE_INFORMATION {
|
|
|
|
union {
|
|
|
|
struct {
|
|
UCHAR Page0;
|
|
UCHAR Page2;
|
|
UCHAR Page3;
|
|
UCHAR Page30;
|
|
UCHAR Page31;
|
|
} PageData ;
|
|
|
|
struct {
|
|
LOG_SENSE_PARAMETER_HEADER Parm1;
|
|
UCHAR TotalRewrites[2];
|
|
LOG_SENSE_PARAMETER_HEADER Parm2;
|
|
UCHAR TotalErrorCorrected[3];
|
|
LOG_SENSE_PARAMETER_HEADER Parm3;
|
|
UCHAR NotApplicable[2]; // Always 0
|
|
LOG_SENSE_PARAMETER_HEADER Parm4;
|
|
UCHAR TotalBytesProcessed[4];
|
|
LOG_SENSE_PARAMETER_HEADER Parm5;
|
|
UCHAR TotalUnrecoverableErrors[2];
|
|
LOG_SENSE_PARAMETER_HEADER Parm6;
|
|
UCHAR RewritesLastReadOp[2];
|
|
} Page2 ;
|
|
|
|
struct {
|
|
LOG_SENSE_PARAMETER_HEADER Parm1;
|
|
UCHAR TotalRereads[2];
|
|
LOG_SENSE_PARAMETER_HEADER Parm2;
|
|
UCHAR TotalErrorCorrected[3];
|
|
LOG_SENSE_PARAMETER_HEADER Parm3;
|
|
UCHAR TotalCorrectableECCC3[2];
|
|
LOG_SENSE_PARAMETER_HEADER Parm4;
|
|
UCHAR TotalBytesProcessed[4];
|
|
LOG_SENSE_PARAMETER_HEADER Parm5;
|
|
UCHAR TotalUnrecoverableErrors[2];
|
|
LOG_SENSE_PARAMETER_HEADER Parm6;
|
|
UCHAR RereadsLastWriteOp[2];
|
|
} Page3 ;
|
|
|
|
struct {
|
|
LOG_SENSE_PARAMETER_HEADER Parm1;
|
|
UCHAR CurrentGroupsWritten[3];
|
|
LOG_SENSE_PARAMETER_HEADER Parm2;
|
|
UCHAR CurrentRewrittenFrames[2];
|
|
LOG_SENSE_PARAMETER_HEADER Parm3;
|
|
UCHAR CurrentGroupsRead[3];
|
|
LOG_SENSE_PARAMETER_HEADER Parm4;
|
|
UCHAR CurrentECCC3Corrections[2];
|
|
LOG_SENSE_PARAMETER_HEADER Parm5;
|
|
UCHAR PreviousGroupsWritten[3];
|
|
LOG_SENSE_PARAMETER_HEADER Parm6;
|
|
UCHAR PreviousRewrittenFrames[2];
|
|
LOG_SENSE_PARAMETER_HEADER Parm7;
|
|
UCHAR PreviousGroupsRead[3];
|
|
LOG_SENSE_PARAMETER_HEADER Parm8;
|
|
UCHAR PreviousECCC3Corrections[2];
|
|
LOG_SENSE_PARAMETER_HEADER Parm9;
|
|
UCHAR TotalGroupsWritten[4];
|
|
LOG_SENSE_PARAMETER_HEADER Parm10;
|
|
UCHAR TotalRewritteFrames[3];
|
|
LOG_SENSE_PARAMETER_HEADER Parm11;
|
|
UCHAR TotalGroupsRead[4];
|
|
LOG_SENSE_PARAMETER_HEADER Parm12;
|
|
UCHAR TotalECCC3Corrections[3];
|
|
LOG_SENSE_PARAMETER_HEADER Parm13;
|
|
UCHAR LoadCount[2];
|
|
} Page30 ;
|
|
|
|
struct {
|
|
LOG_SENSE_PARAMETER_HEADER Parm1;
|
|
UCHAR RemainingCapacityPart0[4];
|
|
LOG_SENSE_PARAMETER_HEADER Parm2;
|
|
UCHAR RemainingCapacityPart1[4];
|
|
LOG_SENSE_PARAMETER_HEADER Parm3;
|
|
UCHAR MaximumCapacityPart0[4];
|
|
LOG_SENSE_PARAMETER_HEADER Parm4;
|
|
UCHAR MaximumCapacityPart1[4];
|
|
} Page31 ;
|
|
|
|
} LogSensePage;
|
|
|
|
|
|
} LOG_SENSE_PAGE_INFORMATION, *PLOG_SENSE_PAGE_INFORMATION;
|
|
|
|
|
|
|
|
//
|
|
// Defined Log Sense Parameter Format - statistical values, accounts
|
|
// for maximum parameter values that is returned
|
|
//
|
|
|
|
typedef struct _LOG_SENSE_PARAMETER_FORMAT {
|
|
|
|
LOG_SENSE_PAGE_HEADER LogSenseHeader;
|
|
LOG_SENSE_PAGE_INFORMATION LogSensePageInfo;
|
|
|
|
} LOG_SENSE_PARAMETER_FORMAT, *PLOG_SENSE_PARAMETER_FORMAT;
|
|
|
|
|
|
NTSTATUS
|
|
TapeCreatePartition(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
TapeErase(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
VOID
|
|
TapeError(
|
|
PDEVICE_OBJECT DeviceObject,
|
|
PSCSI_REQUEST_BLOCK Srb,
|
|
NTSTATUS *Status,
|
|
BOOLEAN *Retry
|
|
);
|
|
|
|
NTSTATUS
|
|
TapeGetDriveParameters(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
TapeGetMediaParameters(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
TapeGetPosition(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
TapeGetStatus(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
TapePrepare(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
TapeReadWrite(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
TapeSetDriveParameters(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
TapeSetMediaParameters(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
NTSTATUS
|
|
TapeSetPosition(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|
|
BOOLEAN
|
|
TapeVerifyInquiry(
|
|
IN PSCSI_INQUIRY_DATA LunInfo
|
|
);
|
|
|
|
NTSTATUS
|
|
TapeWriteMarks(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PIRP Irp
|
|
);
|
|
|