457 lines
12 KiB
C
457 lines
12 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1995 Microsoft Corporation
|
||
|
Copyright (c) 1997 Parallel Technologies, Inc. All Rights Reserved.
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
ptilink.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This file defines the interface for the Parallel Technologies
|
||
|
DirectParallel IO driver.
|
||
|
|
||
|
This driver doubles as an NT device driver and an export library.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Norbert P. Kusters 4-Jan-1995
|
||
|
Jay Lowe, Parallel Technologies, Inc.
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _PTILINK_
|
||
|
#define _PTILINK_
|
||
|
|
||
|
#define NPORTS 3 // number of PTILINKx devices to make
|
||
|
#define MAXLPTXNAME 99
|
||
|
|
||
|
typedef struct _PTI_EXTENSION PTI_EXTENSION;
|
||
|
|
||
|
//
|
||
|
// This structure contains configuration data, much of which
|
||
|
// is read from the registry.
|
||
|
//
|
||
|
typedef struct _PAR_REG_DATA {
|
||
|
ULONG PollInterval;
|
||
|
ULONG TraceLevel;
|
||
|
ULONG TraceMask;
|
||
|
ULONG IoWait;
|
||
|
ULONG SyncWait;
|
||
|
} PAR_REG_DATA,*PPAR_REG_DATA;
|
||
|
|
||
|
//
|
||
|
// Client callbacks from PtiLink
|
||
|
//
|
||
|
|
||
|
// Ptilink requests a read buffer from the upward client
|
||
|
|
||
|
typedef
|
||
|
PVOID
|
||
|
(*GET_READ_BUFFER_ROUTINE)(
|
||
|
IN PVOID ParentContext,
|
||
|
OUT PULONG BufferSize,
|
||
|
OUT PVOID* RequestContext
|
||
|
);
|
||
|
|
||
|
// Ptilink returns a completed read buffer to the upward client
|
||
|
|
||
|
typedef
|
||
|
VOID
|
||
|
(*COMPLETE_READ_BUFFER_ROUTINE)(
|
||
|
IN PVOID ParentContext,
|
||
|
IN PVOID ReadBuffer,
|
||
|
IN NTSTATUS Status,
|
||
|
IN ULONG BytesTransfered,
|
||
|
IN PVOID RequestContext
|
||
|
);
|
||
|
|
||
|
// PtiLink notifies upward client of a link event
|
||
|
|
||
|
typedef
|
||
|
VOID
|
||
|
(*NOTIFY_LINK_EVENT)(
|
||
|
IN PVOID ParentContext,
|
||
|
IN ULONG PtiLinkEventId,
|
||
|
IN ULONG PtiLinkEventData
|
||
|
);
|
||
|
|
||
|
// PtilinkEventIds
|
||
|
|
||
|
#define PTILINK_LINK_UP 2 // link has been established
|
||
|
// a LINK_OPEN or dataframe
|
||
|
// was received on SHUT link
|
||
|
// i.e., link is starting
|
||
|
|
||
|
#define PTILINK_LINK_DOWN 4 // link has been terminated
|
||
|
// peer has issued a LINK_SHUT
|
||
|
// and is departing
|
||
|
|
||
|
//
|
||
|
// Device driver routines ... are of the form ParXXXXXX
|
||
|
//
|
||
|
|
||
|
BOOLEAN
|
||
|
ParInterruptService(
|
||
|
IN PKINTERRUPT Interrupt,
|
||
|
IN OUT PVOID Extension
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
ParDpcForIsr(
|
||
|
IN PKDPC Dpc,
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp,
|
||
|
IN PVOID Extension
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
ParDeferredPortCheck(
|
||
|
IN PVOID Extension
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
ParAllocTimerDpc(
|
||
|
IN PKDPC Dpc,
|
||
|
IN PVOID Extension,
|
||
|
IN PVOID SystemArgument1,
|
||
|
IN PVOID SystemArgument2
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
ParCreate(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
ParClose(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
ParRead(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
);
|
||
|
|
||
|
PVOID
|
||
|
ParGetReadBuffer(
|
||
|
IN PVOID ParentContext,
|
||
|
OUT PULONG BufferSize,
|
||
|
OUT PVOID* RequestContext
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
ParCompleteReadBuffer(
|
||
|
IN PVOID ParentContext,
|
||
|
IN PVOID ReadBuffer,
|
||
|
IN NTSTATUS Status,
|
||
|
IN ULONG BytesTransfered,
|
||
|
IN PVOID RequestContext
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
ParLinkEventNotification(
|
||
|
IN PVOID ParentContext,
|
||
|
IN ULONG PtiLinkEventId,
|
||
|
IN ULONG PtiLinkEventData
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
ParWrite(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
ParCleanup(
|
||
|
IN PDEVICE_OBJECT DeviceObject,
|
||
|
IN PIRP Irp
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
ParUnload(
|
||
|
IN PDRIVER_OBJECT DriverObject
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Link Level Routines ... are of the form PtiXXXXXX
|
||
|
//
|
||
|
|
||
|
NTSTATUS
|
||
|
PtiInitialize(
|
||
|
IN ULONG PortId,
|
||
|
OUT PVOID pExtension,
|
||
|
OUT PVOID pPtiExtension
|
||
|
);
|
||
|
|
||
|
//
|
||
|
// a word about registering callbacks: Par (the device driver level)
|
||
|
// registers callbacks to itself at ParCreate time. If you are using
|
||
|
// the Ptilink service API in a non-irp fashion, you need to open the
|
||
|
// Ptilink device, and then re-register your own callbacks, which
|
||
|
// effectively disconnects the Par device driver level - it will be
|
||
|
// reconnected, of course, at the next ParCreate.
|
||
|
//
|
||
|
// So the sequence to use the PtiLink API without IRP's is:
|
||
|
//
|
||
|
// ZwCreateFile("\\\\.\\PTILINKx", ...)
|
||
|
// at this time, Ptilink attempts tp make a link on LPTx
|
||
|
// the ParCreate hooks up interrupts, calls PtiInit, etc
|
||
|
// the only Ptilink stuff exposed to you are the callbacks
|
||
|
//
|
||
|
// PtiRegisterCallbacks(...your handlers here...)
|
||
|
// you are overriding the inherent callbacks of the Par level
|
||
|
//
|
||
|
// PtiWrite(...)
|
||
|
// ...
|
||
|
// ... etc, etc ...
|
||
|
// ...
|
||
|
//
|
||
|
// ZwClose()
|
||
|
//
|
||
|
|
||
|
#ifndef PID_STANDARD
|
||
|
#define PID_STANDARD 0x13
|
||
|
#endif
|
||
|
#ifndef PID_LINK
|
||
|
#define PID_LINK 0x11
|
||
|
#endif
|
||
|
|
||
|
NTSTATUS
|
||
|
PtiQueryDeviceStatus(
|
||
|
IN ULONG PortId, // parallel port number (0..2)
|
||
|
OUT WCHAR* szPortName // Buffer of at least LPTXMAXNAME + 1 bytes
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
PtiRegisterCallbacks(
|
||
|
IN PVOID Extension,
|
||
|
IN GET_READ_BUFFER_ROUTINE GetReadBuffer,
|
||
|
IN COMPLETE_READ_BUFFER_ROUTINE CompleteReadBuffer,
|
||
|
IN NOTIFY_LINK_EVENT LinkEventNotification,
|
||
|
IN PVOID ParentContext
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
PtiCleanup(
|
||
|
IN PVOID PtiExtension
|
||
|
);
|
||
|
|
||
|
NTSTATUS
|
||
|
PtiWrite(
|
||
|
IN PVOID PtiExtension,
|
||
|
IN PVOID Buffer,
|
||
|
IN ULONG BufferSize,
|
||
|
IN UCHAR Pid
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
PtiIsReadPending(
|
||
|
IN PVOID PtiExtension
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
PtiRead(
|
||
|
IN PVOID PtiExtension
|
||
|
);
|
||
|
|
||
|
ULONG
|
||
|
PtiQueryMaxReadSize(
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
PtiPortNameFromPortId(
|
||
|
IN ULONG PortId,
|
||
|
OUT CHAR* szPortName
|
||
|
);
|
||
|
|
||
|
//************************************************************************
|
||
|
//* Platform Id Codes *
|
||
|
//************************************************************************
|
||
|
|
||
|
#define PLAT_WIN9X 0 // Win95 and Win98
|
||
|
#define PLAT_DOS 1 // Dos
|
||
|
#define PLAT_NT 2 // WinNT v4 and v5
|
||
|
|
||
|
//************************************************************************
|
||
|
//* LinkInformation Structure *
|
||
|
//************************************************************************
|
||
|
//
|
||
|
// LinkInformation - Link Management Information
|
||
|
//
|
||
|
// This structure contains information which is exchanged by the Nodes
|
||
|
// within Link Management Packets
|
||
|
//
|
||
|
// This structure must be maintained in parallel with it's twin in PTI.INC
|
||
|
//
|
||
|
// All changes must be backward compatible with all previous driver versions
|
||
|
|
||
|
#define LINKINFOSIZE 45*4 // explicitly define expected size
|
||
|
|
||
|
typedef struct _LINK_INFORMATION {
|
||
|
UCHAR LinkFunction; // 1] Current/Last Link Function
|
||
|
UCHAR res1;
|
||
|
UCHAR res2;
|
||
|
UCHAR res3;
|
||
|
|
||
|
UCHAR VerPlat; // 2] Platform ID byte (see PLAT_XXXX)
|
||
|
UCHAR VerReserved; // reserved
|
||
|
UCHAR VerMajor; // Link Major version
|
||
|
UCHAR VerMinor; // Link Minor version
|
||
|
|
||
|
UCHAR IOMode; // 3] Current IO transfer mode
|
||
|
UCHAR CableType; // Detected cable type
|
||
|
UCHAR PortType; // Physical parallel port type
|
||
|
UCHAR Station; // Address of this station
|
||
|
|
||
|
USHORT FIFOlen; // 4] ECP FIFO length, if ECP port
|
||
|
USHORT FIFOwidth; // ECP FIFO width, if ECP port
|
||
|
|
||
|
ULONG CPUType; // 5] CPU type
|
||
|
ULONG CPUSpeed; // 6] CPU speed rating
|
||
|
ULONG RxBufSize; // 7] Rx buffer size
|
||
|
ULONG NominalSpd; // 8] Estimated speed rating
|
||
|
ULONG ActualSpd; // 9] Actual performance to date
|
||
|
|
||
|
ULONG PpIOWait; // 10] default IO wait time
|
||
|
ULONG PpLongWait; // 11] default synchronization wait time
|
||
|
ULONG PpShortWait; // 12] default synchronization wait time
|
||
|
|
||
|
ULONG LastLinkTime; // 13] time of last link receive activity
|
||
|
ULONG CableTestTime; // 14] time of last cable detect
|
||
|
// These times are not used on NT because
|
||
|
// NT times are 64 bits ... see NT time below
|
||
|
|
||
|
// some basic counters
|
||
|
|
||
|
ULONG RxAttempts; // 15] Number of Ints w/ real RATTNs
|
||
|
ULONG RxPackets; // 16] Number of good received packets
|
||
|
ULONG TxAttempts; // 17] Number of TxPackets attempted
|
||
|
ULONG TxPackets; // 18] Number of successful TxPackets
|
||
|
ULONG GoodPackets; // 19] Number of successful recent Txs / Rxs
|
||
|
ULONG HwIRQs; // 20] Number of real hardware IRQs
|
||
|
|
||
|
// Main Error Counter Group
|
||
|
|
||
|
ULONG TxHdrDataErrors; // 21] data error during header
|
||
|
ULONG RxHdrDataErrors; // 22] data error during header
|
||
|
ULONG TxHdrSyncErrors; // 23] sync error during header
|
||
|
ULONG RxHdrSyncErrors; // 24] sync error during header
|
||
|
ULONG TxSyncErrors; // 25] sync error during packet
|
||
|
ULONG RxSyncErrors; // 26] sync error during packet
|
||
|
|
||
|
// Tx Details Group
|
||
|
|
||
|
ULONG TxTimeoutErrors1; // 27] timeouts in Tx IO code
|
||
|
ULONG TxTimeoutErrors2; // 28] timeouts in Tx IO code
|
||
|
ULONG TxTimeoutErrors3; // 29] timeouts in Tx IO code
|
||
|
ULONG TxTimeoutErrors4; // 30] timeouts in Tx IO code
|
||
|
ULONG TxTimeoutErrors5; // 31] timeouts in Tx IO code
|
||
|
ULONG TxCollision; // 32] Collision in Tx IO code
|
||
|
|
||
|
// Rx Details Group
|
||
|
|
||
|
ULONG RxTimeoutErrors1; // 33] timeouts in Rx IO code
|
||
|
ULONG RxTimeoutErrors2; // 34] timeouts in Rx IO code
|
||
|
ULONG RxTimeoutErrors3; // 35] timeouts in Rx IO code
|
||
|
ULONG RxTimeoutErrors4; // 36] timeouts in Rx IO code
|
||
|
ULONG RxTimeoutErrors5; // 37] timeouts in Rx IO code
|
||
|
ULONG RxTooBigErrors; // 38] Rx packet too big or won't fit
|
||
|
|
||
|
// Misc Error Details Group
|
||
|
|
||
|
ULONG CableDetects; // 39] Attempts to detect type of cable
|
||
|
ULONG TxRetries; // 40] Tx Retry attempts
|
||
|
ULONG TxRxPreempts; // 41] Tx Receive preemptions
|
||
|
ULONG InternalErrors; // 42] Internal screwups
|
||
|
ULONG ReservedError; // 43]
|
||
|
|
||
|
// NT Specific Group
|
||
|
|
||
|
TIME LastPacketTime; // 45] time of last good TX or Rx
|
||
|
|
||
|
} LINK_INFORMATION, *PLINK_INFORMATION;
|
||
|
|
||
|
|
||
|
//
|
||
|
// This structure is filled in by ECP detection at PtiInitialize time
|
||
|
//
|
||
|
|
||
|
typedef struct _PTI_ECP_INFORMATION {
|
||
|
BOOLEAN IsEcpPort; // Is this an ECP port?
|
||
|
ULONG FifoWidth; // Number of bytes in a PWord.
|
||
|
ULONG FifoDepth; // Number of PWords in FIFO.
|
||
|
} PTI_ECP_INFORMATION, *PPTI_ECP_INFORMATION;
|
||
|
|
||
|
//
|
||
|
// The internal structure for the 'PtiExtension'.
|
||
|
//
|
||
|
|
||
|
typedef struct _PTI_EXTENSION {
|
||
|
|
||
|
//
|
||
|
// Base I/O address for parallel port.
|
||
|
//
|
||
|
|
||
|
PUCHAR Port;
|
||
|
PUCHAR wPortECR; // ECR register if obtained from ParPort
|
||
|
PUCHAR wPortDFIFO; // Data FIFO register if obtained from ParPort
|
||
|
|
||
|
//
|
||
|
// The link state
|
||
|
//
|
||
|
|
||
|
ULONG LinkState;
|
||
|
|
||
|
//
|
||
|
// TRUE if we are polling
|
||
|
//
|
||
|
|
||
|
BOOLEAN Polling;
|
||
|
|
||
|
// "mutex" on the line
|
||
|
// InterlockedCompareExchange64 to TRUE when using wire, FALSE when done
|
||
|
//
|
||
|
ULONG Busy;
|
||
|
|
||
|
//
|
||
|
// This structure holds the PTI-derived ECP port information.
|
||
|
//
|
||
|
|
||
|
PTI_ECP_INFORMATION EcpInfo;
|
||
|
|
||
|
// Time of last good packet Tx or Rx
|
||
|
//
|
||
|
TIME LastGoodPacket;
|
||
|
|
||
|
// Time of last pass through WatchDog
|
||
|
//
|
||
|
TIME LastDogTime;
|
||
|
|
||
|
//
|
||
|
// Functions for getting and completing read buffers.
|
||
|
//
|
||
|
|
||
|
GET_READ_BUFFER_ROUTINE GetReadBuffer;
|
||
|
COMPLETE_READ_BUFFER_ROUTINE CompleteReadBuffer;
|
||
|
NOTIFY_LINK_EVENT LinkEventNotify;
|
||
|
PVOID ParentContext;
|
||
|
|
||
|
//
|
||
|
// Our and His Link Information.
|
||
|
//
|
||
|
|
||
|
LINK_INFORMATION Our;
|
||
|
LINK_INFORMATION His;
|
||
|
|
||
|
} PTI_EXTENSION, *PPTI_EXTENSION;
|
||
|
|
||
|
#endif // _PTILINK_
|