Unit SMC91X
Return to Unit Reference
Description
SMSC 91C9x/91C1xx Ethernet Driver unit
The SMSC 91C9x/91C1xx are a family of Non-PCI 10/100 Ethernet Single Chip MAC + PHY devices.
This driver is primarily intended to support the LAN91C111 Ethernet device included in the QEMU Versatile PB emulation however the driver is based on the equivalent Linux driver and as such includes (untested) support for a number of chip variants (see SMC91X_CHIP_* constants below).
The QEMU emulation does not include support for a number of the features provided in the real chip so they are either currently not supported or are untested without access to a physical chip implementation for testing.
Constants
SMC91X_*
SMC91X_NETWORK_DESCRIPTION = 'SMSC 91C9x/91C1xx Ethernet';
|
Description of SMC91X device |
SMC91X_COMPLETION_THREAD_STACK_SIZE = SIZE_128K;
|
Stack size of receive and transmit completion thread |
SMC91X_COMPLETION_THREAD_PRIORITY = THREAD_PRIORITY_HIGHER;
|
Priority of receive and transmit completion thread |
SMC91X_COMPLETION_THREAD_NAME = 'SMSC 91C9x/91C1xx Completion';
|
Name of receive and transmit completion thread |
SMC91X_COMPLETION_RECEIVE = 0;
|
A receive message sent to the completion thread |
SMC91X_COMPLETION_TRANSMIT = 1;
|
A transmit message sent to the completion thread |
SMC91X_COMPLETION_ALLOCATE = 2;
|
An allocate message sent to the completion thread |
SMC91X_COMPLETION_TERMINATE = 3;
|
A terminate message sent to the completion thread |
SMC91X_MAX_TX_ENTRIES = SIZE_16;
|
Number of Transmit buffers allocated |
SMC91X_MAX_RX_ENTRIES = SIZE_256;
|
Number of Receive buffers allocated |
SMC91X_MAX_PACKET_SIZE = 2048;
|
SMC91X_TCR_*
SMC91X_TCR_ENABLE = $0001;
|
Transmit enabled when set |
SMC91X_TCR_LOOP = $0002;
|
Loopback. General purpose output port used to control the LBK pin. |
SMC91X_TCR_FORCOL = $0004;
|
When set, the FORCOL bit will force a collision by not deferring deliberately. |
SMC91X_TCR_PAD_EN = $0080;
|
When set, will pad transmit frames shorter than 64 bytes with 00. |
SMC91X_TCR_NOCRC = $0100;
|
Does not append CRC to transmitted frames when set |
SMC91X_TCR_MON_CSN = $0400;
|
When set monitors carrier while transmitting |
SMC91X_TCR_FDUPLX = $0800;
|
When set will cause frames to be received if they pass the address filter regardless of the source for the frame. When clear the node will not receive a frame sourced by itself. |
SMC91X_TCR_STP_SQET = $1000;
|
Stop transmission on SQET error. If this bit is set, will stop and disable the transmitter on SQE test error. |
SMC91X_TCR_EPH_LOOP = $2000;
|
Internal loopback at the EPH block |
SMC91X_TCR_SWFDUP = $8000;
|
Enables Switched Full Duplex mode |
Default settings | |
SMC91X_TCR_DEFAULT = SMC91X_TCR_ENABLE or SMC91X_TCR_PAD_EN;
|
|
SMC91X_TCR_CLEAR = 0;
|
SMC91X_EPH_STATUS_*
SMC91X_EPH_STATUS_TX_SUC = $0001;
|
Last transmit was successful. Set if transmit completes without a fatal error. |
SMC91X_EPH_STATUS_SNGL_COL = $0002;
|
Single collision detected for the last transmit frame. Set when a collision is detected. |
SMC91X_EPH_STATUS_MUL_COL = $0004;
|
Multiple collision detected for the last transmit frame. Set when more than one collision was experienced. |
SMC91X_EPH_STATUS_LTX_MULT = $0008;
|
Last transmit frame was a multicast. Set if frame was a multicast. |
SMC91X_EPH_STATUS_16COL = $0010;
|
16 collisions reached. Set when 16 collisions are detected for a transmit frame. |
SMC91X_EPH_STATUS_SQET = $0020;
|
Signal Quality Error Test |
SMC91X_EPH_STATUS_LTXBRD = $0040;
|
Last transmit frame was a broadcast. Set if frame was broadcast. |
SMC91X_EPH_STATUS_TXDEFR = $0080;
|
Transmit Deferred. When set, carrier was detected during the first 6.4us of the inter frame gap. |
SMC91X_EPH_STATUS_LATCOL = $0200;
|
Late collision detected on last transmit frame. If set a late collision was detected (later than 64 byte times into the frame). |
SMC91X_EPH_STATUS_LOSTCARR = $0400;
|
Lost Carrier Sense. When set indicates that Carrier Sense was not present at end of preamble. |
SMC91X_EPH_STATUS_EXC_DEF = $0800;
|
Excessive Deferral. When set last/current transmit was deferred for more than 1518 * 2 byte times. |
SMC91X_EPH_STATUS_CTR_ROL = $1000;
|
Counter Roll Over. When set one or more 4 bit counters have reached maximum count (15). |
SMC91X_EPH_STATUS_LINK_OK = $4000;
|
General purpose input port driven by nLNK pin inverted |
SMC91X_EPH_STATUS_TXUNRN = $8000;
|
TX Underrun |
SMC91X_RCR_*
SMC91X_RCR_RX_ABORT = $0001;
|
This bit is set if a receive frame was aborted due to length longer than 2K bytes. The frame will not be received. The bit is cleared by RESET or by the CPU writing it low. |
SMC91X_RCR_PRMS = $0002;
|
Promiscuous mode. When set receives all frames. Does not receive its own transmission unless it is in Full Duplex. |
SMC91X_RCR_ALMUL = $0004;
|
When set accepts all multicast frames (frames in which the first bit of DA is '1'). When clear accepts only the multicast frames that match the multicast table setting. Defaults low. |
SMC91X_RCR_RXEN = $0100;
|
Enables the receiver when set. If cleared, completes receiving current frame and then goes idle. Defaults low on reset. |
SMC91X_RCR_STRIP_CRC = $0200;
|
When set, it strips the CRC on received frames. As a result, both the Byte Count and the frame format do not contain the CRC. When clear, the CRC is stored in memory following the packet. Defaults low. |
SMC91X_RCR_ABORT_ENB = $0200;
|
Enables abort of receive when collision occurs. Defaults low. When set, will automatically abort a packet being received when the appropriate collision input is activated. |
SMC91X_RCR_FILT_CAR = $0400;
|
Filter Carrier. When set filters leading edge of carrier sense for 12 bit times (3 nibble times). Otherwise recognizes a receive frame as soon as carrier sense is active. (Does NOT filter RX DV on MII) |
SMC91X_RCR_SOFTRST = $8000;
|
Software-Activated Reset. Active high. Initiated by writing this bit high and terminated by writing the bit low. |
Default settings | |
SMC91X_RCR_DEFAULT = SMC91X_RCR_STRIP_CRC or SMC91X_RCR_RXEN;
|
|
SMC91X_RCR_CLEAR = 0;
|
SMC91X_RPC_*
SMC91X_RPC_SPEED = $2000;
|
Speed select Input (1=100Mbps / 0=0Mbps) |
SMC91X_RPC_DPLX = $1000;
|
Duplex Select - This bit selects Full/Half Duplex operation (1=Full Duplex / 0=Half Duplex)) |
SMC91X_RPC_ANEG = $0800;
|
Auto-Negotiation mode select |
SMC91X_RPC_LS2A = $0080;
|
LED select Signal Enable. These bits define what LED control signals are routed to the LEDA output pin on the Ethernet Controller. The default is 10/100 Link detected. |
SMC91X_RPC_LS1A = $0040;
|
|
SMC91X_RPC_LS0A = $0020;
|
|
SMC91X_RPC_LS2B = $0010;
|
LED select Signal Enable. These bits define what LED control signals are routed to the LEDB output pin on the Ethernet Controller. The default is 10/100 Link detected. |
SMC91X_RPC_LS1B = $0008;
|
|
SMC91X_RPC_LS0B = $0004;
|
|
Default Settings | |
SMC91X_RPC_DEFAULT = SMC91X_RPC_ANEG or SMC91X_RPC_SPEED or SMC91X_RPC_DPLX;
|
|
RPC LS2A/LS1A/LS0A and LS2B/LS1B/LS0B values | |
SMC91X_RPC_LED_100_10 = $00;
|
LED = 100Mbps OR's with 10Mbps link detect |
SMC91X_RPC_LED_RES = $01;
|
LED = Reserved |
SMC91X_RPC_LED_10 = $02;
|
LED = 10Mbps link detect |
SMC91X_RPC_LED_FD = $03;
|
LED = Full Duplex Mode |
SMC91X_RPC_LED_TX_RX = $04;
|
LED = TX or RX packet occurred |
SMC91X_RPC_LED_100 = $05;
|
LED = 100Mbps link detect |
SMC91X_RPC_LED_TX = $06;
|
LED = TX packet occurred |
SMC91X_RPC_LED_RX = $07;
|
LED = RX packet occurred |
SMC91X_CONFIG_*
SMC91X_CONFIG_EXT_PHY = $0200;
|
External PHY Enabled (1=Enables the external MII / 0=Internal PHY is enabled) |
SMC91X_CONFIG_GPCNTRL = $0400;
|
This bit is a general purpose output port. Its inverse value drives pin nCNTRL and it is typically connected to a SELECT pin of the external PHY device such as a power enable. |
SMC91X_CONFIG_NO_WAIT = $1000;
|
When set, does not request additional wait states. An exception to this are accesses to the Data Register if not ready for a transfer. |
SMC91X_CONFIG_EPH_POWER_EN = $8000;
|
Used to selectively power transition the EPH to a low power mode. When this bit is cleared (0), the Host will place the EPH into a low power mode. |
SMC91X_CONFIG_RESERVED = $20B1;
|
Reserved values |
Default is powered-up, Internal Phy, Wait States, and pin nCNTRL=low | |
SMC91X_CONFIG_DEFAULT = SMC91X_CONFIG_EPH_POWER_EN;
|
SMC91X_CTL_*
SMC91X_CTL_RCV_BAD = $4000;
|
When set, bad CRC packets are received. When clear bad CRC packets do not generate interrupts and their memory is released. |
SMC91X_CTL_AUTO_RELEASE = $0800;
|
When set, transmit pages are released by transmit completion if the transmission was successful (when TX_SUC is set). |
SMC91X_CTL_LE_ENABLE = $0080;
|
Link Error Enable. When set it enables the LINK_OK bit transition as one of the interrupts merged into the EPH INT bit. |
SMC91X_CTL_CR_ENABLE = $0040;
|
Counter Roll over Enable. When set, it enables the CTR_ROL bit as one of the interrupts merged into the EPH INT bit. |
SMC91X_CTL_TE_ENABLE = $0020;
|
Transmit Error Enable. When set it enables Transmit Error as one of the interrupts merged into the EPH INT bit. |
SMC91X_CTL_EEPROM_SELECT = $0004;
|
This bit allows the CPU to specify which registers the EEPROM RELOAD or STORE refers to |
SMC91X_CTL_RELOAD = $0002;
|
When set it will read the EEPROM and update relevant registers with its contents |
SMC91X_CTL_STORE = $0001;
|
When set, stores the contents of all relevant registers in the serial EEPROM. |
SMC91X_MMU_CMD_*
SMC91X_MMU_CMD_BUSY = 1;
|
When 1 the last command has not completed |
SMC91X_MMU_CMD_NOP = (0 shl 5);
|
NOOP - NO OPERATION |
SMC91X_MMU_CMD_ALLOC = (1 shl 5);
|
ALLOCATE MEMORY FOR TX (OR with number of 256 byte packets) |
SMC91X_MMU_CMD_RESET = (2 shl 5);
|
RESET MMU TO INITIAL STATE (Frees all memory allocations, clears relevant interrupts, resets packet FIFO pointers) |
SMC91X_MMU_CMD_REMOVE = (3 shl 5);
|
REMOVE FRAME FROM TOP OF RX FIFO (To be issued after CPU has completed processing of present receive frame) |
SMC91X_MMU_CMD_RELEASE = (4 shl 5);
|
REMOVE AND RELEASE TOP OF RX FIFO (Like 3) but also releases all memory used by the packet presently at the RX FIFO output) |
SMC91X_MMU_CMD_FREEPKT = (5 shl 5);
|
RELEASE SPECIFIC PACKET (Frees all pages allocated to the packet specified in the PACKET NUMBER REGISTER) |
SMC91X_MMU_CMD_ENQUEUE = (6 shl 5);
|
ENQUEUE PACKET NUMBER INTO TX FIFO (This is the normal method of transmitting a packet just loaded into RAM) |
SMC91X_MMU_CMD_RSTTXFIFO = (7 shl 5);
|
RESET TX FIFOs (This command will reset both TX FIFOs) |
SMC91X_AR_*
SMC91X_AR_FAILED = $80;
|
FAILED - A zero indicates a successful allocation completion. If the allocation fails the bit is set and only cleared when the pending allocation is satisfied. |
SMC91X_TXFIFO_*
SMC91X_TXFIFO_TEMPTY = $80;
|
TEMPTY - No transmit packets in completion queue. For polling purposes, uses the TX_INT bit in the Interrupt Status Register. |
SMC91X_RXFIFO_*
SMC91X_RXFIFO_REMPTY = $80;
|
REMPTY - No receive packets queued in the RX FIFO. For polling purposes, uses the RCV_INT bit in the Interrupt Status Register. |
SMC91X_PTR_*
SMC91X_PTR_RCV = $8000;
|
When RCV is set the address refers to the receive area and uses the output of RX FIFO as the packet number, when RCV is clear the address refers to the transmit area and uses the packet number at the Packet Number Register. |
SMC91X_PTR_AUTOINC = $4000;
|
It will auto-increment on accesses to the data register when AUTO INCR is set. The increment is by one for every byte access, by two for every word access, and by four for every double word access. |
SMC91X_PTR_READ = $2000;
|
Determines the type of access to follow. If the READ bit is high the operation intended is a read. |
SMC91X_IM_*
SMC91X_IM_MDINT = $80;
|
PHY MI Register 18 Interrupt |
SMC91X_IM_ERCV_INT = $40;
|
Early Receive Interrupt |
SMC91X_IM_EPH_INT = $20;
|
Set by Ethernet Protocol Handler section |
SMC91X_IM_RX_OVRN_INT = $10;
|
Set by Receiver Overruns |
SMC91X_IM_ALLOC_INT = $08;
|
Set when allocation request is completed |
SMC91X_IM_TX_EMPTY_INT = $04;
|
Set if the TX FIFO goes empty |
SMC91X_IM_TX_INT = $02;
|
Transmit Interrupt |
SMC91X_IM_RCV_INT = $01;
|
Receive Interrupt |
SMC91X_MII_*
SMC91X_MII_MSK_CRS100 = $4000;
|
Disables CRS100 detection during tx half dup |
SMC91X_MII_MDOE = $0008;
|
MII Output Enable |
SMC91X_MII_MCLK = $0004;
|
MII Clock, pin MDCLK |
SMC91X_MII_MDI = $0002;
|
MII Input, pin MDI |
SMC91X_MII_MDO = $0001;
|
MII Output, pin MDO |
SMC91X_MII_DELAY = 1;
|
The MII clock high/low times. 2 x this number gives the MII clock period in microseconds. |
SMC91X_RCV_THRESHOLD*
SMC91X_RCV_RCV_DISCRD = $0080;
|
Set to discard a packet being received. Will discard packets only in the process of being received. |
SMC91X_RCV_THRESHOLD = $001F;
|
RCV Threshold Mask |
SMC91X_RCV_*
SMC91X_RCV_ALGNERR = $8000;
|
Frame has alignment error |
SMC91X_RCV_BRODCAST = $4000;
|
Receive frame was Broadcast (The Multicast bit may also be set, software must ignore the Multicast bit for a Broadcast packet). |
SMC91X_RCV_BADCRC = $2000;
|
Frame has CRC error or RX_ER was asserted during reception |
SMC91X_RCV_ODDFRAME = $1000;
|
This bit when set indicates that the received frame has an odd number of bytes |
SMC91X_RCV_TOOLONG = $0800;
|
Frame length was longer than 802.3 maximum size (1518 bytes on the cable) |
SMC91X_RCV_TOOSHORT = $0400;
|
Frame length was shorter than 802.3 minimum size (64 bytes on the cable) |
SMC91X_RCV_MULTICAST = $0001;
|
Receive frame was Multicast |
SMC91X_RCV_ERRORS = (SMC91X_RCV_ALGNERR or SMC91X_RCV_BADCRC or SMC91X_RCV_TOOLONG or SMC91X_RCV_TOOSHORT);
|
SMC91X_BANK_SELECT_*
SMC91X_BANK_SELECT_0 = 0;
|
|
SMC91X_BANK_SELECT_1 = 1;
|
|
SMC91X_BANK_SELECT_2 = 2;
|
|
SMC91X_BANK_SELECT_3 = 3;
|
SMC91X_CHIP_*
Bits 4-7 of the Revision register | |
SMC91X_CHIP_COUNT = 16;
|
|
SMC91X_CHIP_9192 = 3;
|
|
SMC91X_CHIP_9194 = 4;
|
|
SMC91X_CHIP_9195 = 5;
|
|
SMC91X_CHIP_9196 = 6;
|
|
SMC91X_CHIP_91100 = 7;
|
|
SMC91X_CHIP_91100FD = 8;
|
|
SMC91X_CHIP_91111FD = 9;
|
SMC91X_PHY_*
SMC91X_PHY_LAN83C183 = $0016f840;
|
LAN83C183 = LAN91C111 Internal PHY |
SMC91X_PHY_LAN83C180 = $02821c50;
|
|
SMC91X PHY Register Addresses (LAN91C111 Internal PHY) | |
Register 0. Control Register | |
See: Network Generic MII registers (MII_BMCR) | |
Register 1. Status Register | |
See: Network Generic MII registers (MII_BMSR) | |
Register 2 & 3. PHY Identifier Register | |
See: Network Generic MII registers (MII_PHYSID1 / MII_PHYSID2) | |
Register 4. Auto-Negotiation Advertisement Register | |
See: Network Generic MII registers (MII_ADVERTISE) | |
Register 5. Auto-Negotiation Remote End Capability Register | |
See: Network Generic MII registers (MII_LPA) | |
Register 16. Configuration 1- Structure and Bit Definition | |
SMC91X_PHY_CFG1_REG = $10;
|
|
SMC91X_PHY_CFG1_LNKDIS = $8000;
|
1=Rx Link Detect Function disabled |
SMC91X_PHY_CFG1_XMTDIS = $4000;
|
1=TP Transmitter Disabled |
SMC91X_PHY_CFG1_XMTPDN = $2000;
|
1=TP Transmitter Powered Down |
SMC91X_PHY_CFG1_BYPSCR = $0400;
|
1=Bypass scrambler/descrambler |
SMC91X_PHY_CFG1_UNSCDS = $0200;
|
1=Unscramble Idle Reception Disable |
SMC91X_PHY_CFG1_EQLZR = $0100;
|
1=Rx Equalizer Disabled |
SMC91X_PHY_CFG1_CABLE = $0080;
|
1=STP(150ohm), 0=UTP(100ohm) |
SMC91X_PHY_CFG1_RLVL0 = $0040;
|
1=Rx Squelch level reduced by 4.5db |
SMC91X_PHY_CFG1_TLVL_SHIFT = 2;
|
Transmit Output Level Adjust |
SMC91X_PHY_CFG1_TLVL_MASK = $003C;
|
|
SMC91X_PHY_CFG1_TRF_MASK = $0003;
|
Transmitter Rise/Fall time |
Register 17. Configuration 2 - Structure and Bit Definition | |
SMC91X_PHY_CFG2_REG = $11;
|
|
SMC91X_PHY_CFG2_APOLDIS = $0020;
|
1=Auto Polarity Correction disabled |
SMC91X_PHY_CFG2_JABDIS = $0010;
|
1=Jabber disabled |
SMC91X_PHY_CFG2_MREG = $0008;
|
1=Multiple register access (MII mgt) |
SMC91X_PHY_CFG2_INTMDIO = $0004;
|
1=Interrupt signaled with MDIO pulseo |
Register 18. Status Output - Structure and Bit Definition | |
SMC91X_PHY_INT_REG = $12;
|
Status Output (Interrupt Status) |
SMC91X_PHY_INT_INT = $8000;
|
1=bits have changed since last read |
SMC91X_PHY_INT_LNKFAIL = $4000;
|
1=Link Not detected |
SMC91X_PHY_INT_LOSSSYNC = $2000;
|
1=Descrambler has lost sync |
SMC91X_PHY_INT_CWRD = $1000;
|
1=Invalid 4B5B code detected on rx |
SMC91X_PHY_INT_SSD = $0800;
|
1=No Start Of Stream detected on rx |
SMC91X_PHY_INT_ESD = $0400;
|
1=No End Of Stream detected on rx |
SMC91X_PHY_INT_RPOL = $0200;
|
1=Reverse Polarity detected |
SMC91X_PHY_INT_JAB = $0100;
|
1=Jabber detected |
SMC91X_PHY_INT_SPDDET = $0080;
|
1=100Base-TX mode, 0=10Base-T mode |
SMC91X_PHY_INT_DPLXDET = $0040;
|
1=Device in Full Duplex |
Register 19. Mask - Structure and Bit Definition | |
SMC91X_PHY_MASK_REG = $13;
|
Interrupt Mask (Uses the same bit definitions as PHY_INT_REG) |
Register 20. Reserved - Structure and Bit Definition | |
Nothing |
Type definitions
SMC91X bank 0 registers
TSMC91XBank0Registers = packed record
Note: Layout of the SMC91X registers | |
TCR:Word;
|
Transmit Control Register |
EPH_STATUS:Word;
|
EPH Status Register |
RCR:Word;
|
Receive Control Register |
COUNTER:Word;
|
Counter Register |
MIR:Word;
|
Memory Information Register |
RPCR:Word;
|
Receive/Phy Control Register |
RESERVED:Word;
|
Reserved |
BANK:Word;
|
Bank Select Register |
SMC91X bank 1 registers
TSMC91XBank1Registers = packed record
CONFIG:Word;
|
Configuration Register |
BASE:Word;
|
Base Address Register |
ADDR0:Word;
|
Individual Address Registers (0 and 1) |
ADDR1:Word;
|
Individual Address Registers (2 and 3) |
ADDR2:Word;
|
Individual Address Registers (4 and 5) |
GP:Word;
|
General Purpose Register |
CTL:Word;
|
Control Register |
BANK:Word;
|
Bank Select Register |
SMC91X FIFO registers
TSMC91XFIFORegisters = packed record
case Integer of
|
|
0:(FIFO:Word);
|
|
1:(TX:Byte;
|
|
RX:Byte);
|
SMC91X DATA registers
TSMC91XDATARegisters = packed record
case Integer of
|
|
0:(DATA:LongWord);
|
|
1:(DATAH:Word;
|
|
DATAL:Word);
|
|
2:(DATA0:Byte;
|
|
DATA1:Byte;
|
|
DATA2:Byte;
|
|
DATA3:Byte);
|
SMC91X bank 2 registers
TSMC91XBank2Registers = packed record
MMU_CMD:Word;
|
MMU Command Register |
PN:Byte;
|
Packet Number Register |
AR:Byte;
|
Allocation Result Register |
FIFO:TSMC91XFIFORegisters;
|
FIFO Ports Register |
PTR:Word;
|
Pointer Register |
DATA:TSMC91XDATARegisters;
|
Data Register |
INT:Byte;
|
Interrupt Status Register |
IM:Byte;
|
Interrupt Mask Register |
BANK:Word;
|
Bank Select Register |
SMC91X bank 3 registers
TSMC91XBank3Registers = packed record
MCAST1:Word;
|
Multicast Table Registers (0 and 1) |
MCAST2:Word;
|
Multicast Table Registers (2 and 3) |
MCAST3:Word;
|
Multicast Table Registers (4 and 5) |
MCAST4:Word;
|
Multicast Table Registers (6 and 7) |
MII:Word;
|
Management Interface Register |
REV:Word;
|
Revision Register |
RCV:Word;
|
RCV Register |
Bank:Word;
|
Bank Select Register |
SMC91X registers
PSMC91XRegisters = ^TSMC91XRegisters;
TSMC91XRegisters = packed record
case Integer of
|
|
0:(Bank0:TSMC91XBank0Registers);
|
Bank 0 Registers |
1:(Bank1:TSMC91XBank1Registers);
|
Bank 1 Registers |
2:(Bank2:TSMC91XBank2Registers);
|
Bank 2 Registers |
3:(Bank3:TSMC91XBank3Registers);
|
Bank 3 Registers |
SMC91X network
PSMC91XNetwork = ^TSMC91XNetwork;
TSMC91XNetwork = record
Network Properties | |
Network:TNetworkDevice;
|
|
SMC91X Properties | |
IRQ:LongWord;
|
|
Lock:TSpinHandle;
|
Device lock (Differs from lock in Network device) (Spin lock due to use by interrupt handler) |
Thread:TThreadHandle;
|
Thread for handling packet receive and transmit completion |
Start:LongWord;
|
First receive entry available for incoming packet |
Count:LongWord;
|
Number of receive entries available for incoming packets |
Entries:array[0..(SMC91X_MAX_RX_ENTRIES - 1)] of PNetworkEntry;
|
Queue of receive entries for handling incoming packets |
Registers:PSMC91XRegisters;
|
Device registers |
Revision:Word;
|
Device revision |
PHYId:LongWord;
|
Physical Interface (PHY) Address |
PHYType:LongWord;
|
Physical Interface (PHY) Type |
TCRFlags:LongWord;
|
Current Transmit Control Register (TCR) flags |
RCRFlags:LongWord;
|
Current Receive Control Register (RCR) flags |
RPCFlags:LongWord;
|
Current Receive/PHY Control Register (RPC) flags |
Statistics Properties | |
InterruptCount:LongWord;
|
Number of interrupt requests received by the device |
CollisionCount:LongWord;
|
Number of transmit collisions detected by the device |
Public variables
SMC91X specific variables
SMC91X_ALLOCATE_WAIT_COUNT:LongWord = 16;
|
How long to wait for the SMC91X to allocate memory before deferring a packet |
SMC91X_MAX_IRQ_COUNT:LongWord = 8;
|
How many iterations of the interrupt handler are allowed on each interrupt |
SMC91X_THROTTLE_TRANSMIT:Boolean = False;
|
Determines if TX packets are sent one at a time or queued into SMC91X internal memory |
Function declarations
SMC91X functions
function SMC91XNetworkCreate(Address:PtrUInt; const Name:String; IRQ:LongWord):PNetworkDevice;
Address | The address of the SMC91X registers |
---|---|
Name | The text description of this device which will show in the device list (Optional) |
IRQ | The interrupt number for the SMC91X |
Return | Pointer to the new Network device or nil if the Network device could not be created |
function SMC91XNetworkDestroy(Network:PNetworkDevice):LongWord;
Network | The Network device to destroy |
---|---|
Return | ERROR_SUCCESS if completed or another error code on failure |
SMC91X network functions
function SMC91XNetworkOpen(Network:PNetworkDevice):LongWord;
Note | Not intended to be called directly by applications, use NetworkDeviceOpen instead. |
---|
function SMC91XNetworkClose(Network:PNetworkDevice):LongWord;
Note | Not intended to be called directly by applications, use NetworkDeviceClose instead. |
---|
function SMC91XNetworkControl(Network:PNetworkDevice; Request:Integer; Argument1:PtrUInt; var Argument2:PtrUInt):LongWord;
Note | Not intended to be called directly by applications, use NetworkDeviceControl instead. |
---|
function SMC91XBufferAllocate(Network:PNetworkDevice; var Entry:PNetworkEntry):LongWord;
Note | Not intended to be called directly by applications, use NetworkBufferAllocate instead. |
---|
function SMC91XBufferRelease(Network:PNetworkDevice; Entry:PNetworkEntry):LongWord;
Note | Not intended to be called directly by applications, use NetworkBufferRelease instead. |
---|
function SMC91XBufferReceive(Network:PNetworkDevice; var Entry:PNetworkEntry):LongWord;
Note | Not intended to be called directly by applications, use NetworkBufferReceive instead. |
---|
function SMC91XBufferTransmit(Network:PNetworkDevice; Entry:PNetworkEntry):LongWord;
Note | Not intended to be called directly by applications, use NetworkBufferTransmit instead. |
---|
procedure SMC91XInterruptHandler(Network:PSMC91XNetwork);
Note | Not intended to be called directly by applications |
---|
procedure SMC91XInterruptReceive(Network:PSMC91XNetwork);
Note | Not intended to be called directly by applications |
---|
procedure SMC91XInterruptTransmit(Network:PSMC91XNetwork);
Note | Not intended to be called directly by applications |
---|
function SMC91XCompletionExecute(Network:PSMC91XNetwork):PtrInt;
Note | Not intended to be called directly by applications |
---|
procedure SMC91XTransmitStart(Network:PSMC91XNetwork);
Note | Not intended to be called directly by applications
Caller must hold the network lock. |
---|
procedure SMC91XTransmitPacket(Network:PSMC91XNetwork; Entry:PNetworkEntry; Packet:PNetworkPacket);
Note | Not intended to be called directly by applications
Caller must hold the network lock |
---|
SMC91X helper functions
function SMC91XCurrentBank(Network:PSMC91XNetwork):Word; inline;
Network | The SMC91X Network device to get the bank from |
---|---|
Return | The currently selected bank (The high byte must be $33 to be valid) |
Note | Caller must hold the network lock |
procedure SMC91XSelectBank(Network:PSMC91XNetwork; Bank:Byte); inline;
Network | The SMC91X Network device to set the bank for |
---|---|
Bank | The bank to select |
Note | Caller must hold the network lock |
function SMC91XGetBase(Network:PSMC91XNetwork):Word; inline;
Network | The SMC91X Network device to get from |
---|---|
Return | The base addres register value |
Note | Caller must hold the network lock |
function SMC91XGetRevision(Network:PSMC91XNetwork):Word; inline;
Network | The SMC91X Network device to get from |
---|---|
Return | The revision register value |
Note | Caller must hold the network lock |
procedure SMC91XWaitMMUBusy(Network:PSMC91XNetwork); inline;
Network | The SMC91X Network device to wait for |
---|---|
Note | Caller must hold the network lock |
procedure SMC91XSetMMUCommand(Network:PSMC91XNetwork; Command:Word); inline;
Network | The SMC91X Network device to set for |
---|---|
Command | The command to set |
Note | Caller must hold the network lock |
procedure SMC91XSetInterruptMask(Network:PSMC91XNetwork; Mask:Byte); inline;
Note | None documented |
---|
procedure SMC91XEnableInterrupt(Network:PSMC91XNetwork; Interrupt:Byte);
Network | The SMC91X Network device to enable the interrupt for |
---|---|
Interrupt | The interrupt to enable |
Note | Caller must hold the network lock |
procedure SMC91XDisableInterrupt(Network:PSMC91XNetwork; Interrupt:Byte);
Network | The SMC91X Network device to disable the interrupt for |
---|---|
Interrupt | The interrupt to disable |
Note | Caller must hold the network lock |
function SMC91XReset(Network:PSMC91XNetwork):LongWord;
Network | The SMC91X Network device to reset |
---|---|
Return | ERROR_SUCCESS if completed or another error code on failure |
Note | Caller must hold the network lock |
function SMC91XEnable(Network:PSMC91XNetwork):LongWord;
Network | The SMC91X Network device to enable |
---|---|
Return | ERROR_SUCCESS if completed or another error code on failure |
Note | Caller must hold the network lock |
function SMC91XShutdown(Network:PSMC91XNetwork):LongWord;
Network | The SMC91X Network device to shutdown |
---|---|
Return | ERROR_SUCCESS if completed or another error code on failure |
Note | Caller must hold the network lock |
function SMC91XGetMACAddress(Network:PSMC91XNetwork; Address:PHardwareAddress):LongWord;
Address | Pointer to a buffer to return the hardware address |
---|---|
Network | The SMC91X Network device to get from |
Return | ERROR_SUCCESS if completed or another error code on failure |
Note | Caller must hold the network lock |
function SMC91XSetMACAddress(Network:PSMC91XNetwork; Address:PHardwareAddress):LongWord;
Address | Pointer to the hardware address to set |
---|---|
Network | The SMC91X Network device to set for |
Return | ERROR_SUCCESS if completed or another error code on failure |
Note | Caller must hold the network lock |
function SMC91XMIIIn(Network:PSMC91XNetwork; Bits:LongWord):LongWord;
Note | Caller must hold the network lock |
---|
procedure SMC91XMIIOut(Network:PSMC91XNetwork; Value,Bits:LongWord);
Note | Caller must hold the network lock |
---|
function SMC91XPHYRead(Network:PSMC91XNetwork; Addr,Reg:LongWord):LongWord;
Note | Caller must hold the network lock |
---|
procedure SMC91XPHYWrite(Network:PSMC91XNetwork; Addr,Reg,Data:LongWord);
Note | Caller must hold the network lock |
---|
function SMC91XPHYDetect(Network:PSMC91XNetwork):LongWord;
Note | Caller must hold the network lock |
---|
function SMC91XPHYReset(Network:PSMC91XNetwork):LongWord;
Note | Caller must hold the network lock |
---|
function SMC91XPHYFixed(Network:PSMC91XNetwork):LongWord;
Note | Caller must hold the network lock |
---|
function SMC91XPHYConfigure(Network:PSMC91XNetwork):LongWord;
Note | Caller must hold the network lock |
---|
function SMC91XPHYPowerdown(Network:PSMC91XNetwork):LongWord;
Note | Caller must hold the network lock |
---|
function SMC91XPHYCheckMedia(Network:PSMC91XNetwork):LongWord;
Note | Caller must hold the network lock |
---|
Return to Unit Reference