256 Hardware Reference Manual
Intel® IXP2800 Network Processor
Media and Switch Fabric Interface
8.2.5 Rx_Thread_Freelist_Timeout_#
Each Rx_Thread_Freelist_# has an associated countdown timer. If the timer expires and no new
receive data is available yet, the receive logic will autopush a Null Receive Status Word to the next
thread on the Rx_Thread_Freelist_#. A Null Receive Status Word has the “Null” bit set, and does
not have any data or RBUF entry associated with it.
The Rx_Thread_Freelist_# timer is useful for certain applications. Its primary purpose is to keep
the receive processing pipeline (implemented as microcode running on the Microengine) moving
even when the line has gone idle. It is especially useful if the pipeline is structured to handle
mpackets in groups, i.e., eight mpackets at a time.
If seven mpackets are received, the line goes idle, and the timeout triggers the autopush of a null
Receive Status Word, filling the eighth slot and allowing the pipeline to advance. Another example
is if one valid mpacket is received before the line goes idle for a long period; seven null Receive
Status Words will be autopushed, allowing the pipeline to proceed.
Typically, the timeout interval is programmed to be slightly larger than the minimum arrival time
of the incoming cells or packets. The timer is controlled by using the
Rx_Thread_Freelist_Timeout_# CSR. The timer may be enabled or disabled, and the timeout
value specified using this CSR.
The following rules define the operation of the Rx_Thread_Freelist timer.
1. Writing a non-zero value to the Rx_Thread_Freelist_Timeout_# CSR both resets the timer
and enables it. Writing a zero value to this CSR resets the timer and disables it.
2. If the timer is disabled, then only valid (non-null) Receive Status Words are autopushed to the
receive threads; null Receive Status Words are never pushed.
3. If the timer expires and the Rx_Thread_Freelist_# is non-empty, but there is no mpacket
available, this will trigger the autopush of a null Receive Status Word.
4. If the timer expires and the Rx_Thread_Freelist_# is empty, the timer stays in the EXPIRED
state and is not restarted. A null Receive Status Word cannot be autopushed, since the logic has
no destination to push anything to.
5. An expired timer is reset and restarted if and only if an autopush, null or non-null, is
performed.
6. Whenever there is a choice, the autopush of a non-null Receive Status Word takes precedence
over a null Receive Status Word.
8.2.6 Receive Operation Summary
During receive processing, received CFrames, cells, and packets (which in this context are all
called mpackets) are placed into the RBUF, and then, when marked valid, are immediately handed
off to a Microengine for processing. Normally, by application design, some number of
Microengine Contexts will be assigned to receive processing. Those Contexts will have their
number added to the proper Rx_Thread_Freelist_# (via msf[write]or msf[fast_write]),
and then will go to sleep to wait for arrival of an mpacket (or alternatively poll waiting for arrival
of an mpacket).