Cs8900sw.h
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:12k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. /*++
  2. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3. ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5. PARTICULAR PURPOSE.
  6. Copyright (c) 1998 Samsung Electronics.
  7. Module Name:
  8.     cs8900sw.h
  9. Abstract:
  10.     The main header for an Cirrus Logic CS8900 Miniport driver.
  11. Notes:
  12. --*/
  13. #ifndef _CS8900SFT_
  14. #define _CS8900SFT_
  15. #define DRIVER_MAJOR_VERSION        0x01
  16. #define DRIVER_MINOR_VERSION        0x00
  17. #define CS8900_NDIS_MAJOR_VERSION 5
  18. #define CS8900_NDIS_MINOR_VERSION 1
  19. #define MAXLOOP 0x8888
  20. //
  21. // This macro is used along with the flags to selectively
  22. // turn on debugging.
  23. //
  24. #if DBG
  25. #define IF_CS8900DEBUG(f) if (Ne2000DebugFlag & (f))
  26. extern ULONG Ne2000DebugFlag;
  27. #define CS8900_DEBUG_LOUD               0x00000001  // debugging info
  28. #define CS8900_DEBUG_VERY_LOUD          0x00000002  // excessive debugging info
  29. #define CS8900_DEBUG_LOG                0x00000004  // enable Ne2000Log
  30. #define CS8900_DEBUG_CHECK_DUP_SENDS    0x00000008  // check for duplicate sends
  31. #define CS8900_DEBUG_TRACK_PACKET_LENS  0x00000010  // track directed packet lens
  32. #define CS8900_DEBUG_WORKAROUND1        0x00000020  // drop DFR/DIS packets
  33. #define CS8900_DEBUG_CARD_BAD           0x00000040  // dump data if CARD_BAD
  34. #define CS8900_DEBUG_CARD_TESTS         0x00000080  // print reason for failing
  35. //
  36. // Macro for deciding whether to print a lot of debugging information.
  37. //
  38. #define IF_LOUD(A) IF_CS8900DEBUG( CS8900_DEBUG_LOUD ) { A }
  39. #define IF_VERY_LOUD(A) IF_CS8900DEBUG( CS8900_DEBUG_VERY_LOUD ) { A }
  40. //
  41. // Whether to use the Ne2000Log buffer to record a trace of the driver.
  42. //
  43. #define IF_LOG(A) IF_CS8900DEBUG( CS8900_DEBUG_LOG ) { A }
  44. extern VOID Ne2000Log(UCHAR);
  45. //
  46. // Whether to do loud init failure
  47. //
  48. #define IF_INIT(A) A
  49. //
  50. // Whether to do loud card test failures
  51. //
  52. #define IF_TEST(A) IF_CS8900DEBUG( CS8900_DEBUG_CARD_TESTS ) { A }
  53. //
  54. // Windows CE debug zones
  55. //
  56. #define ZONE_ERROR      DEBUGZONE(0)
  57. #define ZONE_WARN       DEBUGZONE(1)
  58. #define ZONE_FUNCTION   DEBUGZONE(2)
  59. #define ZONE_INIT       DEBUGZONE(3)
  60. #define ZONE_INTR       DEBUGZONE(4)
  61. #define ZONE_RCV        DEBUGZONE(5)
  62. #define ZONE_XMIT       DEBUGZONE(6)
  63. #else
  64. //
  65. // This is not a debug build, so make everything quiet.
  66. //
  67. #define IF_LOUD(A)
  68. #define IF_VERY_LOUD(A)
  69. #define IF_LOG(A)
  70. #define IF_INIT(A)
  71. #define IF_TEST(A)
  72. #endif
  73. //
  74. // Create a macro for moving memory from place to place.  Makes
  75. // the code more readable and portable in case we ever support
  76. // a shared memory CS8900 adapter.
  77. //
  78. #define CS8900_MOVE_MEM(dest,src,size) NdisMoveMemory(dest,src,size)
  79. //
  80. // The status of transmit buffers.
  81. //
  82. typedef enum {
  83.     EMPTY = 0x00,
  84.     FULL = 0x02
  85. } BUFFER_STATUS;
  86. //
  87. // Type of an interrupt.
  88. //
  89. typedef enum {
  90.     RECEIVE     = 0x01,
  91.     TRANSMIT    = 0x02,
  92.     BUFOVERFLOW = 0x04,
  93.     COUNTER     = 0x08,
  94.     UNKNOWN     = 0x10
  95. } INTERRUPT_TYPE;
  96. //
  97. // Size of the ethernet header
  98. //
  99. #define CS8900_HEADER_SIZE 14
  100. //
  101. // Size of the ethernet address
  102. //
  103. #define CS8900_LENGTH_OF_ADDRESS 6
  104. //
  105. // Number of bytes allowed in a lookahead (max)
  106. //
  107. #define CS8900_MAX_LOOKAHEAD (1518 - CS8900_HEADER_SIZE)
  108. //
  109. // Maximum number of transmit buffers on the card.
  110. //
  111. //#define MAX_XMIT_BUFS   12
  112. //
  113. // Definition of a transmit buffer.
  114. //
  115. //typedef UINT XMIT_BUF;
  116. //
  117. // Number of 256-byte buffers in a transmit buffer.
  118. //
  119. #define BUFS_PER_TX 1
  120. //
  121. // Size of a single transmit buffer.
  122. //
  123. #define TX_BUF_SIZE (BUFS_PER_TX*256)
  124. //
  125. // This structure contains information about the driver
  126. // itself.  There is only have one of these structures.
  127. //
  128. typedef struct _DRIVER_BLOCK {
  129.     //
  130.     // NDIS wrapper information.
  131.     //
  132.     NDIS_HANDLE NdisMacHandle;          // returned from NdisRegisterMac
  133.     NDIS_HANDLE NdisWrapperHandle;      // returned from NdisInitializeWrapper
  134.     //
  135.     // Adapters registered for this Miniport driver.
  136.     //
  137.     struct _CS8900_ADAPTER * AdapterQueue;
  138. } DRIVER_BLOCK, * PDRIVER_BLOCK;
  139. //
  140. // This structure contains all the information about a single
  141. // adapter that this driver is controlling.
  142. //
  143. typedef struct _CS8900_ADAPTER {
  144.     //
  145.     // This is the handle given by the wrapper for calling ndis
  146.     // functions.
  147.     //
  148.     NDIS_HANDLE MiniportAdapterHandle;
  149.     //
  150.     // Interrupt object.
  151.     //
  152.     NDIS_MINIPORT_INTERRUPT Interrupt;
  153.     //
  154.     // used by DriverBlock->AdapterQueue
  155.     //
  156.     struct _CS8900_ADAPTER * NextAdapter;
  157.     //
  158.     // This is a count of the number of receives that have been
  159.     // indicated in a row.  This is used to limit the number
  160.     // of sequential receives so that one can periodically check
  161.     // for transmit complete interrupts.
  162.     //
  163.     ULONG ReceivePacketCount;
  164.     //
  165.     // Configuration information
  166.     //
  167.     //
  168.     // Physical address of the IoBaseAddress
  169.     //
  170.     PVOID IoBaseAddr;
  171.     //
  172.     // Interrupt number this adapter is using.
  173.     //
  174.     CHAR InterruptNumber;
  175.     //
  176.     // Number of multicast addresses that this adapter is to support.
  177.     //
  178.     UINT MulticastListMax;
  179.     //
  180.     // The type of bus that this adapter is running on.  Either ISA or
  181.     // MCA.
  182.     //
  183.     UCHAR BusType;
  184.     //
  185.     // InterruptType is the next interrupt that should be serviced.
  186.     //
  187.     UCHAR InterruptType;
  188.     //
  189.     //  Type of CS8900 card.
  190.     //
  191.     UINT    CardType;
  192.     //
  193.     //  Address of the memory window.
  194.     //
  195.     ULONG   AttributeMemoryAddress;
  196.     ULONG   AttributeMemorySize;
  197.     //
  198.     // Operational information.
  199.     //
  200.     //
  201.     // Mapped address of the base io port.
  202.     //
  203.     ULONG IoPAddr;
  204.   
  205.     //
  206.     // InterruptStatus tracks interrupt sources that still need to be serviced,
  207.     // it is the logical OR of all card interrupts that have been received and not
  208.     // processed and cleared. (see also INTERRUPT_TYPE definition in cs8900.h)
  209.     //
  210.     UCHAR InterruptStatus;
  211.     //
  212.     // The ethernet address currently in use.
  213.     //
  214.     UCHAR StationAddress[CS8900_LENGTH_OF_ADDRESS];
  215.     //
  216.     // The ethernet address that is burned into the adapter.
  217.     //
  218.     UCHAR PermanentAddress[CS8900_LENGTH_OF_ADDRESS];
  219.     //
  220.     // The current packet filter in use.
  221.     //
  222.     ULONG PacketFilter;
  223.     //
  224.     // Flag that is set when we are shutting down the interface
  225.     //
  226. BOOLEAN ShuttingDown;
  227.     
  228.     //
  229.     // Statistics used by Set/QueryInformation.
  230.     //
  231.     ULONG FramesXmitGood;               // Good Frames Transmitted
  232.     ULONG FramesRcvGood;                // Good Frames Received
  233.     ULONG FramesXmitBad;                // Bad Frames Transmitted
  234.     ULONG FramesXmitOneCollision;       // Frames Transmitted with one collision
  235.     ULONG FramesXmitManyCollisions;     // Frames Transmitted with > 1 collision
  236.     ULONG FrameAlignmentErrors;         // FAE errors counted
  237.     ULONG CrcErrors;                    // CRC errors counted
  238.     ULONG MissedPackets;                // missed packet counted
  239.     //
  240.     // Reset information.
  241.     //
  242.     UCHAR NicMulticastRegs[8];          // contents of card multicast registers
  243.     UCHAR NicReceiveConfig;             // contents of NIC RCR
  244.     UCHAR NicInterruptMask;             // contents of NIC IMR
  245.     //
  246.     // The lookahead buffer size in use.
  247.     //
  248.     ULONG MaxLookAhead;
  249.     //
  250.     // CS8900 address of the beginning of the packet.
  251.     //
  252.     PUCHAR PacketHeaderLoc;
  253.     //
  254.     // Lookahead buffer
  255.     //
  256.     UCHAR Lookahead[CS8900_MAX_LOOKAHEAD + CS8900_HEADER_SIZE];
  257.     //
  258.     // List of multicast addresses in use.
  259.     //
  260.     CHAR Addresses[DEFAULT_MULTICASTLISTMAX][CS8900_LENGTH_OF_ADDRESS];
  261. } CS8900_ADAPTER, * PCS8900_ADAPTER;
  262. //
  263. // Given a MiniportContextHandle return the PCS8900_ADAPTER
  264. // it represents.
  265. //
  266. #define PCS8900_ADAPTER_FROM_CONTEXT_HANDLE(Handle) 
  267.     ((PCS8900_ADAPTER)(Handle))
  268. //
  269. // Given a pointer to a CS8900_ADAPTER return the
  270. // proper MiniportContextHandle.
  271. //
  272. #define CONTEXT_HANDLE_FROM_PCS8900_ADAPTER(Ptr) 
  273.     ((NDIS_HANDLE)(Ptr))
  274. //
  275. // Macros to extract high and low bytes of a word.
  276. //
  277. #define MSB(Value) ((UCHAR)((((ULONG)Value) >> 8) & 0xff))
  278. #define LSB(Value) ((UCHAR)(((ULONG)Value) & 0xff))
  279. //
  280. // What we map into the reserved section of a packet.
  281. // Cannot be more than 8 bytes (see ASSERT in cs8900.c).
  282. //
  283. typedef struct _MINIPORT_RESERVED {
  284.     PNDIS_PACKET Next;    // used to link in the queues (4 bytes)
  285. } MINIPORT_RESERVED, * PMINIPORT_RESERVED;
  286. //
  287. // Retrieve the MINIPORT_RESERVED structure from a packet.
  288. //
  289. #define RESERVED(Packet) ((PMINIPORT_RESERVED)((Packet)->MiniportReserved))
  290. //
  291. // Procedures which log errors.
  292. //
  293. typedef enum _CS8900_PROC_ID {
  294.     cardReset,
  295.     cardCopyDownPacket,
  296.     cardCopyDownBuffer,
  297.     cardCopyUp
  298. } CS8900_PROC_ID;
  299. //
  300. // Special error log codes.
  301. //
  302. #define CS8900_ERRMSG_CARD_SETUP          (ULONG)0x01
  303. #define CS8900_ERRMSG_DATA_PORT_READY     (ULONG)0x02
  304. #define CS8900_ERRMSG_HANDLE_XMIT_COMPLETE (ULONG)0x04
  305. //
  306. // Declarations for functions in cs8900.c.
  307. //
  308. NDIS_STATUS
  309. CS8900SetInformation(
  310.     IN NDIS_HANDLE MiniportAdapterContext,
  311.     IN NDIS_OID Oid,
  312.     IN PVOID InformationBuffer,
  313.     IN ULONG InformationBufferLength,
  314.     OUT PULONG BytesRead,
  315.     OUT PULONG BytesNeeded
  316.     );
  317. VOID
  318. CS8900Shutdown(
  319.     IN NDIS_HANDLE MiniportAdapterContext
  320.     );
  321. VOID
  322. CS8900Halt(
  323.     IN NDIS_HANDLE MiniportAdapterContext
  324.     );
  325. NDIS_STATUS
  326. CS8900RegisterAdapter(
  327.     IN PCS8900_ADAPTER Adapter,
  328.     IN NDIS_HANDLE ConfigurationHandle,
  329.     IN BOOLEAN ConfigError,
  330.     IN ULONG ConfigErrorValue
  331.     );
  332. NDIS_STATUS
  333. MiniportInitialize(
  334.     OUT PNDIS_STATUS OpenErrorStatus,
  335.     OUT PUINT SelectedMediumIndex,
  336.     IN PNDIS_MEDIUM MediumArray,
  337.     IN UINT MediumArraySize,
  338.     IN NDIS_HANDLE MiniportAdapterHandle,
  339.     IN NDIS_HANDLE ConfigurationHandle
  340.     );
  341. NDIS_STATUS
  342. CS8900TransferData(
  343.     OUT PNDIS_PACKET Packet,
  344.     OUT PUINT BytesTransferred,
  345.     IN NDIS_HANDLE MiniportAdapterContext,
  346.     IN NDIS_HANDLE MiniportReceiveContext,
  347.     IN UINT ByteOffset,
  348.     IN UINT BytesToTransfer
  349.     );
  350. NDIS_STATUS
  351. CS8900Send(
  352.     IN NDIS_HANDLE MiniportAdapterContext,
  353.     IN PNDIS_PACKET Packet,
  354.     IN UINT Flags
  355.     );
  356. NDIS_STATUS
  357. CS8900Reset(
  358.     OUT PBOOLEAN AddressingReset,
  359.     IN NDIS_HANDLE MiniportAdapterContext
  360.     );
  361. NDIS_STATUS
  362. CS8900QueryInformation(
  363.     IN NDIS_HANDLE MiniportAdapterContext,
  364.     IN NDIS_OID Oid,
  365.     IN PVOID InformationBuffer,
  366.     IN ULONG InformationBufferLength,
  367.     OUT PULONG BytesWritten,
  368.     OUT PULONG BytesNeeded
  369.     );
  370. VOID
  371. CS8900Halt(
  372.     IN NDIS_HANDLE MiniportAdapterContext
  373.     );
  374. VOID
  375. CS8900CancelSendPackets(
  376.    IN NDIS_HANDLE hMiniportAdapterContext,
  377.    IN PVOID pvCancelId
  378. );
  379. VOID
  380. CS8900DevicePnPEvent(
  381.    IN NDIS_HANDLE hMiniportAdapterContext,
  382.    IN NDIS_DEVICE_PNP_EVENT  devicePnPEvent,
  383.    IN PVOID pvInformationBuffer,
  384.    IN ULONG ulInformationBufferLength
  385. );
  386. VOID
  387. CS8900AdapterShutdown(
  388.    IN NDIS_HANDLE hMiniportAdapterContext
  389. );
  390. //
  391. // Interrup.c
  392. //
  393. void CS8900ReceiveEvent(PCS8900_ADAPTER Adapter, unsigned short RxEvent);
  394. //VOID
  395. //CS8900EnableInterrupt(
  396. //    IN NDIS_HANDLE MiniportAdapterContext
  397. //    );
  398. //VOID
  399. //CS8900DisableInterrupt(
  400. //    IN NDIS_HANDLE MiniportAdapterContext
  401. //    );
  402. VOID
  403. CS8900Isr(
  404.     OUT PBOOLEAN InterruptRecognized,
  405.     OUT PBOOLEAN QueueDpc,
  406.     IN PVOID Context
  407.     );
  408. VOID
  409. CS8900HandleInterrupt(
  410.     IN NDIS_HANDLE MiniportAdapterContext
  411.     );
  412. //
  413. // Declarations of functions in cs8900.c.
  414. //
  415. unsigned short
  416. CS8900ReadRegister(
  417. unsigned short offset
  418. );
  419. void
  420. CS8900WriteRegister(
  421. unsigned short offset,
  422. unsigned short data
  423. );
  424. BOOLEAN
  425. CS8900Initialize(
  426.     IN PCS8900_ADAPTER Adapter
  427.     );
  428. BOOLEAN
  429. CS8900ReadEthernetAddress(
  430.     IN PCS8900_ADAPTER Adapter
  431.     );
  432. unsigned short CS8900RequestTransmit
  433. (
  434. UINT PacketLength
  435.     );
  436. void CS8900CopyTxFrame
  437. (
  438. PCHAR pPacket,
  439. UINT PacketLength
  440.     );
  441. #endif // CS8900SFT