IXP1200 Network Processor Family ATM OC-3/12/Ethernet IP Router Example Design
22 Application Note
Modified on: 3/20/02,
3.2 ATM Transmit Microengine
The ATM Transmit microengine is an AAL5 Unspecified Bit Rate (UBR) Transmitter that uses a
single microengine to move cells at wire-rate in either single OC-12 or up to four OC-3 port
configurations. No attempt is made to mix, schedule, or otherwise shape the order of the cells on
the wire.
The transmitter consumes PDUs one at a time from beginning to end, resulting in an output stream
in which cells from the same PDU are transmitted "back-to-back" from first through the last cell of
the PDU.
The transmitter is implemented with 3 identical fill threads. Unlike the Ethernet transmitter, the
ATM transmitter does not have a thread dedicated to scheduling the work of the fill threads. Rather,
the fill threads use shared absolute registers to act as a "distributed scheduler". The fourth thread
could also be enabled as a fill thread, but is not needed at the wire rates in this design.
In IXP1240/1250 hardware CRC configurations, the ATM Transmitter generates CRC-32 upon
transferring cells from DRAM to the TFIFO. In the IXP1200 software CRC configurations, CRC-
32 is computed by a dedicated CRC-32 generation microengine.

3.2.1 High Level Algorithm

Figure 13. ATM Transmit High Level Algorithm
while(1)
critsect_enter(@poll_for_new_work_mutex)
if (engine not active sending a PDU)
dequeue a PDU
if (Rosetta not ready to transmit)
goto skip#
critsect_exit(@poll_for_new_work_mutex)
get transmit (cell) assignment from active PDU
sequence_enter(SEQ_TFIFO) - remember TIFO element allocation order
_atm_tfifo_element() to claim the next TIFO element
write payload from DRAM to TFIFO
_build_atm_tx_assignment() set-up TFIFO control word
_my_tfifo_status_write() write control to TFIFO
atm_tx_tfifo_write_cell_header_and_data0() – ATM header into TFIFO
sequence_wait(SEQ_TFIFO) - wait for my element to be next
tfifo_ptr_wait() - don't validate too far ahead of xmit_ptr
tfifo_validate_write()
sequence_exit(SEQ_TFIFO)
continue
skip#: // skip a TIFO element
critsect_exit(@poll_for_new_work_mutex)
sequence_enter(SEQ_TFIFO) - remember TIFO element allocation order
_atm_tfifo_element() - to claim the next TIFO element
_my_tfifo_skipstatus_write() - write control to TFIFO
sequence_wait(SEQ_TFIFO) - wait for my element to be next
tfifo_ptr_wait() - don't validate too far ahead of xmit_ptr
tfifo_validate_write()
sequence_exit(SEQ_TFIFO)