summaryrefslogtreecommitdiffstats
path: root/private/ntos/ndis/aic5900/sar.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/ntos/ndis/aic5900/sar.h781
1 files changed, 781 insertions, 0 deletions
diff --git a/private/ntos/ndis/aic5900/sar.h b/private/ntos/ndis/aic5900/sar.h
new file mode 100644
index 000000000..ff201ee35
--- /dev/null
+++ b/private/ntos/ndis/aic5900/sar.h
@@ -0,0 +1,781 @@
+
+/*++
+
+Copyright (c) 1990-1995 Microsoft Corporation
+
+Module Name:
+
+ D:\nt\private\ntos\ndis\aic5900\sar.h
+
+Abstract:
+
+Author:
+
+ Kyle Brandon (KyleB)
+
+Environment:
+
+ Kernel mode
+
+Revision History:
+
+--*/
+
+#ifndef __SAR_H
+#define __SAR_H
+
+//
+// MIDWAY macros.
+//
+#define MID_XMTREG_PLACE2SIZE(place) ((place >> 10) & 0x3)
+#define MID_XMTREG_PLACE2LOCATION(place) (place & 0x3ff)
+#define MIDWAY_MAX_SEGMENT_CHANNELS 8
+
+#define MIDWAY_XMIT_SEG_CHANNEL_UBR 0
+
+#define BLOCK_SIZE_1k 1024
+#define BLOCK_SIZE_2k 2048
+#define BLOCK_SIZE_4k 4096
+#define BLOCK_SIZE_8k 8192
+#define BLOCK_SIZE_16k 16384
+#define BLOCK_SIZE_32k 32768
+#define BLOCK_SIZE_64k 65536
+#define BLOCK_SIZE_128k 131072
+
+#define CONVERT_BYTE_OFFSET_TO_MIDWAY_LOCATION(_offset) ((_offset) >> 10)
+#define CONVERT_WORD_OFFSET_TO_MIDWAY_LOCATION(_offset) ((_offset) >> 8)
+
+#define CONVERT_MIDWAY_LOCATION_TO_BYTE_OFFSET(_location) ((_location) << 10)
+#define CONVERT_MIDWAY_LOCATION_TO_WORD_OFFSET(_location) ((_location) << 8)
+
+#define CONVERT_BYTE_SIZE_TO_MIDWAY_SIZE(_size) CONVERT_WORD_SIZE_TO_MIDWAY_SIZE((_size) / 4)
+#define CONVERT_WORD_SIZE_TO_MIDWAY_SIZE(_size) \
+ ((256 == (_size)) ? 0 : \
+ (512 == (_size)) ? 1 : \
+ (1024 == (_size)) ? 2 : \
+ (2048 == (_size)) ? 3 : \
+ (4096 == (_size)) ? 4 : \
+ (8192 == (_size)) ? 5 : \
+ (16384 == (_size)) ? 6 : 7)
+
+//
+// This is the VC that all OAM cells are forced to go to.
+//
+#define MIDWAY_OAM_VCI 3
+
+#define ATMHEADER_PTI_OAM_SEG 4
+#define ATMHEADER_PTI_OAM_END2END 5
+
+#define MIDWAY_DMA_QUEUE_SIZE 512
+#define MIDWAY_SERVICE_QUEUE_SIZE 1024
+
+
+//
+// These are always the same and are used for clarity in the driver code.
+//
+#define MIDWAY_VCI_TABLE_OFFSET 0
+#define MIDWAY_RECEIVE_DMA_QUEUE_OFFSET 0x4000
+#define MIDWAY_TRANSMIT_DMA_QUEUE_OFFSET 0x5000
+#define MIDWAY_SERVICE_QUEUE_OFFSET 0x6000
+
+//
+// MIDWAY_XMIT_REGISTERS
+//
+// Description:
+// This is the data structure for the MIDWAY ATM transmit channel
+// register set.
+// This structure is defined seperately from the MIDWAY_REGS structure
+// because there are 8 transmit engines that each have a set of registers.
+// For a full description consult the Midway (SBUS) ASIC Specification.
+//
+// Elements:
+// xmt_place - Contains the Size/Location of the XMT segment
+// memory for the queue.
+// xmt_rdptr - Points to the next 32 bit word to be transfered to
+// the PHY. Maintained by Midway.
+// xmt_descrstart - Points to the start of the Segmentation buffer
+// (descriptor), currently being DMA'd into the
+// segment memory queue.
+//
+struct _MIDWAY_XMIT_REGISTERS
+{
+ union
+ {
+ struct _XmitPlace
+ {
+ HWUL Location:11;
+ HWUL Size:3;
+ HWUL Reserved0: 18;
+ };
+
+ HWUL Register;
+ }
+ XmitPlace;
+
+ union
+ {
+ struct _XmitReadPointer
+ {
+ HWUL Pointer:15;
+ HWUL Reserved0:17;
+ };
+
+ HWUL Register;
+ }
+ XmitReadPointer;
+
+ union
+ {
+ struct _XmitDescriptorStart
+ {
+ HWUL Pointer:15;
+ HWUL Reserved0:17;
+ };
+
+ HWUL Register;
+ }
+ XmitDescriptorStart;
+
+ HWUL XmitUnused;
+};
+
+#define MIDWAY_XMTREG_PLACE2SIZE(_place) (((_place) >> 10) & 0x3)
+#define MIDWAY_XMTREG_PLACE2LOCATION(_place) ((_place) & 0x3ff)
+
+//
+// MIDWAY_REGISTERS
+//
+// Description:
+// This data structure defines the MIDWAY ATM ASIC register set.
+// For a full description consult the Midway (SBUS) ASIC Specification.
+// If you look carefully, the member names in this structure match
+// the names used in the document. Simply tack 'mid_reg_' on to the
+// front of the names in the document.
+//
+// Elements:
+// ResetID - Midway Reset / ID
+// ISA - Interrupt Status Acknowledge
+// IS - Interrupt Status
+// IE - Interrupt Enable
+// MCS - Master Control/Status
+// Statistics - Statistics
+// ServiceList - Service List Write Pointer.
+// DmaWriteRcv - RCV DMA write pointer
+// DmaReadRcv - RCV DMA read pointer
+// DmaWriteXmit - XMT DMA write pointer
+// DmaReadXmit - XMT DMA read pointer
+// Unused[3] -
+// TransmitRegisters - XMT channel registers
+//
+// Note:
+// The midway is a 32-bit only device. Make sure that all accesses
+// to the registers are 32-bit accesses. The adapter will assist you
+// in ensuring this by forcing bus errors if you attmept anything
+// other than 32-bit accesses.
+// the structures that come before the MIDWAY_REGISTERS are defined as
+// a union of bit fields and a ULONG, this is so that the register can
+// be easily constructed and then copied in a single 32-bit operation
+// to the hardware register.
+//
+
+typedef struct _MIDWAY_REG_RESET_ID
+{
+ union
+ {
+ struct
+ {
+ HWUL ConfigId1: 5;
+ HWUL ConV6: 1;
+ HWUL ConSuni: 1;
+ HWUL ConfigId2: 1;
+ HWUL MotherId: 3;
+ HWUL reserved0: 17;
+ HWUL SarId: 4;
+ };
+
+ HWUL Register;
+ };
+}
+ MIDWAY_REG_RESET_ID,
+ *PMIDWAY_REG_RESET_ID;
+
+typedef struct _MIDWAY_REG_ISA
+{
+ union
+ {
+ struct
+ {
+ HWUL StatusOverflow:1;
+ HWUL Suni:1;
+ HWUL Service:1;
+ HWUL XmitDmaComplete:1;
+ HWUL RcvDmaComplete:1;
+ HWUL DmaErrorAck:1;
+ HWUL Reserved0:1;
+ HWUL XmitIdenMismatch:1;
+ HWUL XmitDmaOverflow:1;
+ HWUL XmitComplete0:1;
+ HWUL XmitComplete1:1;
+ HWUL XmitComplete2:1;
+ HWUL XmitComplete3:1;
+ HWUL XmitComplete4:1;
+ HWUL XmitComplete5:1;
+ HWUL XmitComplete6:1;
+ HWUL XmitComplete7:1;
+ HWUL Pci:1;
+ HWUL Reserved1:14;
+ };
+
+ HWUL Register;
+ };
+}
+ MIDWAY_REG_ISA,
+ *PMIDWAY_REG_ISA;
+
+typedef struct _MIDWAY_REG_IS
+{
+ union
+ {
+ struct
+ {
+ HWUL StatusOverflow:1;
+ HWUL Suni:1;
+ HWUL Service:1;
+ HWUL XmitDmaComplete:1;
+ HWUL RcvDmaComplete:1;
+ HWUL DmaErrorAck:1;
+ HWUL Reserved0:1;
+ HWUL XmitIdenMismatch:1;
+ HWUL XmitDmaOverflow:1;
+ HWUL XmitComplete0:1;
+ HWUL XmitComplete1:1;
+ HWUL XmitComplete2:1;
+ HWUL XmitComplete3:1;
+ HWUL XmitComplete4:1;
+ HWUL XmitComplete5:1;
+ HWUL XmitComplete6:1;
+ HWUL XmitComplete7:1;
+ HWUL Pci: 1;
+ HWUL Reserved1:14;
+ };
+
+ HWUL Register;
+ };
+}
+ MIDWAY_REG_IS,
+ *PMIDWAY_REG_IS;
+
+typedef struct _MIDWAY_REG_IE
+{
+ union
+ {
+ struct
+ {
+ HWUL EnableStatusOverflow:1;
+ HWUL EnableSuni:1;
+ HWUL EnableService:1;
+ HWUL EnableXmitDmaComplete:1;
+ HWUL EnableRcvDmaComplete:1;
+ HWUL EnableDmaErrorAck:1;
+ HWUL Reserved0:1;
+ HWUL EnableXmitIdenMismatch:1;
+ HWUL EnableXmitDmaOverflow: 1;
+ HWUL EnableXmitComplete0:1;
+ HWUL EnableXmitComplete1:1;
+ HWUL EnableXmitComplete2:1;
+ HWUL EnableXmitComplete3:1;
+ HWUL EnableXmitComplete4:1;
+ HWUL EnableXmitComplete5:1;
+ HWUL EnableXmitComplete6:1;
+ HWUL EnableXmitComplete7:1;
+ HWUL EnablePci:1;
+ HWUL Reserved1:14;
+ };
+
+ HWUL Register;
+ };
+}
+ MIDWAY_REG_IE,
+ *PMIDWAY_REG_IE;
+
+typedef struct _MIDWAY_REG_MCS
+{
+ union
+ {
+ struct
+ {
+ HWUL Wait500us:1;
+ HWUL Wait1ms:1;
+ HWUL RcvEnable:1;
+ HWUL XmitEnable:1;
+ HWUL DmaEnable:1;
+ HWUL XmitLockMode:1;
+ HWUL Wait2ms:1;
+ HWUL Wait4ms:1;
+ HWUL Reserved0:24;
+ };
+
+ HWUL Register;
+ };
+}
+ MIDWAY_REG_MCS,
+ *PMIDWAY_REG_MCS;
+
+typedef struct _MIDWAY_REG_STATISTICS
+{
+ union
+ {
+ struct
+ {
+ HWUL OverflowTrash:16;
+ HWUL VciTrash:16;
+ };
+
+ HWUL Register;
+ };
+}
+ MIDWAY_REG_STATISTICS,
+ *PMIDWAY_REG_STATISTICS;
+
+typedef struct _MIDWAY_REG_SERVICE_LIST
+{
+ union
+ {
+ struct
+ {
+ HWUL WritePointer:10;
+ HWUL Reserved0:22;
+ };
+
+ HWUL Register;
+ };
+}
+ MIDWAY_REG_SERVICE_LIST,
+ *PMIDWAY_REG_SERVICE_LIST;
+
+typedef struct _MIDWAY_REG_DMA_WRITE_RCV
+{
+ union
+ {
+ struct
+ {
+ HWUL Pointer:9;
+ HWUL Reserved0: 23;
+ };
+
+ HWUL Register;
+ };
+}
+ MIDWAY_REG_DMA_WRITE_RCV,
+ *PMIDWAY_REG_DMA_WRITE_RCV;
+
+typedef struct _MIDWAY_REG_DMA_READ_RCV
+{
+ union
+ {
+ struct
+ {
+ HWUL Pointer:9;
+ HWUL Reserved0:23;
+ };
+
+ HWUL Register;
+ };
+}
+ MIDWAY_REG_DMA_READ_RCV,
+ *PMIDWAY_REG_DMA_READ_RCV;
+
+struct _MIDWAY_REG_DMA_WRITE_XMIT
+{
+ union
+ {
+ struct
+ {
+ HWUL Pointer:9;
+ HWUL Reserved0:23;
+ };
+
+ HWUL Register;
+ };
+}
+ MIDWAY_REG_DMA_WRITE_XMIT,
+ *PMIDWAY_REG_DMA_WRITE_XMIT;
+
+struct _MIDWAY_REG_DMA_READ_XMIT
+{
+ union
+ {
+ struct
+ {
+ HWUL Pointer:9;
+ HWUL Reserved0:23;
+ };
+
+ HWUL Register;
+ };
+}
+ MIDWAY_REG_DMA_READ_XMIT,
+ *PMIDWAY_REG_DMA_READ_XMIT;
+
+struct _MIDWAY_REGISTERS
+{
+ HWUL ResetId;
+ HWUL ISA;
+ HWUL IS;
+ HWUL IE;
+ HWUL MCS;
+ HWUL Statistics;
+ HWUL ServiceList;
+
+ HWUL Reserved;
+
+ HWUL DmaWriteRcv;
+ HWUL DmaReadRcv;
+ HWUL DmaWriteXmit;
+ HWUL DmaReadXmit;
+
+ HWUL Unused[4];
+
+ MIDWAY_XMIT_REGISTERS TransmitRegisters[MIDWAY_MAX_SEGMENT_CHANNELS];
+};
+
+
+//
+// The following defines are used for the interrupt registers.
+//
+// IS - If a bit is set then the interrupt is pending.
+// ISA - If a bit is set then the interrupt is pending.
+// When read, ALL bits are cleared. Accept SUNI_INT &
+// STAT_OVFL which require additionl action. ??PCI_INT??
+// IE - If a bit is set then the interrupt is enabled.
+//
+#define MID_REG_INT_PCI BIT(17)
+#define MID_REG_INT_XMT_COMPLETE_7 BIT(16)
+#define MID_REG_INT_XMT_COMPLETE_6 BIT(15)
+#define MID_REG_INT_XMT_COMPLETE_5 BIT(14)
+#define MID_REG_INT_XMT_COMPLETE_4 BIT(13)
+#define MID_REG_INT_XMT_COMPLETE_3 BIT(12)
+#define MID_REG_INT_XMT_COMPLETE_2 BIT(11)
+#define MID_REG_INT_XMT_COMPLETE_1 BIT(10)
+#define MID_REG_INT_XMT_COMPLETE_0 BIT(9)
+#define MID_REG_INT_XMT_DMA_OVFL BIT(8)
+#define MID_REG_INT_XMT_IDEN_MISMTCH BIT(7)
+#define MID_REG_INT_DMA_ERR_ACK BIT(5)
+#define MID_REG_INT_RCV_DMA_COMPLETE BIT(4)
+#define MID_REG_INT_XMT_DMA_COMPLETE BIT(3)
+#define MID_REG_INT_SERVICE BIT(2)
+#define MID_REG_INT_SUNI_INT BIT(1)
+#define MID_REG_INT_STAT_OVFL BIT(0)
+
+#define MID_REG_MC_S_WAIT_4_MS bit(7)
+#define MID_REG_MC_S_WAIT_2_MS BIT(6)
+#define MID_REG_MC_S_XMT_LOCK_MODE BIT(5)
+#define MID_REG_MC_S_DMA_ENABLE BIT(4)
+#define MID_REG_MC_S_XMT_ENABLE BIT(3)
+#define MID_REG_MC_S_RCV_ENABLE BIT(2)
+#define MID_REG_MC_S_WAIT_1_MS BIT(1)
+#define MID_REG_MC_S_WAIT_500_US BIT(0)
+
+
+#define MID_REG_STAT_VCI_TRASH(reg_value) ((reg_value >> 0x16) & 0xff)
+#define MID_REG_STAT_OVFL_TRASH(reg_value) (reg_value & 0xff)
+
+//
+// Format for the Midway's service list. This is simply a 1k queue,
+// of VC's that need DMA servicing
+//
+typedef struct _MIDWAY_SERVICE_LIST
+{
+ union
+ {
+ struct
+ {
+ HWUL VciNumber:10;
+ HWUL Reserved;
+ };
+
+ HWUL Register;
+ };
+}
+ MIDWAY_SERVICE_LIST,
+ *PMIDWAY_SERVICE_LIST;
+
+
+typedef struct _MIDWAY_DMA_DESC
+{
+ union
+ {
+ struct
+ {
+ //
+ // This is used to skip a block of memory instead of performing
+ // DMA transfers.
+ //
+ HWUL JustKidding:1;
+
+ //
+ // The End field is set by the host when setting up the descriptor
+ // for the last DMA block of a PDU. It must be set in the last
+ // DMA_Descriptor for the VCI.
+ //
+ HWUL End:1;
+
+ //
+ // This is the VC that points to the Reassembly_queue with the
+ // data to be DMA'd.
+ //
+ HWUL Vci:10;
+
+ //
+ // Number of bytes to be transfered.
+ //
+ HWUL Count:18;
+
+ HWUL Reserved:2;
+ };
+
+ HWUL Register;
+ };
+
+ HWUL LowHostAddress;
+}
+ MIDWAY_DMA_DESC,
+ *PMIDWAY_DMA_DESC;
+
+typedef union _VCI_TABLE_ENTRY_WORD_0
+{
+ struct
+ {
+ //
+ // This identifies whether or not the VCI is currently in the
+ // Service_list.
+ //
+ HWUL InService:1;
+
+ HWUL Reserved:14;
+
+ //
+ // Specifies the size of the Reassembly_queue.
+ //
+ HWUL Size:3;
+
+ //
+ // This contains up to the 11 MSBs of the address location of the
+ // corresponding Reassembly_queue in adapter memory.
+ //
+ HWUL Location:11;
+
+ //
+ // When set we will preserve OAM F5 cellson the given VCI and
+ // direct them to VCI 3 (the OAM channel). When clear the
+ // OAM F5 cells that are received on this VCI will be trashed.
+ //
+ HWUL PtiMode:1;
+
+ //
+ // Indicates the operation mode of the VC:
+ // 00 = Trash
+ // 01 = non-AAL5
+ // 10 = AAL5
+ // 11 = Reserved
+ //
+ HWUL Mode:2;
+ };
+
+ HWUL Register;
+}
+ _VCI_TABLE_ENTRY_WORD_0,
+ *PVCI_TABLE_ENTRY_WORD_0;
+
+typedef union _VCI_TABLE_ENTRY_WORD_1
+{
+ struct
+ {
+ //
+ // Points to the last 32-bit word that was DMA'd to host memory
+ // from the Reassembly_queue.
+ //
+ HWUL ReadPtr:15;
+
+ HWUL Reserved0:1;
+
+ //
+ // Points to the start of the reassembly buffer descriptor
+ // currently being reassembled in the Reassembly_queue, or
+ // the next free location in adapter memory when the channel
+ // is idle.
+ //
+ HWUL DescStart:15;
+
+ HWUL Reserved1:1;
+ };
+
+ HWUL Register;
+}
+ VCI_TABLE_ENTRY_WORD_1,
+ *PVCI_TABLE_ENTRY_WORD_1;
+
+typedef union _VCI_TABLE_ENTRY_WORD_2
+{
+ struct
+ {
+ //
+ // Contains the temporary cell count for the PDU currently being
+ // reassembled.
+ //
+ HWUL CellCount:11;
+
+ HWUL Reserved0:3;
+
+ //
+ // Indicates the current state of the VCI:
+ // 00 = Idle
+ // 01 = Reassembling
+ // 11 = Trashing
+ //
+ HWUL State:2;
+
+ //
+ // Points to the next free 32-bit word which will be overwritten
+ // by the next reassembled word in the Reassembly_queue.
+ //
+ HWUL writeptr: 15;
+
+ HWUL Reserved1: 1;
+ };
+
+ HWUL Register;
+}
+ VCI_TABLE_ENTRY_WORD_2,
+ *PVCI_TABLE_ENTRY_WORD_2;
+
+typedef struct _MIDWAY_VCI_TABLE_ENTRY
+{
+ //
+ // See the above structures for the definitions of these.
+ //
+ HWUL Register0;
+ HWUL Register1;
+ HWUL Register2;
+
+ //
+ // This last ULONG contains the temporary CRC value being calculated
+ // by the PDU currently being reassembled.
+ //
+ HWUL Register3;
+}
+ MIDWAY_VCI_TABLE_ENTRY,
+ *PMIDWAY_VCI_TABLE_ENTRY;
+
+
+//
+// Transmit Segmentation Channel.
+//
+// This is allocated for each segmentation channel. This has
+// all the information about each channel, e.g. buffers, size, etc....
+//
+
+struct _XMIT_SEG_CHANNEL
+{
+ PXMIT_SEG_CHANNEL Next; // Next pointer.
+ PADAPTER_BLOCK Adapter; // Pointer to the adapter.
+
+ UINT MidwayChannelNumber;
+
+ //
+ // Copy of the Midway transmit registers. This is the initial set of
+ // the transmit registers for the segmentation channel.
+ //
+ MIDWAY_XMIT_REGISTERS MidwayInitRegs;
+
+ //
+ // Pointer to the transmit registers.
+ //
+ PMIDWAY_XMIT_REGISTERS MidwayTransmitRegs;
+
+ //
+ // Size of the segment in 32-bit words.
+ //
+ UINT SegmentSize;
+
+ //
+ // Pointer to the segment memory on the nic.
+ //
+ HWUL *Segment;
+
+ //
+ // Host copy of the read pointer. This is used to determine how much
+ // memory has been freed up when the transmit complete interrupt occurs.
+ //
+ UINT SegmentReadPointer;
+
+ //
+ // Host copy of the write pointer. This is in size of words.
+ //
+ UINT SegmentWritePointer;
+
+ //
+ // The amount of free memory that is available in the transmit segment.
+ //
+ UINT SegmentRoom;
+
+ //
+ // Queue of transmit descriptors waiting for segment room.
+ //
+ LIST_ENTRY SegmentWaitQ;
+
+ //
+ // Queue of transmit descriptors waiting for transmit completion.
+ // These have been handed to the DMA/XMIT engine and are awaiting
+ // completion.
+ //
+ LIST_ENTRY TransmitWaitQ;
+
+ //
+ // Number of Bytes queued on the channel.
+ //
+ UINT XmitPduBytes;
+
+ //
+ // Flags for the transmit segmentation channel.
+ //
+ ULONG flags;
+
+ //
+ // Spin lock for this structure.
+ //
+ NDIS_SPIN_LOCK lock;
+};
+
+#define fXSC_XMIT_START_ACTIVE 0x00000001
+#define fXSC_CBR_ONLY 0x00000002
+
+//
+// Contains information about the Segmentation and Reassembly unit.
+//
+struct _SAR_INFO
+{
+ //
+ // Number of segmentation channels.
+ //
+ XMIT_SEG_CHANNEL XmitSegChannel[MIDWAY_MAX_SEGMENT_CHANNELS];
+
+ //
+ // Points to the free segmentation channel.
+ //
+ PXMIT_SEG_CHANNEL FreeXmitSegChannel;
+ NDIS_SPIN_LOCK lockFreeXmitSegment;
+
+ //
+ // UBR transmit channel.
+ //
+ PXMIT_SEG_CHANNEL ubrXmitChannel;
+
+ UINT ReceiveServiceEntry;
+
+ UINT MidwayMasterControl;
+};
+
+
+
+#endif // __SAR_H