The contents of the pause packets are determined using the per-port C{0..5}_CONFIGURATION_TX_FLOW_CONTROL_* registers, which contain the following fields:
- Global pause packets (N = 0..5):
- cN_ctl_tx_da_gpp[47:0]
- cN_ctl_tx_sa_gpp[47:0]
- cN_ctl_tx_ethertype_gpp[15:0]
- cN_ctl_tx_opcode_gpp[15:0]
- cN_ctl_tx_pause_quanta8[15:0]
- Priority pause packets (N = 0..5)
- cN_ctl_tx_da_ppp[47:0]
- cN_ctl_tx_sa_ppp[47:0]
- cN_ctl_tx_ethertype_ppp[15:0]
- cN_ctl_tx_opcode_ppp[15:0]
- cN_ctl_tx_pause_quanta0[15:0]
- cN_ctl_tx_pause_quanta1[15:0]
- cN_ctl_tx_pause_quanta2[15:0]
- cN_ctl_tx_pause_quanta3[15:0]
- cN_ctl_tx_pause_quanta4[15:0]
- cN_ctl_tx_pause_quanta5[15:0]
- cN_ctl_tx_pause_quanta6[15:0]
- cN_ctl_tx_pause_quanta7[15:0]
The DCMAC Subsystem automatically calculates and adds the FCS to the packet. For priority pause packets, the DCMAC Subsystem also automatically generates the enable vector based on the priorities that are requested.
To request a pause packet, you must set the desired bits of the c{0..5}_ctl_tx_pause_enable[8:0] bus to 1 at configuration
time and then, at the desired point of transmission, set corresponding bits of tx_pause_req_{0..5}[8:0] bus to 1 and keep them at 1 for
the duration of the pause request (that is, if these inputs are set to 0, all pending
pause packets are canceled).
c{0..5}_ctl_tx_pause_refresh_timer[8:0] field (in the
C{0..5}_CONFIGURATION_TX_FLOW_CONTROL_TIMER register). When a timer times out, another packet for that priority (or global) is
transmitted as soon as the current packet in flight is completed. Additionally, you can
manually force a retransmission by setting the tx_resend_pause_{0..5} input to 1 for one clock cycle.
Multiple concurrent pause frame transmission events are merged into
single transmitted pause frames. 'Concurrent' in this sense means events that either
happen on the same cycle (for example, multiple priority requests asserted (or
deasserted) at once) or that happen while waiting for the next pause frame insertion
opportunity (end of packet currently in flight). Furthermore, new pause frame events
(new tx_pause_req assertions) override and reset the
refresh countdown timer.
For example, if the refresh timer is counting down with two active priorities and you send a request for a third priority, the two-priority refresh is forced to be timed out and a pause packet for all three priorities is sent as soon as the current in-flight packet (if any) is transmitted.
You can stop pause packet generation by setting the appropriate bits of tx_pause_req_{0..5}[8:0] to 0. When a bit of tx_pause_req_{0..5}[8:0] transitions from 1 to 0, a
corresponding pause frame transmission event is triggered that results in sending a
quanta of zero for the priority (or global) being deactivated.