singrdk/base/Drivers/Network/Intel/IntelConstants.cs

385 lines
15 KiB
C#
Raw Permalink Normal View History

2008-11-17 18:29:00 -05:00
///////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
namespace Microsoft.Singularity.Drivers.Network.Intel
{
//
// Memory Mapped Register offsets
//
internal struct Register
{
// control / status
internal const uint CTRL = 0x0000;
internal const uint STATUS = 0x0008;
// EEPROM access
internal const uint EECD = 0x0010;
internal const uint EERD = 0x0014;
internal const uint FLA = 0x001c;
// Device controls
internal const uint CTRL_EXT = 0x0018;
internal const uint MDIC = 0x0020;
internal const uint FCAL = 0x0028;
internal const uint FCAH = 0x002C;
internal const uint FCT = 0x0030;
internal const uint VET = 0x0038;
internal const uint FCTTV = 0x0170;
internal const uint TXCW = 0x0178;
internal const uint RXCW = 0x0180;
internal const uint LED_CTRL = 0x0e00;
// DMA
internal const uint PBA = 0x1000;
// Interrupts
internal const uint ICR = 0x00c0;
internal const uint ITR = 0x00c4;
internal const uint ICS = 0x00c8;
internal const uint IMS = 0x00d0;
internal const uint IMC = 0x00d8;
// Receive
internal const uint RECV_CTRL = 0x0100;
internal const uint FLOW_CTRL_RECV_LO = 0x2160;
internal const uint FLOW_CTRL_RECV_HI = 0x2168;
internal const uint RECV_DESC_BASE_LO = 0x2800;
internal const uint RECV_DESC_BASE_HI = 0x2804;
internal const uint RECV_DESC_LENGTH = 0x2808;
internal const uint RECV_DESC_HEAD = 0x2810;
internal const uint RECV_DESC_TAIL = 0x2818;
internal const uint RECV_DELAY_TIMER = 0x2820;
internal const uint RECV_INT_ABS_TIMER = 0x282c;
internal const uint RECV_SML_PKT_INT = 0x2c00;
internal const uint RECV_CHECKSUM = 0x5000;
internal const uint MTA_START = 0x5200;
internal const uint RAL0 = 0x5400;
internal const uint RAH0 = 0x5404;
// Transmit
internal const uint TSMT_CTRL = 0x0400;
internal const uint TSMT_IPG = 0x0410;
internal const uint TSMT_IFS_THROTTLE = 0x0458;
internal const uint TSMT_DESC_BASE_LO = 0x3800;
internal const uint TSMT_DESC_BASE_HI = 0x3804;
internal const uint TSMT_DESC_LENGTH = 0x3808;
internal const uint TSMT_DESC_HEAD = 0x3810;
internal const uint TSMT_DESC_TAIL = 0x3818;
internal const uint TSMT_INT_DELAY = 0x3820;
// stats
internal const uint RX_ERR_COUNT = 0x400c;
internal const uint TOTAL_RECV_PACKETS = 0x40d0;
internal const uint TOTAL_TSMT_PACKETS = 0x40d4;
}
// Bits for control reg
internal struct CtrlBits
{
internal const uint FD = 1u << 0;
internal const uint LRST = 1u << 3;
internal const uint ASDE = 1u << 5;
internal const uint SLU = 1u << 6;
internal const uint ILOS = 1u << 7;
internal const uint FRCSPD = 1u << 11;
internal const uint FRCDPLX = 1u << 12;
internal const uint SDP0_DATA = 1u << 18;
internal const uint SDP1_DATA = 1u << 19;
internal const uint ADVD3WUC = 1u << 20;
internal const uint EN_PHYS_PWR_MGMT = 1u << 21;
internal const uint SDP0_IODIR = 1u << 22;
internal const uint SDP1_IODIR = 1u << 23;
internal const uint RST = 1u << 26;
internal const uint RFCE = 1u << 27;
internal const uint TFCE = 1u << 28;
internal const uint VME = 1u << 30;
internal const uint PHY_RST = 1u << 31;
internal const uint SPEED_10Mb = 0u;
internal const uint SPEED_100Mb = 1u << 8;
internal const uint SPEED_1000Mb = 2u << 8;
internal const uint SPEED = 3u << 8;
}
// Bits for setting the interrupt mask
internal struct InterruptMasks
{
internal const uint TXDW = 1u << 0;
internal const uint TXQE = 1u << 1;
internal const uint LSC = 1u << 2;
internal const uint RXSEQ = 1u << 3;
internal const uint RXDMT0 = 1u << 4;
internal const uint RXO = 1u << 6;
internal const uint RXT0 = 1u << 7;
internal const uint MDAC = 1u << 9;
internal const uint RXCFG = 1u << 10;
internal const uint PHYINT = 1u << 12;
internal const uint TXD_LOW = 1u << 15;
internal const uint SRPD = 1u << 16;
}
// Bits for extended control reg
internal struct CtrlExtBits
{
internal const uint PHY_INTERUPT = 1u << 5;
internal const uint ASD_CHECK = 1u << 12;
internal const uint EE_RST = 1u << 13;
internal const uint SPD_BYPASS = 1u << 15;
internal const uint RO_DIS = 1u << 17;
internal const uint VREG_POWER_DOWN = 1u << 21;
internal const int LINK_MODE_LO_BIT = 22u;
internal const int LINK_MODE_HI_BIT = 23u;
internal const uint LINK_MODE_PHYS = 0u;
internal const uint LINK_MODE_SERDES = 2u;
internal const uint LINK_MODE_EXT_TBI = 3u;
}
internal struct RecvCtrlBits
{
internal const uint RECV_ENABLE = 1u << 1;
internal const uint STORE_BAD_PKTS = 1u << 2;
internal const uint UNICAST_PROMISCUOUS = 1u << 3;
internal const uint MULTICAST_PROMISCUOUS = 1u << 4;
internal const uint LONG_PKT_ENABLE = 1u << 5;
internal const uint BROADCAST_ACCEPT = 1u << 15;
internal const uint VLAN_FILTER_ENABLE = 1u << 18;
internal const uint CANONICAL_FORM_ENABLE = 1u << 19;
internal const uint DISCARD_PAUSE_FRAMES = 1u << 22;
internal const uint PASS_MAC_CTRL_FRAMES = 1u << 23;
internal const uint STRIP_CRC = 1u << 26;
internal const uint LOOPBACK_MODE_DISABLE = 0u << 6;
internal const uint LOOPBACK_MODE_ENABLE = 3u << 6;
internal const uint RECV_DESC_THRESHOLD_HALF = 0u << 8;
internal const uint RECV_DESC_THRESHOLD_QUARTER= 1u << 8;
internal const uint RECV_DESC_THRESHOLD_EIGHTH = 2u << 8;
internal const int MULTICAST_OFFSET_LO_BIT = 12u;
internal const int MULTICAST_OFFSET_HI_BIT = 13u;
internal const uint MULTICAST_OFFSET_47_36 = 0u;
internal const uint MULTICAST_OFFSET_46_35 = 1u;
internal const uint MULTICAST_OFFSET_45_34 = 2u;
internal const uint MULTICAST_OFFSET_43_32 = 3u;
internal const uint BUFFER_SIZE_MASK = 0x02030000;
internal const uint BUFFER_SIZE_256B = 0x00030000;
internal const uint BUFFER_SIZE_512B = 0x00020000;
internal const uint BUFFER_SIZE_1KB = 0x00010000;
internal const uint BUFFER_SIZE_2KB = 0x00000000;
internal const uint BUFFER_SIZE_4KB = 0x02030000;
internal const uint BUFFER_SIZE_8KB = 0x02020000;
internal const uint BUFFER_SIZE_16KB = 0x02010000;
}
internal struct TsmtCtrlBits
{
internal const uint TSMT_ENABLE = 1u << 1;
internal const uint PAD_SHORT_PACKETS = 1u << 3;
internal const uint SOFTWARE_XOFF_TRANS = 1u << 22;
internal const uint RE_TSMT_LATE_COLL = 1u << 24;
internal const uint NO_RE_TSMT_ON_UNDERRUN = 1u << 25;
internal const uint COLL_THRESHOLD_DEFAULT = 0x0fu << 4;
internal const uint COLL_DISTANCE_DEFAULT = 0x40u << 12;
}
internal struct TsmtIpg
{
internal const uint DEFAULT_IPG_T = 10u << 0;
internal const uint DEFAULT_IPG_R1 = 10u << 10;
internal const uint DEFAULT_IPG_R2 = 10u << 20;
internal const uint DEFAULT_IPG = (DEFAULT_IPG_T |
DEFAULT_IPG_R1 |
DEFAULT_IPG_R2);
}
internal struct RecvChecksumBits
{
internal const uint IP_CHECKSUM_ENABLE = 1u << 8;
internal const uint TCP_CHECKSUM_ENABLE = 1u << 9;
internal const uint IP6_CHECKSUM_ENABLE = 1u << 10;
}
//
// The defaults for the rx interrupt delay timers
//
internal struct RxDelayTimers
{
internal const uint RECV_DELAY_TIMER = 100u; // ~100 us
internal const uint RECV_ABSOLUTE_TIMER = 1000u; // ~1000 us
}
//
// Recieve address High bits
//
internal struct RahRegister
{
internal const uint ADDRESS_VALID = 1u << 31;
}
//
// MultiCast Table Array
//
internal struct MtaRegister
{
internal const uint MTA_LENGTH = 128;
}
//
// bits for EEPROM Read register
//
internal class EerdRegister
{
uint done;
int shift;
internal EerdRegister (ushort devIdArg)
{
if (devIdArg == 0x1019 || // 82547 EI/GI
devIdArg == 0x1013 || // 82541 EI
devIdArg == 0x1018 || // 82541 EI Mobile
devIdArg == 0x1076 || // 82541 GI/PI
devIdArg == 0x1077 || // 82541 GI Mobile
devIdArg == 0x1078 || // 82541 ER Copper
devIdArg == 0x107c) { // 82541 PI
done = 0x02;
shift = 2;
}
else {
done = 0x10;
shift = 8;
}
}
internal uint Done { get { return done; } }
internal int AddressShift { get { return shift; } }
internal const uint Start = 0x01;
internal const int DataShift = 16;
}
internal struct Mdic
{
internal const uint DataMask = 0x0000ffff;
internal const uint MdiWrite = 0x04000000;
internal const uint MdiRead = 0x08000000;
internal const uint Ready = 0x10000000;
internal const uint InterruptEnable = 0x20000000;
internal const uint Error = 0x40000000;
internal const uint PowerMask = 0xfffff7ff;
internal const uint RegMask = 0x1f;
internal const int RegRoll = 16;
internal const uint PhyMask = 0x1f;
internal const int PhyRoll = 21;
}
//
// Bit fields common to both rx and tx descriptors (relative to ulong
// control words
//
internal struct Descriptor
{
internal const ulong DESCRIPTOR_DONE = 0x100000000ul;
}
//
// Bit fields common to both rx and tx descriptors (relative to uint
// stat part of control words
//
internal struct DescriptorStat
{
internal const ulong DESCRIPTOR_DONE = 0x1u;
internal const ulong DESCRIPTOR_EXCESS_COLLISIONS = 0x2u;
internal const ulong DESCRIPTOR_LATE_COLLISION = 0x4u;
internal const ulong DESCRIPTOR_TRANSMIT_OVERRUN = 0x8u;
}
//
// The parts within a recieve descriptor
//
internal struct RxDescriptor
{
internal const ulong LENGTH_MASK = 0xfffful;
internal const int LENGTH_SHIFT = 0u;
internal const ulong ERR_STAT_MASK = 0xffff00000000ul;
internal const int ERR_STAT_SHIFT = 32u;
}
//
// Fields within the Errors and Stats parts of a recieve descriptor
//
internal struct RxErrStatFields
{
// status
internal const uint STATUS_MASK = 0x00ff;
internal const uint DESCRIPTOR_DONE = 1u << 0;
internal const uint END_OF_PACKET = 1u << 1;
internal const uint IGNORE_CHECKSUM = 1u << 2;
internal const uint VLAN_PACKET = 1u << 3;
internal const uint TCP_CHECKSUM_CALC = 1u << 5;
internal const uint IP_CHECKSUM_CALC = 1u << 6;
internal const uint PASSED_IN_EXACT = 1u << 7;
// errors
internal const uint ERR_MASK = 0xff00;
internal const uint CRC_ERROR = 1u << 8;
internal const uint SYMBOL_ERROR = 1u << 9;
internal const uint SEQUENCE_ERROR = 1u << 10;
internal const uint CARRIER_EXT_ERROR = 1u << 12;
internal const uint TCP_CHECKSUM_ERROR = 1u << 13;
internal const uint IP_CHECKSUM_ERROR = 1u << 14;
internal const uint RX_DATA_ERROR = 1u << 15;
}
//
// The parts within a recieve descriptor
//
internal struct TxDescriptor
{
internal const ulong LENGTH_MASK = 0xfffful;
internal const int LENGTH_SHIFT = 0u;
internal const ulong ERR_STAT_MASK = 0xf00000000ul;
internal const int ERR_STAT_SHIFT = 32u;
}
internal struct TxCmdFields
{
// status
internal const uint END_OF_PACKET = 1u << 24;
internal const uint INSERT_FCS = 1u << 25;
internal const uint INSERT_CHECKSUM = 1u << 26;
internal const uint REPORT_STATUS = 1u << 27;
internal const uint REPORT_PACKET_SENT = 1u << 28;
internal const uint EXTENTION_MODE = 1u << 29;
internal const uint VLAN_PACKET_ENABLE = 1u << 30;
internal const uint INT_DELAY_ENABLE = 1u << 31;
}
internal struct TxStatErrFields
{
// status
internal const uint DESCRIPTOR_DONE = 1u << 0;
internal const uint LATE_COLLISION = 1u << 1;
internal const uint EXCESS_COLLISIONS = 1u << 2;
internal const uint TRANSMIT_UNDERRUN = 1u << 3;
}
}