350 lines
7.7 KiB
C
350 lines
7.7 KiB
C
/*
|
|
************************************************************************
|
|
*
|
|
* NSC.h
|
|
*
|
|
*
|
|
* Portions Copyright (C) 1996-1998 National Semiconductor Corp.
|
|
* All rights reserved.
|
|
* Copyright (C) 1996-1998 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
*
|
|
*
|
|
*************************************************************************
|
|
*/
|
|
|
|
|
|
|
|
#ifndef NSC_H
|
|
|
|
#define NSC_H
|
|
|
|
#include <ndis.h>
|
|
#include "dmautil.h"
|
|
#include <ntddndis.h> // defines OID's
|
|
|
|
#include "settings.h"
|
|
#include "comm.h"
|
|
#include "sync.h"
|
|
#include "newdong.h"
|
|
|
|
#define NSC_MAJOR_VERSION 1
|
|
#define NSC_MINOR_VERSION 11
|
|
#define NSC_LETTER_VERSION 's'
|
|
#define NDIS_MAJOR_VERSION 5
|
|
#define NDIS_MINOR_VERSION 0
|
|
|
|
extern ULONG DebugSpeed;
|
|
|
|
|
|
//
|
|
// Registry Keywords.
|
|
//
|
|
#define CARDTYPE NDIS_STRING_CONST("BoardType")
|
|
#define DONGLE_A_TYPE NDIS_STRING_CONST("Dongle_A_Type")
|
|
#define DONGLE_B_TYPE NDIS_STRING_CONST("Dongle_B_Type")
|
|
#define MAXCONNECTRATE NDIS_STRING_CONST("MaxConnectRate")
|
|
|
|
|
|
#define LCR_BSR_OFFSET (3)
|
|
#define BKSE (1 << 7)
|
|
|
|
#define FRM_ST (5)
|
|
#define RFRL_L (6)
|
|
#define RFRL_H (7)
|
|
|
|
#define ST_FIFO_LOST_FR (1 << 6)
|
|
#define ST_FIFO_VALID (1 << 7)
|
|
|
|
|
|
#define LSR_OE (1 << 1)
|
|
#define LSR_FR_END (1 << 7)
|
|
|
|
|
|
//
|
|
// Valid value ranges for the DMA Channels.
|
|
//
|
|
#define VALID_DMACHANNELS {0xFF,0x0,0x1,0x3}
|
|
|
|
#define FIR_INT_MASK 0x14
|
|
//#define FIR_INT_MASK 0x50
|
|
|
|
enum NSC_EXT_INTS {
|
|
RXHDL_EV = (1 << 0),
|
|
TXLDL_EV = (1 << 1),
|
|
LS_EV = (1 << 2),
|
|
MS_EV = (1 << 3),
|
|
DMA_EV = (1 << 4),
|
|
TXEMP_EV = (1 << 5),
|
|
SFIF_EV = (1 << 6),
|
|
TMR_EV = (1 << 7)
|
|
};
|
|
|
|
|
|
typedef struct DebugCounters {
|
|
ULONG TxPacketsStarted;
|
|
ULONG TxPacketsCompleted;
|
|
ULONG ReceivedPackets;
|
|
ULONG WindowSize;
|
|
ULONG StatusFIFOOverflows;
|
|
ULONG TxUnderruns;
|
|
ULONG ReceiveFIFOOverflows;
|
|
ULONG MissedPackets;
|
|
ULONG ReceiveCRCErrors;
|
|
ULONG ReturnPacketHandlerCalled;
|
|
ULONG RxWindow;
|
|
ULONG RxWindowMax;
|
|
ULONG RxDPC_Window;
|
|
ULONG RxDPC_WindowMax;
|
|
ULONG RxDPC_G1_Count;
|
|
} DebugCounters;
|
|
|
|
/*
|
|
* A receive buffer is either FREE (not holding anything) FULL
|
|
* (holding undelivered data) or PENDING (holding data delivered
|
|
* asynchronously)
|
|
*/
|
|
typedef enum rcvbufferStates {
|
|
STATE_FREE,
|
|
STATE_FULL,
|
|
STATE_PENDING
|
|
} rcvBufferState;
|
|
|
|
typedef struct {
|
|
LIST_ENTRY listEntry;
|
|
rcvBufferState state;
|
|
PNDIS_PACKET packet;
|
|
UINT dataLen;
|
|
PUCHAR dataBuf;
|
|
BOOLEAN isDmaBuf;
|
|
} rcvBuffer;
|
|
|
|
typedef struct {
|
|
UINT Length; // Length of buffer.
|
|
UCHAR NotUsed; // Spare byte, not filled in.
|
|
UCHAR StsCmd; // For the sts cmd info.
|
|
ULONG physAddress; // Physical address of buffer
|
|
} DescTableEntry;
|
|
|
|
|
|
typedef struct IrDevice {
|
|
/*
|
|
* This is the handle that the NDIS wrapper associates with a
|
|
* connection. The handle that the miniport driver associates with
|
|
* the connection is just an index into the devStates array).
|
|
*/
|
|
NDIS_HANDLE ndisAdapterHandle;
|
|
|
|
int CardType;
|
|
|
|
/*
|
|
* Current speed setting, in bits/sec.
|
|
* (Note: this is updated when we ACTUALLY change the speed,
|
|
* not when we get the request to change speed via
|
|
* MiniportSetInformation).
|
|
*/
|
|
UINT currentSpeed;
|
|
|
|
// Current dongle setting, 0 for dongle A, 1 for dongle B
|
|
// and so on.
|
|
//
|
|
UCHAR DonglesSupported;
|
|
UCHAR currentDongle;
|
|
UCHAR DongleTypes[2];
|
|
|
|
UIR IrDongleResource;
|
|
DongleParam Dingle[2];
|
|
|
|
UINT AllowedSpeedMask;
|
|
/*
|
|
* This structure holds information about our ISR.
|
|
* It is used to synchronize with the ISR.
|
|
*/
|
|
BOOLEAN InterruptRegistered;
|
|
NDIS_MINIPORT_INTERRUPT interruptObj;
|
|
|
|
|
|
/*
|
|
* Circular queue of pending receive buffers
|
|
*/
|
|
#define NUM_RCV_BUFS 16
|
|
// #define NEXT_RCV_BUF_INDEX(i) (((i)==NO_BUF_INDEX) ? 0 : (((i)+1)%NUM_RCV_BUFS))
|
|
LIST_ENTRY rcvBufBuf; // Protected by SyncWithInterrupt
|
|
LIST_ENTRY rcvBufFree; // Protected by SyncWithInterrupt
|
|
LIST_ENTRY rcvBufFull; // Protected by SyncWithInterrupt
|
|
LIST_ENTRY rcvBufPend; // Protected by QueueLock
|
|
|
|
|
|
|
|
NDIS_SPIN_LOCK QueueLock;
|
|
LIST_ENTRY SendQueue;
|
|
PNDIS_PACKET CurrentPacket;
|
|
BOOLEAN FirTransmitPending;
|
|
BOOLEAN FirReceiveDmaActive;
|
|
BOOLEAN TransmitIsIdle;
|
|
BOOLEAN Halting;
|
|
|
|
BOOLEAN TestingInterrupt;
|
|
volatile BOOLEAN GotTestInterrupt;
|
|
|
|
LONG PacketsSentToProtocol;
|
|
|
|
NDIS_EVENT ReceiveStopped;
|
|
NDIS_EVENT SendStoppedOnHalt;
|
|
|
|
/*
|
|
* Handle to NDIS packet pool, from which packets are
|
|
* allocated.
|
|
*/
|
|
NDIS_HANDLE packetPoolHandle;
|
|
NDIS_HANDLE bufferPoolHandle;
|
|
|
|
|
|
/*
|
|
* mediaBusy is set TRUE any time that this miniport driver moves a
|
|
* data frame. It can be reset by the protocol via
|
|
* MiniportSetInformation and later checked via
|
|
* MiniportQueryInformation to detect interleaving activity.
|
|
*/
|
|
LONG RxInterrupts;
|
|
BOOLEAN mediaBusy;
|
|
BOOLEAN haveIndicatedMediaBusy;
|
|
|
|
/*
|
|
* nowReceiving is set while we are receiving a frame.
|
|
* It (not mediaBusy) is returned to the protocol when the protocol
|
|
* queries OID_MEDIA_BUSY
|
|
*/
|
|
BOOLEAN nowReceiving;
|
|
|
|
|
|
//
|
|
// Interrupt Mask.
|
|
//
|
|
UCHAR FirIntMask;
|
|
|
|
UCHAR LineStatus;
|
|
UCHAR InterruptMask;
|
|
UCHAR InterruptStatus;
|
|
UCHAR AuxStatus;
|
|
|
|
#if DBG
|
|
BOOLEAN WaitingForTurnAroundTimer;
|
|
|
|
#endif
|
|
|
|
/*
|
|
* Current link speed information.
|
|
*/
|
|
const baudRateInfo *linkSpeedInfo;
|
|
|
|
/*
|
|
* When speed is changed, we have to clear the send queue before
|
|
* setting the new speed on the hardware.
|
|
* These vars let us remember to do it.
|
|
*/
|
|
PNDIS_PACKET lastPacketAtOldSpeed;
|
|
BOOLEAN setSpeedAfterCurrentSendPacket;
|
|
|
|
/*
|
|
* Information on the COM port and send/receive FSM's.
|
|
*/
|
|
comPortInfo portInfo;
|
|
|
|
UINT hardwareStatus;
|
|
|
|
/*
|
|
* UIR Module ID.
|
|
*/
|
|
int UIR_ModuleId;
|
|
|
|
/*
|
|
* Maintain statistical debug info.
|
|
*/
|
|
UINT packetsRcvd;
|
|
UINT packetsDropped;
|
|
UINT packetsSent;
|
|
UINT interruptCount;
|
|
|
|
|
|
/*
|
|
* DMA handles
|
|
*/
|
|
NDIS_HANDLE DmaHandle;
|
|
NDIS_HANDLE dmaBufferPoolHandle;
|
|
PNDIS_BUFFER xmitDmaBuffer, rcvDmaBuffer;
|
|
ULONG_PTR rcvDmaOffset;
|
|
ULONG_PTR rcvDmaSize;
|
|
ULONG_PTR rcvPktOffset;
|
|
ULONG_PTR LastReadDMACount;
|
|
|
|
|
|
NDIS_TIMER TurnaroundTimer;
|
|
|
|
ULONG HangChk;
|
|
|
|
BOOLEAN DiscardNextPacketSet;
|
|
|
|
DMA_UTIL DmaUtil;
|
|
|
|
} IrDevice;
|
|
|
|
/*
|
|
* We use a pointer to the IrDevice structure as the miniport's device context.
|
|
*/
|
|
#define CONTEXT_TO_DEV(__deviceContext) ((IrDevice *)(__deviceContext))
|
|
#define DEV_TO_CONTEXT(__irdev) ((NDIS_HANDLE)(__irdev))
|
|
|
|
#define ON TRUE
|
|
#define OFF FALSE
|
|
|
|
#include "externs.h"
|
|
|
|
|
|
VOID
|
|
SyncWriteBankReg(
|
|
PNDIS_MINIPORT_INTERRUPT InterruptObject,
|
|
PUCHAR PortBase,
|
|
UINT BankNumber,
|
|
UINT RegisterIndex,
|
|
UCHAR Value
|
|
);
|
|
|
|
UCHAR
|
|
SyncReadBankReg(
|
|
PNDIS_MINIPORT_INTERRUPT InterruptObject,
|
|
PUCHAR PortBase,
|
|
UINT BankNumber,
|
|
UINT RegisterIndex
|
|
);
|
|
|
|
VOID
|
|
SyncSetInterruptMask(
|
|
IrDevice *thisDev,
|
|
BOOLEAN enable
|
|
);
|
|
|
|
BOOLEAN
|
|
SyncGetFifoStatus(
|
|
PNDIS_MINIPORT_INTERRUPT InterruptObject,
|
|
PUCHAR PortBase,
|
|
PUCHAR Status,
|
|
PULONG Size
|
|
);
|
|
|
|
|
|
LONG
|
|
FASTCALL
|
|
InterlockedExchange(
|
|
PLONG Dest,
|
|
LONG NewValue
|
|
);
|
|
|
|
VOID
|
|
ProcessSendQueue(
|
|
IrDevice *thisDev
|
|
);
|
|
|
|
|
|
#endif NSC_H
|