diff options
| author | Andrew Moch <Andrew.Moch@ni.com> | 2020-10-02 23:41:59 +0100 | 
|---|---|---|
| committer | Wade Fife <wade.fife@ettus.com> | 2020-10-05 16:03:21 -0500 | 
| commit | 1938bb951a981f4d3016b796f771b5047fb846a2 (patch) | |
| tree | 753c96541bc861e47ec675b52c1f187cbf58d8cc /fpga | |
| parent | 8fea36aa81195d758a29067141afdc4becefe5ae (diff) | |
| download | uhd-1938bb951a981f4d3016b796f771b5047fb846a2.tar.gz uhd-1938bb951a981f4d3016b796f771b5047fb846a2.tar.bz2 uhd-1938bb951a981f4d3016b796f771b5047fb846a2.zip | |
fpga: lib: Fix small packets stuck in 10 GbE TX
Any packet less than CUT_THROUGH bytes has a high chance of getting
stuck in the TX FIFO of the xge_mac_wrapper. In cut-through mode we
were waiting for CUT_THROUGH bytes before transmitting the packet.
Diffstat (limited to 'fpga')
| -rw-r--r-- | fpga/usrp3/lib/xge_interface/xge_mac_wrapper.v | 20 | 
1 files changed, 17 insertions, 3 deletions
| diff --git a/fpga/usrp3/lib/xge_interface/xge_mac_wrapper.v b/fpga/usrp3/lib/xge_interface/xge_mac_wrapper.v index 143808f6d..b5c6943ed 100644 --- a/fpga/usrp3/lib/xge_interface/xge_mac_wrapper.v +++ b/fpga/usrp3/lib/xge_interface/xge_mac_wrapper.v @@ -434,20 +434,27 @@ module xge_mac_wrapper #(    //    reg cut_through;    reg cut_wait; +  reg [15:0] cut_idlecount;    if (CUT_THROUGH > 0) begin : yes_cut_through      wire cut_start;      wire cut_end; -    assign cut_start = tx_occupied > CUT_THROUGH; +    // start under 2 conditions +    //    (1) we have more the CUT_THROUGH bytes buffered +    assign cut_start = tx_occupied > CUT_THROUGH ||  +    //    (2) we have kept bytes waiting for too long +    //   The second case happens when less than CUT_THROUGH bytes are pushed +                       (cut_idlecount == 0);      assign cut_end   = eth_tx_eof && eth_tx_valid;      // Add SOF      always @(posedge xgmii_clk) begin : cut_through_dff        if (xgmii_reset) begin -        cut_through <= 1'b0; -        cut_wait    <= 1'b0; +        cut_through   <= 1'b0; +        cut_wait      <= 1'b0; +        cut_idlecount <= CUT_THROUGH+2;        end else begin          cut_wait    <= eth_tx_full;          if (cut_start) begin @@ -455,6 +462,13 @@ module xge_mac_wrapper #(          end else if (cut_end) begin            cut_through <= 1'b0;          end +        if (tx_occupied > 0 && cut_through == 1'b0) begin +          if (cut_idlecount > 0) begin +            cut_idlecount <= cut_idlecount-1; +          end +        end else begin +          cut_idlecount <= CUT_THROUGH+2; +        end        end      end    end else begin : no_cut_through | 
