windows-nt/Source/XPSP1/NT/net/rras/ndis/raspti/ptilink.h
2020-09-26 16:20:57 +08:00

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_