www.pudn.com > 2410winceCE_l80t64.rar > cs8900a.h


//--------------------------------------------------------------------------- 
// 
//  Copyright (C) 1996-1997. Unpublished Work of Crystal Semiconductor Corp. 
//  All Rights Reserved. 
// 
//  THIS WORK IS AN UNPUBLISHED WORK AND CONTAINS CONFIDENTIAL, 
//  PROPRIETARY AND TRADE SECRET INFORMATION OF CRYSTAL SEMICONDUCTOR. 
//  ACCESS TO THIS WORK IS RESTRICTED TO (I) CRYSTAL SEMICONDUCTOR EMPLOYEES 
//  WHO HAVE A NEED TO KNOW TO PERFORM TASKS WITHIN THE SCOPE OF THEIR 
//  ASSIGNMENTS  AND (II) ENTITIES OTHER THAN CRYSTAL SEMICONDUCTOR WHO 
//  HAVE ENTERED INTO  APPROPRIATE LICENSE AGREEMENTS.  NO PART OF THIS 
//  WORK MAY BE USED, PRACTICED, PERFORMED, COPIED, DISTRIBUTED, REVISED, 
//  MODIFIED, TRANSLATED, ABRIDGED, CONDENSED, EXPANDED, COLLECTED, 
//  COMPILED,LINKED,RECAST, TRANSFORMED, ADAPTED IN ANY FORM OR BY ANY 
//  MEANS,MANUAL, MECHANICAL, CHEMICAL, ELECTRICAL, ELECTRONIC, OPTICAL, 
//  BIOLOGICAL, OR OTHERWISE WITHOUT THE PRIOR WRITTEN PERMISSION AND 
//  CONSENT OF CRYSTAL SEMICONDUCTOR . ANY USE OR EXPLOITATION OF THIS WORK 
//  WITHOUT THE PRIOR WRITTEN CONSENT OF CRYSTAL SEMICONDUCTOR  COULD 
//  SUBJECT THE PERPETRATOR TO CRIMINAL AND CIVIL LIABILITY. 
// 
//--------------------------------------------------------------------------- 
 
/* v8900.h */ 
 
 
#ifndef _cs8900a_h_ 
 
#include  
 
#define _cs8900a_h_ 
 
 
 
// Strings/messages containing vendor specific information 
#define VENDOR_FILEDESCRIPTION_STR   "Crystal LAN(tm) CS8900A Ethernet Network Driver" 
#define VENDOR_PRODUCT_NAME_STR      "Crystal LAN(tm) CS8900A Ethernet Adapter" 
 
//forward pointer declaration 
typedef struct CHIP_t  *PCHIP; 
 
typedef unsigned char   BYTE; 
typedef unsigned short  WORD; 
typedef unsigned long   DWORD; 
typedef unsigned char  *PBYTE; 
typedef unsigned short *PWORD; 
typedef unsigned long  *PDWORD; 
typedef void           *PVOID; 
 
typedef DWORD            PORT; 
 
#define UNSPECIFIED (-1) 
 
#define TRUE        1 
#define FALSE       0 
#define SUCCESS     0 
#define FAILURE     1 
 
 
/* Ethernet Address */ 
 
typedef struct 
{ 
   WORD Part[3]; 
} EA,  *PEA; 
 
 
/* Chip Configuration */ 
 
typedef struct CFG_t 
{ 
   PORT  IOBase; 
   WORD  IOSize;        /* In bytes */ 
   DWORD MemoryBase; 
   WORD  MemorySize;    /* In bytes */ 
   DWORD ROMBase; 
   WORD  ROMSize;       /* In bytes */ 
   BYTE  IntLine; 
   BYTE  DMALine; 
   EA    EthernetAddr; 
   WORD  MediaSpeed;     /* 10 = 10 Mbit */ 
   BYTE  RequestedMediaType; 
   BYTE  DetectedMediaType; 
   BYTE  RequestedDuplexMode; 
   BYTE  CurrentDuplexMode; 
   BYTE  Filtering; 
   BYTE  BusType; 
   WORD  BusSlot; 
   BYTE  MaxTxCount; 
   BYTE  MaxRxCount; 
   WORD  LookAheadSize; 
   DWORD Flags; 
//@drs 11-3-97 3.21  add cs8900 support 
   WORD   ChipType; 
   WORD   ChipRev; 
} CFG,  *PCFG; 
 
 
/* Bus Type */ 
 
#define BUS_ISA         0 
#define BUS_MCA         1 
#define BUS_EISA        2 
#define BUS_PCMCIA      3 
#define BUS_PCI         4 
#define BUS_VESA        5 
 
 
/* Media Type */ 
 
#define MEDIA_AUTO_DETECT       0x00 
#define MEDIA_BASE_T            0x01 
#define MEDIA_BASE_AUI          0x02 
#define MEDIA_BASE_2            0x03 
#define MEDIA_PENDING           0xFE 
#define MEDIA_NONE              0xFF 
 
 
/* Duplex Mode */ 
 
#define DUPLEX_AUTO_NEGOTIATE   0x00 
#define DUPLEX_HALF             0x01 
#define DUPLEX_FULL             0x02 
#define DUPLEX_PENDING          0xFE 
#define DUPLEX_NONE             0xFF 
 
 
/* Filtering */ 
 
#define FILTER_INDIVIDUAL_ACCEPT   0x01 
#define FILTER_BROADCAST_ACCEPT    0x02 
#define FILTER_MULTICAST_ACCEPT    0x04 
#define FILTER_PROMISCUOUS_ACCEPT  0x08 
 
 
/* Transmit Errors */ 
 
#define TX_ERR_NO_BUFFER        0x0001 
#define TX_ERR_TOO_BIG          0x0002 
#define TX_ERR_TOO_MANY_FRAGS   0x0004 
#define TX_ERR_SQE_ERROR        0x0008 
#define TX_ERR_JABBER           0x0010 
#define TX_ERR_LOCK_FAIL        0x0020 
#define TX_ERR_EXCESS_COLL      0x0100 
#define TX_ERR_UNDERRUN         0x0200 
#define TX_ERR_OUT_OF_WIN       0x0400 
#define TX_ERR_LOSS_CRS         0x1000 
#define TX_ERR_FRAME_ABORT      0x2000 
 
 
/* Receive Errors */ 
 
#define RX_ERR_CRC_ERROR        0x0001 
#define RX_ERR_EXTRA_DATA       0x0002 
#define RX_ERR_RUNT             0x0004 
#define RX_ERR_FRAMING          0x0008 
#define RX_ERR_OVERRUN          0x0010 
#define RX_ERR_RX_ERR           0x0020 
#define RX_ERR_RX_MISS          0x0100 
#define RX_ERR_DRIBBLE          0x0200 
#define RX_ERR_TOO_MANY_FRAGS   0x0400 
#define RX_ERR_NO_BUFFER        0x0800 
 
 
/* Flags */ 
 
#define FLAG_BUS_MASTER         0x00000001 
#define FLAG_INTERRUPT_SHARED   0x00000002 
 
 
/* Override permission bits */ 
 
#define OVERRIDE_IO_BASE        0x0001 
#define OVERRIDE_MEM_BASE       0x0002 
#define OVERRIDE_ROM_BASE       0x0004 
#define OVERRIDE_INT_LINE       0x0008 
#define OVERRIDE_DMA_LINE       0x0010 
#define OVERRIDE_ETHER_ADDR     0x0020 
#define OVERRIDE_MEDIA_TYPE     0x0040 
#define OVERRIDE_DUPLEX_MODE    0x0080 
#define OVERRIDE_FILTERING      0x0100 
 
 
/* Chip Result Codes */ 
 
#define CHIP_SUCCESS            0 
#define CHIP_FAILURE            1 
 
 
 
/* Timer Event Handler Type */ 
 
typedef void (* TIMER_EVENT_HANDLER)( PCHIP pChip, WORD TimerID, PVOID pParm ); 
 
#define MAX_TIMERS 1 
 
typedef struct 
{ 
   NDIS_MINIPORT_TIMER     TimerHandle; 
   WORD                    TimerActive; 
   TIMER_EVENT_HANDLER TimerRoutine; 
   WORD                    TimerID; 
   PCHIP                   pChip; 
   PVOID                   pParm; 
} VOMINITIMER, *PVOMINITIMER; 
 
typedef struct 
{ 
 
   VOMINITIMER             Timers[MAX_TIMERS]; 
 
 
} VOMINIPDATA, *PVOMINIPDATA; 
 
 
 
 
#define VP_MAX_FRAMESIZE 1514 
#define VP_MIN_FRAMESIZE   60 
#define VP_HEADERSIZE      14 
#define CRYSTAL_MCAST_LIST_SIZE 32  // @kml 6/24/99 changed from 6 ro 32 
 
typedef struct txqueueelement 
{ 
  PNDIS_PACKET    NextPacket; 
  NDIS_STATUS     XmitRC; 
} TXQUEUEELEMENT, *PTXQUEUEELEMENT; 
 
 
 
 
typedef struct 
{ 
   char McastAddress[ETH_LENGTH_OF_ADDRESS]; 
 
}  CRYSTALMCASTADDRESS, *PCRYSTALMCASTADDRESS; 
 
typedef struct 
{ 
 
   NDIS_HANDLE vpMiniportAdapterHandle; 
   PVOID       VMHandle; 
   PVOID       VOSHandle; 
   PCHIP       pChip; 
   UCHAR       PermanentNetworkAddress[ETH_LENGTH_OF_ADDRESS]; 
   UCHAR       CurrentNetworkAddress[ETH_LENGTH_OF_ADDRESS]; 
   WORD        ProtocolLookahead; 
   ULONG       PacketFilter; 
   ULONG       CableConnected; 
   ULONG       CurrentState; 
   ULONG       XmitOKs; 
   ULONG       XmitErrors; 
   ULONG       XmitOneCollisions; 
   ULONG       XmitMoreCollisions; 
   ULONG       XmitMaxCollisions; 
   ULONG       XmitLateCollisions; 
   ULONG       XmitUnderrun; 
   ULONG       XmitLostCRS; 
   ULONG       RcvOKs; 
   ULONG       RcvErrors; 
   ULONG       RcvNoBuffers; 
   ULONG       RcvErrorAlignments; 
   ULONG       RcvCRCErrors; 
   ULONG       RcvOverrun; 
   PNDIS_PACKET TxQueueHead; 
 
   CRYSTALMCASTADDRESS McastList[CRYSTAL_MCAST_LIST_SIZE]; 
   ULONG       McastListSize; 
 
} VPMINIPDATA, *PVPMINIPDATA; 
 
// This MACRO sets up pvMini_Context and MiniportAdapterHandle from MiniportAdapterContext 
#define VPM_SetupMiniContext \ 
    PVPMINIPDATA pvMini_Context = (PVPMINIPDATA)MiniportAdapterContext; \ 
    NDIS_HANDLE MiniportAdapterHandle = pvMini_Context->vpMiniportAdapterHandle; \ 
    PCHIP pChip = pvMini_Context->pChip; 
 
#define VPM_SetupMiniContextFromPchip \ 
    PVPMINIPDATA pvMini_Context = (PVPMINIPDATA)(pChip->pPSD); \ 
    NDIS_HANDLE MiniportAdapterHandle = pvMini_Context->vpMiniportAdapterHandle; \ 
 
 
 
 
#define UNDERRUN_THRESHOLD                      6 
 
#define ENQ_PACKET(Packet, Queue)           \ 
    if (Queue.Tail == NULL) {               \ 
       Queue.Head = Queue.Tail = Packet;    \ 
    } else {                                \ 
       Queue.Tail->Next = Packet;           \ 
       Queue.Tail = Packet;                 \ 
    }                                       \ 
    Queue.Tail->Next = NULL; 
 
#define DEQ_PACKET(pPacket, pQueue)            \ 
    if (pPacket != NULL) {                     \ 
       *pPacket = pQueue.Head;                 \ 
       if (pQueue.Head != NULL) {              \ 
          if (pQueue.Head == pQueue.Tail) {    \ 
             pQueue.Tail = pQueue.Head->Next;  \ 
          }                                    \ 
          pQueue.Head = pQueue.Head->Next;     \ 
       }                                       \ 
    } 
 
#define CRYSTAL_INDICATE_MAXIMUM 1514 
#define CRYSTAL_MINIMUM_FRAME_SIZE 16 
 
 
 
/* Transmit Request */ 
typedef struct _TRANSMIT_QUEUE_ELEMENT { 
   struct _TRANSMIT_QUEUE_ELEMENT *Next;       // Ptr to next element in receive queue 
   WORD   PacketSize; 
} TRANSMIT_QUEUE_ELEMENT, *PTRANSMIT_QUEUE_ELEMENT; 
 
#define CRYSTAL_TRANSMIT_PACKET_MAXIMUM          3 
 
typedef struct _TRANSMIT_QUEUE { 
   PTRANSMIT_QUEUE_ELEMENT Head; 
   PTRANSMIT_QUEUE_ELEMENT Tail; 
} TRANSMIT_QUEUE; 
 
/* Chip Data */ 
 
typedef struct 
{ 
   
   UCHAR  RxFlatBuff[CRYSTAL_INDICATE_MAXIMUM+4]; 
   ULONG  RxPacketSize;  
   DWORD  NeedToIssueRcvCmpltFlag; 
   TRANSMIT_QUEUE TransmitQueue; 
   WORD   TransmitBidPending; 
   WORD   TransmitInProgress;   // If an element is on the Queue, tx is in progress 
   WORD   TransmitStarted; 
   WORD   TransmitThresholdCount; 
   WORD   TransmitCommand; 
   WORD   StartTX; 
   WORD   CurrentReceiveConfiguration; 
   WORD   Resetting; 
   WORD   ConfigFlags; 
   WORD   DetectMediaTimer; 
   PVOID                   PortOffset; 
   PVOID                   vIOSpace; 
   NDIS_MINIPORT_INTERRUPT InterruptObject; 
} CD,  *PCD; 
 
 
 
/* Config Flags */ 
 
#define CFGFLG_IOCHRDY          0x0001 
#define CFGFLG_DCDC_POLARITY    0x0002 
// Media Capability 
#define CFGFLG_MEDIA_CAP_BASE_T   0x0010 
#define CFGFLG_MEDIA_CAP_BASE_AUI 0x0020 
#define CFGFLG_MEDIA_CAP_BASE_2   0x0040 
 
 
#define CRC_PRIME               0xFFFFFFFF; 
#define CRC_POLYNOMIAL          0x04C11DB6; 
 
 
/* Instance Chip Data */ 
 
typedef struct CHIP_t 
{ 
   CFG       Config;        /* Common chip configuration */ 
   PCD           pData;     /* Chip Interface private data */ 
   PVPMINIPDATA  pPSD;      /* Protocol interface private data */ 
   PVOMINIPDATA  pOSD;      /* Timer private data */ 
 
   CD              lowerdata;       // pointed to by pData 
   VPMINIPDATA 	   higherdata;      // pointed to by pPSD 
   VOMINIPDATA     timerdata;       // pointed to by pOSD 
 
} CHIP,  *PCHIP; 
 
 
// 
// Used when registering ourselves with NDIS. 
// 
 
#define CRYSTAL_NDIS_MAJOR_VERSION 4 
#define CRYSTAL_NDIS_MINOR_VERSION 0x0 
 
// Version information exists here, in .RC file, and in NT .INF file 
#define CRYSTAL_MAJOR_VERSION 4 
#define CRYSTAL_MINOR_VERSION 0 
#define CRYSTAL_VERSION_STRING "4.00" 
 
 
 
 
 
 
 
/* Prototypes */ 
 
NTSTATUS 
DriverEntry( 
    IN PDRIVER_OBJECT DriverObject, 
    IN PUNICODE_STRING RegistryPath 
    ); 
 
 
static 
NDIS_STATUS 
CrystalInitialize( 
    OUT PNDIS_STATUS OpenErrorStatus, 
    OUT PUINT SelectedMediumIndex, 
    IN PNDIS_MEDIUM MediumArray, 
    IN UINT MediumArraySize, 
    IN NDIS_HANDLE MiniportAdapterHandle, 
    IN NDIS_HANDLE ConfigurationHandle 
    ); 
 
extern 
void 
CrystalDisableInterrupt( 
    IN  NDIS_HANDLE MiniportAdapterContext 
    ); 
 
extern 
void 
CrystalEnableInterrupt( 
    IN  NDIS_HANDLE MiniportAdapterContext 
    ); 
 
extern 
void 
CrystalHandleInterrupt( 
    IN  NDIS_HANDLE MiniportAdapterContext 
    ); 
 
extern 
void 
CrystalInterruptService( 
    OUT PBOOLEAN InterruptRecognized, 
    OUT PBOOLEAN QueueDpc, 
    IN PVOID Context 
    ); 
 
extern 
NDIS_STATUS 
CrystalReset( 
    OUT PBOOLEAN AddressingReset, 
    IN NDIS_HANDLE MiniportAdapterContext 
    ); 
 
extern 
void 
CrystalHalt( 
    IN NDIS_HANDLE MiniportAdapterContext 
    ); 
 
extern 
void 
CrystalShutdown( 
    IN NDIS_HANDLE MiniportAdapterContext 
    ); 
 
extern 
BOOLEAN 
CrystalCheckForHang( 
    IN PVOID MiniportAdapterContext 
    ); 
 
 
extern 
NDIS_STATUS 
CrystalSend( 
    IN NDIS_HANDLE MiniportAdapterHandle, 
    IN PNDIS_PACKET Packet, 
    IN UINT SendFlags 
    ); 
 
extern 
VOID 
CrystalSendPackets( 
    IN NDIS_HANDLE  MiniportAdapterContext, 
    IN PPNDIS_PACKET  PacketArray, 
    IN UINT  NumberOfPackets 
    ); 
 
extern 
NDIS_STATUS 
CrystalTransferData( 
    OUT PNDIS_PACKET  Packet, 
    OUT PUINT  BytesTransferred, 
    IN NDIS_HANDLE  MiniportAdapterHandle, 
    IN NDIS_HANDLE  MacReceiveContext, 
    IN UINT  ByteOffset, 
    IN UINT  BytesToTransfer 
    ); 
 
extern 
NDIS_STATUS 
CrystalQueryInformation( 
    IN NDIS_HANDLE MiniportAdapterContext, 
    IN NDIS_OID Oid, 
    IN PVOID InformationBuffer, 
    IN ULONG InformationBufferLength, 
    OUT PULONG BytesWritten, 
    OUT PULONG BytesNeeded 
    ); 
 
extern 
NDIS_STATUS 
CrystalSetInformation( 
    IN NDIS_HANDLE MiniportAdapterContext, 
    IN NDIS_OID Oid, 
    IN PVOID InformationBuffer, 
    IN ULONG InformationBufferLength, 
    OUT PULONG BytesRead, 
    OUT PULONG BytesNeeded 
    ); 
 
 
 
 
 
WORD  VominiStartup(PVOMINIPDATA pOSD, NDIS_HANDLE MiniportAdapterHandle ); 
void  VominiShutdown( PVOID pOSD ); 
WORD  VominiStartTimer( PCHIP pChip, TIMER_EVENT_HANDLER pEventHandler, 
           DWORD mSecondDuration, PWORD pTimerID, PVOID pParm ); 
void  VominiStopTimer( PCHIP pChip, WORD TimerID ); 
void  VominiDelay( DWORD mSecondDuration ); 
 
 
 
 
extern 
NDIS_STATUS 
GetNetworkAddress( 
    IN NDIS_HANDLE ConfigHandle, 
    OUT PUCHAR CurrentNetworkAddress 
    ); 
 
extern 
BYTE 
GetDuplexMode( 
    IN NDIS_HANDLE ConfigHandle 
    ); 
 
 
 
VOID 
VominiTimerDaemon( 
   IN PVOID SystemSpecific1, 
   IN PVOID Context, 
   IN PVOID SystemSpecific2, 
   IN PVOID SystemSpecific3 
   ); 
 
 
WORD VchipGetConfig( PCHIP pChip); 
WORD AssignedUserDefinedConfig(PCHIP pChip); 
WORD VchipStartup( PCHIP pChip ); 
WORD VchipInit( PCHIP pChip ); 
WORD VchipReset( PCHIP pChip ); 
void VchipShutdown( PCHIP pChip ); 
void VchipMulticastDeleteAll( PCHIP pChip ); 
void VchipMulticastAddAll( PCHIP pChip ); 
void VchipMulticastAdd( PCHIP pChip, PEA pMulticastAddr ); 
void VchipMulticastDelete( PCHIP pChip, PEA pMulticastAddr ); 
void VchipChangeFiltering( PCHIP pChip ); 
void VpsSendError( PCHIP pChip, WORD Errors ); 
void VpsRecvError( PCHIP pChip, WORD Errors ); 
WORD VchipISR( PCHIP pChip ); 
void VchipEnableInterrupts( PCHIP pChip ); 
void VchipDisableInterrupts( PCHIP pChip ); 
void VpsMediaChanged( PCHIP pChip ); 
void VchipTest( PCHIP pChip ); 
 
WORD GetConfigFromEEPROM( PCHIP pChip ); 
PORT FindNextChip( PCHIP pChip, PORT StartingIOBase ); 
void InitQueues( PCHIP pChip ); 
WORD ReadEEPROM( PCHIP pChip, WORD Offset, WORD *pValue ); 
WORD ReadPacketPage( PCHIP pChip, PORT IOBase, WORD Offset ); 
void WritePacketPage( PCHIP pChip, PORT IOBase, WORD Offset, WORD Value ); 
WORD AddIOBase( PORT IOBase ); 
WORD DeleteIOBase( PORT IOBase ); 
WORD SkipIOBase( PORT IOBase ); 
 
 
 
void DetectMedia( PCHIP pChip ); 
void VchipDetectMediaDaemon(PCHIP pChip, WORD TimerID, PVOID pParm); 
BOOLEAN CrystalTestInternalLoopBack( PCHIP pChip ); 
 
NDIS_STATUS VchipFindIOBase( PCHIP pChip , PORT StartPort); 
 
#endif // _cs8900a_h_