A simple handshaking protocol is used to indicate the reception of pause packets and corresponding timer operation using the rx_pause_req[8:0] and rx_pause_ack[8:0] buses. For these buses, Bit[8] corresponds to global pause packets and Bits[7:0] correspond to priority pause packets. Both the _req and _ack buses have a corresponding _id (rx_pause_req_id[2:0], rx_pause_ack_id[2:0]) bus to indicate the port associated with the handshake.The following steps occur when a pause packet is received:
- If the corresponding bit of ctl_rx_pause_enable[8:0] is 0, the quanta is ignored and the DCMAC Subsystem’s RX pause timer logic stays in step 1. Otherwise, the corresponding bit of the rx_pause_req[8:0] bus is set to 1, and the received quanta is loaded into a timer.If one of the bits of ctl_rx_pause_enable[8:0] is set to 0 (disabled) when the pause processing is in step 2 or later, the core completes the steps as normal until it comes back to step 1. Deasserting a bit of ctl_rx_pause_enable does not immediately cause the associated timer to expire.
- If c{0..5}_ctl_rx_check_ack (a register control field) is 1, the DCMAC Subsystem waits for a rising edge on the appropriate bit of the rx_pause_ack[8:0] bus.If ctl_rx_check_ack is 0, the logic proceeds immediately to step 4.
- A rising edge on the correlated bit of rx_pause_ack[8:0] is received.
- The DCMAC Subsystem counts down the timer.
- When the timer expires, the DCMAC Subsystem sets the appropriate bit of rx_pause_req[8:0] back to 0, then returns to waiting for a pause packet to arrive.
If at any time during step 2 to step 5 a new pause packet is received, the timer is updated with the newly acquired quanta value and the process continues. The basic handshake process is shown below.
In cycle 3, pause frame receipt is indicated for port 0 with the assertion of
rx_pause_req
. (Although rx_pause_req
and rx_pause_ack
are 9-bit
buses, they are shown here as single bit for clarity.) Connected user logic responds
with an assertion of rx_pause_ack
alongside rx_pause_ack_id
of 0. That event is shown quickly in
response to the request, but a normal system response would see those two events
separated by whatever time is required for the system to halt transmission of data into
the DCMAC Subsystem’s TX path. Once the positive edge of rx_pause_ack
is seen for port 0, the internal system timer for the
received priority (or global) quanta begins counting down. When the indicated quanta
time (from the received frame) has elapsed, rx_pause_req
is de-asserted. The acknowledge in this case is de-asserted
after the request is deasserted, but that need not be the case.