1330887Snp/*-
2330887Snp * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3330887Snp *
4330887Snp * Copyright (c) 2018 Chelsio Communications, Inc.
5330887Snp * All rights reserved.
6330887Snp *
7330887Snp * Redistribution and use in source and binary forms, with or without
8330887Snp * modification, are permitted provided that the following conditions
9330887Snp * are met:
10330887Snp * 1. Redistributions of source code must retain the above copyright
11330887Snp *    notice, this list of conditions and the following disclaimer.
12330887Snp * 2. Redistributions in binary form must reproduce the above copyright
13330887Snp *    notice, this list of conditions and the following disclaimer in the
14330887Snp *    documentation and/or other materials provided with the distribution.
15330887Snp *
16330887Snp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17330887Snp * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18330887Snp * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19330887Snp * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20330887Snp * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21330887Snp * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22330887Snp * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23330887Snp * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24330887Snp * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25330887Snp * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26330887Snp * SUCH DAMAGE.
27330887Snp */
28330887Snp
29330887Snp#include <sys/cdefs.h>
30330887Snp__FBSDID("$FreeBSD: stable/11/usr.sbin/cxgbetool/tcbshowt5.c 339393 2018-10-16 22:09:33Z np $");
31330887Snp
32330887Snp/* Auto-generated file.  Avoid direct editing.     */
33330887Snp/* Edits will be lost when file regenerated.       */
34330887Snp#include <stdio.h>
35330887Snp#include "tcb_common.h"
36330887Snp
37330887Snpvoid t5_display_tcb_aux_0 (_TCBVAR *tvp, int aux)
38330887Snp{
39330887Snp
40330887Snp
41330887Snp
42330887Snp
43330887Snp
44330887Snp
45330887Snp
46330887Snp  PR("STATE:\n");
47330887Snp  PR("  %-12s (%-2u), %s, lock_tid %u, rss_fw %u\n",
48330887Snp	      spr_tcp_state(val("t_state")),
49330887Snp	      val("t_state"),
50330887Snp	      spr_ip_version(val("ip_version")),
51330887Snp	      val("lock_tid"),
52330887Snp	      val("rss_fw")
53330887Snp	     );
54330887Snp  PR("  l2t_ix 0x%x, smac sel 0x%x, tos 0x%x\n",
55330887Snp	      val("l2t_ix"),
56330887Snp	      val("smac_sel"),
57330887Snp	      val("tos")
58330887Snp	      );
59330887Snp  PR("  maxseg %u, recv_scaleflag %u, recv_tstmp %u, recv_sack %u\n",
60330887Snp	      val("t_maxseg"),   val("recv_scale"),
61330887Snp	      val("recv_tstmp"), val("recv_sack"));
62330887Snp
63330887Snp
64330887Snp  PR("TIMERS:\n"); /* **************************************** */
65330887Snp  PR("  timer    %u,  dack_timer      %u\n",
66330887Snp	   val("timer"), val("dack_timer"));
67330887Snp  PR("  mod_schd: tx: %u, rx: %u, reason 0x%1x\n",
68330887Snp	      val("mod_schd_tx"),
69330887Snp	      val("mod_schd_rx"),
70330887Snp	      ((val("mod_schd_reason2")<<2) | (val("mod_schd_reason1")<<1) |
71330887Snp	       val("mod_schd_reason0"))
72330887Snp	      );
73330887Snp
74330887Snp
75330887Snp  PR("  max_rt   %-2u, rxtshift        %u, keepalive   %u\n",
76330887Snp	   val("max_rt"),  val("t_rxtshift"),
77330887Snp	   val("keepalive"));
78330887Snp  PR("  timestamp_offset 0x%x,  timestamp 0x%x\n",
79330887Snp	   val("timestamp_offset"),val("timestamp"));
80330887Snp
81330887Snp
82330887Snp  PR("  t_rtt_ts_recent_age %u  t_rttseq_recent %u\n",
83330887Snp	   val("t_rtt_ts_recent_age"), val("t_rtseq_recent"));
84330887Snp  PR("  t_srtt %u, t_rttvar %u\n",
85330887Snp	   val("t_srtt"),val("t_rttvar"));
86330887Snp
87330887Snp
88330887Snp
89330887Snp
90330887Snp
91330887Snp
92330887Snp  PR("TRANSMIT BUFFER:\n");   /* *************************** */
93330887Snp  PR("  snd_una %u, snd_nxt %u, snd_max %u, tx_max %u\n",
94330887Snp	      val("snd_una"),val("snd_nxt"),
95330887Snp	      val("snd_max"),val("tx_max"));
96330887Snp  PR("  core_fin %u, tx_hdr_offset %u\n",
97330887Snp	      val("core_fin"), SEQ_SUB(val("tx_max"),val("snd_una"))
98330887Snp	     );
99330887Snp  if (val("recv_scale") && !val("active_open")) {
100330887Snp    PR("  rcv_adv    %-5u << %-2u == %u (recv_scaleflag %u rcv_scale %u active open %u)\n",
101330887Snp		val("rcv_adv"), val("rcv_scale"),
102330887Snp		val("rcv_adv") << val("rcv_scale"),
103330887Snp		val("recv_scale"), val("rcv_scale"), val("active_open"));
104330887Snp  } else {
105330887Snp    PR("  rcv_adv    %-5u (rcv_scale %-2u recv_scaleflag %u active_open %u)\n",
106330887Snp		val("rcv_adv"), val("rcv_scale"),
107330887Snp		val("recv_scale"), val("active_open"));
108330887Snp  }
109330887Snp
110330887Snp  PR("  snd_cwnd   %-5u  snd_ssthresh %u  snd_rec %u\n",
111330887Snp	      val("snd_cwnd")    , val("snd_ssthresh"), val("snd_rec")
112330887Snp	     );
113330887Snp
114330887Snp
115330887Snp
116330887Snp
117330887Snp  PR("  cctrl: sel %s, ecn %u, ece %u, cwr %u, rfr %u\n",
118330887Snp	      spr_cctrl_sel(val("cctrl_sel0"),val("cctrl_sel1")),
119330887Snp	      val("cctrl_ecn"), val("cctrl_ece"), val("cctrl_cwr"),
120330887Snp	      val("cctrl_rfr"));
121330887Snp  PR("  t_dupacks %u, dupack_count_odd %u, fast_recovery %u\n",
122330887Snp	      val("t_dupacks"), val("dupack_count_odd"),val("fast_recovery"));
123330887Snp  PR("  core_more    %u, core_urg,       %u  core_push   %u,",
124330887Snp	      val("core_more"),val("core_urg"),val("core_push"));
125330887Snp  PR("  core_flush %u\n",val("core_flush"));
126330887Snp  PR("  nagle        %u, ssws_disable    %u, turbo       %u,",
127330887Snp	      val("nagle"), val("ssws_disabled"), val("turbo"));
128330887Snp  PR("  tx_pdu_out %u\n",val("tx_pdu_out"));
129330887Snp  PR("  tx_pace_auto %u, tx_pace_fixed   %u, tx_queue    %u",
130330887Snp	      val("tx_pace_auto"),val("tx_pace_fixed"),val("tx_queue"));
131330887Snp
132330887Snp
133330887Snp  PR("   tx_quiesce %u\n",val("tx_quiesce"));
134330887Snp  PR("  tx_channel   %u, tx_channel1     %u, tx_channel0 %u\n",
135330887Snp	      val("tx_channel"),
136330887Snp	      (val("tx_channel")>>1)&1,
137330887Snp	      val("tx_channel")&1
138330887Snp	      );
139330887Snp
140330887Snp
141330887Snp
142330887Snp
143330887Snp  PR("  tx_hdr_ptr   0x%-6x   tx_last_ptr 0x%-6x  tx_compact %u\n",
144330887Snp	      val("tx_hdr_ptr"),val("tx_last_ptr"),val("tx_compact"));
145330887Snp
146330887Snp
147330887Snp
148330887Snp
149330887Snp  PR("RECEIVE BUFFER:\n");  /* *************************** */
150330887Snp  PR("  last_ack_sent %-10u                      rx_compact %u\n",
151330887Snp	      val("ts_last_ack_sent"),val("rx_compact"));
152330887Snp  PR("  rcv_nxt       %-10u  hdr_off %-10u\n",
153330887Snp	      val("rcv_nxt"), val("rx_hdr_offset"));
154330887Snp  PR("  frag0_idx     %-10u  length  %-10u  rx_ptr  0x%-8x\n",
155330887Snp	      val("rx_frag0_start_idx"),
156330887Snp	      val("rx_frag0_len"),
157330887Snp	      val("rx_ptr"));
158330887Snp  PR("  frag1_idx     %-10u  length  %-10u  ",
159330887Snp	      val("rx_frag1_start_idx_offset"),
160330887Snp	      val("rx_frag1_len"));
161330887Snp
162330887Snp
163330887Snp
164330887Snp
165330887Snp  if (val("ulp_type")!=4) { /* RDMA has FRAG1 idx && len, but no ptr?  Should I not display frag1 at all? */
166330887Snp    PR("frag1_ptr  0x%-8x\n",val("rx_frag1_ptr"));
167330887Snp  } else {
168330887Snp    PR("\n");
169330887Snp  }
170330887Snp
171330887Snp
172330887Snp  if (val("ulp_type") !=6 && val("ulp_type") != 5 && val("ulp_type") !=4) {
173330887Snp    PR("  frag2_idx     %-10u  length  %-10u  frag2_ptr  0x%-8x\n",
174330887Snp		val("rx_frag2_start_idx_offset"),
175330887Snp		val("rx_frag2_len"),
176330887Snp		val("rx_frag2_ptr"));
177330887Snp    PR("  frag3_idx     %-10u  length  %-10u  frag3_ptr  0x%-8x\n",
178330887Snp		val("rx_frag3_start_idx_offset"),
179330887Snp		val("rx_frag3_len"),
180330887Snp		val("rx_frag3_ptr"));
181330887Snp  }
182330887Snp
183330887Snp
184330887Snp
185330887Snp
186330887Snp
187330887Snp
188330887Snp  PR("  peer_fin %u,   rx_pdu_out %u, pdu_len %u\n",
189330887Snp	      val("peer_fin"),val("rx_pdu_out"), val("pdu_len"));
190330887Snp
191330887Snp
192330887Snp
193330887Snp
194330887Snp  if (val("recv_scale")) {
195330887Snp    PR("  rcv_wnd %u >> snd_scale %u == %u, recv_scaleflag = %u\n",
196330887Snp		val("rcv_wnd"), val("snd_scale"),
197330887Snp		val("rcv_wnd") >> val("snd_scale"),
198330887Snp		val("recv_scale"));
199330887Snp  } else {
200330887Snp    PR("  rcv_wnd %u.  (snd_scale %u, recv_scaleflag = %u)\n",
201330887Snp		val("rcv_wnd"), val("snd_scale"),
202330887Snp		val("recv_scale"));
203330887Snp  }
204330887Snp
205330887Snp
206330887Snp
207330887Snp
208330887Snp PR("  dack_mss   %u dack       %u,  dack_not_acked: %u\n",
209330887Snp	      val("dack_mss"),val("dack"),val("dack_not_acked"));
210330887Snp  PR("  rcv_coal   %u rcv_co_psh %u rcv_co_last_psh  %u heart %u\n",
211330887Snp	      val("rcv_coalesce_enable"),
212330887Snp	      val("rcv_coalesce_push"),
213330887Snp	      val("rcv_coalesce_last_psh"),
214330887Snp	      val("rcv_coalesce_heartbeat"));
215330887Snp
216330887Snp  PR("  rx_channel %u rx_quiesce %u rx_flow_ctrl_dis %u,",
217330887Snp	      val("rx_channel"), val("rx_quiesce"),
218330887Snp	      val("rx_flow_control_disable"));
219330887Snp  PR("  rx_flow_ctrl_ddp %u\n",
220330887Snp	      val("rx_flow_control_ddp"));
221330887Snp
222330887Snp
223330887Snp  PR("MISCELANEOUS:\n");  /* *************************** */
224330887Snp  PR("  pend_ctl: 0x%1x, unused_flags: 0x%x,  main_slush: 0x%x\n",
225330887Snp	      ((val("pend_ctl2")<<2) | (val("pend_ctl1")<<1) |
226330887Snp	       val("pend_ctl0")),
227330887Snp	      val("unused"),val("main_slush"));
228330887Snp  PR("  Migrating %u, ask_mode %u, non_offload %u, rss_info %u\n",
229330887Snp	      val("migrating"),
230330887Snp	      val("ask_mode"), val("non_offload"), val("rss_info"));
231330887Snp  PR("  ULP: ulp_type %u (%s), ulp_raw %u",
232330887Snp	      val("ulp_type"), spr_ulp_type(val("ulp_type")),
233330887Snp	      val("ulp_raw"));
234330887Snp
235330887Snp
236330887Snp  if (aux==1) {
237330887Snp    PR(",  ulp_ext %u",val("ulp_ext"));
238330887Snp  }
239330887Snp  PR("\n");
240330887Snp
241330887Snp
242330887Snp
243330887Snp
244330887Snp  PR("  RDMA: error   %u, flm_err %u\n",
245330887Snp	      val("rdma_error"), val("rdma_flm_error"));
246330887Snp
247330887Snp
248330887Snp}
249330887Snpvoid t5_display_tcb_aux_1 (_TCBVAR *tvp, int aux)
250330887Snp{
251330887Snp
252330887Snp
253330887Snp
254330887Snp  PR("    aux1_slush0: 0x%x aux1_slush1 0x%x\n",
255330887Snp	      val("aux1_slush0"), val("aux1_slush1"));
256330887Snp  PR("    pdu_hdr_len %u\n",val("pdu_hdr_len"));
257330887Snp
258330887Snp
259330887Snp
260330887Snp}
261330887Snpvoid t5_display_tcb_aux_2 (_TCBVAR *tvp, int aux)
262330887Snp{
263330887Snp
264330887Snp
265330887Snp
266330887Snp
267330887Snp  PR("    qp_id %u, pd_id %u, stag %u\n",
268330887Snp	      val("qp_id"), val("pd_id"),val("stag"));
269330887Snp  PR("    irs_ulp %u, iss_ulp %u\n",
270330887Snp	      val("irs_ulp"),val("iss_ulp"));
271330887Snp  PR("    tx_pdu_len %u\n",
272330887Snp	      val("tx_pdu_len"));
273330887Snp  PR("    cq_idx_sq %u, cq_idx_rq %u\n",
274330887Snp	      val("cq_idx_sq"),val("cq_idx_rq"));
275330887Snp  PR("    rq_start %u, rq_MSN %u, rq_max_off %u, rq_write_ptr %u\n",
276330887Snp	      val("rq_start"),val("rq_msn"),val("rq_max_offset"),
277330887Snp	      val("rq_write_ptr"));
278330887Snp  PR("    L_valid %u, rdmap opcode %u\n",
279330887Snp	      val("ord_l_bit_vld"),val("rdmap_opcode"));
280330887Snp  PR("    tx_flush: %u, tx_oos_rxmt %u, tx_oos_txmt %u\n",
281330887Snp	      val("tx_flush"),val("tx_oos_rxmt"),val("tx_oos_txmt"));
282330887Snp
283330887Snp
284330887Snp
285330887Snp
286330887Snp}
287330887Snpvoid t5_display_tcb_aux_3 (_TCBVAR *tvp, int aux)
288330887Snp{
289330887Snp
290330887Snp
291330887Snp
292330887Snp
293330887Snp  PR("  aux3_slush: 0x%x, unused: buf0 0x%x, buf1: 0x%x, main: 0x%x\n",
294330887Snp	      val("aux3_slush"),val("ddp_buf0_unused"),val("ddp_buf1_unused"),
295330887Snp	      val("ddp_main_unused"));
296330887Snp
297330887Snp
298330887Snp
299330887Snp
300330887Snp
301330887Snp  PR("  DDP: DDPOFF  ActBuf  IndOut  WaitFrag  Rx2Tx  BufInf\n");
302330887Snp  PR("         %u       %u       %u        %u        %u      %u\n",
303330887Snp	      val("ddp_off"),val("ddp_active_buf"),val("ddp_indicate_out"),
304330887Snp	      val("ddp_wait_frag"),val("ddp_rx2tx"),val("ddp_buf_inf")
305330887Snp	     );
306330887Snp
307330887Snp
308330887Snp
309330887Snp
310330887Snp
311330887Snp  PR("        Ind  PshfEn PushDis Flush NoInvalidate\n");
312330887Snp  PR("   Buf0: %u      %u       %u    %u       %u\n",
313330887Snp	      val("ddp_buf0_indicate"),
314330887Snp	      val("ddp_pshf_enable_0"), val("ddp_push_disable_0"),
315330887Snp	      val("ddp_buf0_flush"),  val("ddp_psh_no_invalidate0")
316330887Snp	       );
317330887Snp  PR("   Buf1: %u      %u       %u    %u       %u\n",
318330887Snp	      val("ddp_buf1_indicate"),
319330887Snp	      val("ddp_pshf_enable_1"), val("ddp_push_disable_1"),
320330887Snp	      val("ddp_buf1_flush"),  val("ddp_psh_no_invalidate1")
321330887Snp	       );
322330887Snp
323330887Snp
324330887Snp
325330887Snp
326330887Snp
327330887Snp
328330887Snp
329330887Snp
330330887Snp
331330887Snp
332330887Snp  PR("        Valid  Offset   Length    Tag\n");
333330887Snp  PR("   Buf0:  %u    0x%6.6x 0x%6.6x  0x%8.8x",
334330887Snp	      val("ddp_buf0_valid"),val("rx_ddp_buf0_offset"),
335330887Snp	      val("rx_ddp_buf0_len"),val("rx_ddp_buf0_tag")
336330887Snp
337330887Snp
338330887Snp	       );
339330887Snp  if      (0==val("ddp_off") && 1==val("ddp_buf0_valid") && 0==val("ddp_active_buf")) {
340330887Snp    PR("   (Active)\n");
341330887Snp  } else {
342330887Snp    PR(" (Inactive)\n");
343330887Snp  }
344330887Snp
345330887Snp
346330887Snp  PR("   Buf1:  %u    0x%6.6x 0x%6.6x  0x%8.8x",
347330887Snp	      val("ddp_buf1_valid"),val("rx_ddp_buf1_offset"),
348330887Snp	      val("rx_ddp_buf1_len"),val("rx_ddp_buf1_tag")
349330887Snp
350330887Snp
351330887Snp	       );
352330887Snp
353330887Snp
354330887Snp  if      (0==val("ddp_off") && 1==val("ddp_buf1_valid") && 1==val("ddp_active_buf")) {
355330887Snp    PR("   (Active)\n");
356330887Snp  } else {
357330887Snp    PR(" (Inactive)\n");
358330887Snp  }
359330887Snp
360330887Snp
361330887Snp
362330887Snp
363330887Snp
364330887Snp
365330887Snp  if    (1==val("ddp_off")) {
366330887Snp    PR("   DDP is off (which also disables indicate)\n");
367330887Snp  } else if (1==val("ddp_buf0_valid") && 0==val("ddp_active_buf")) {
368330887Snp    PR("   Data being DDP'ed to buf 0, ");
369330887Snp    PR("which has %u - %u = %u bytes of space left\n",
370330887Snp		val("rx_ddp_buf0_len"),val("rx_ddp_buf0_offset"),
371330887Snp		val("rx_ddp_buf0_len")-val("rx_ddp_buf0_offset")
372330887Snp	       );
373330887Snp    if (1==val("ddp_buf1_valid")) {
374330887Snp      PR("   And buf1, which is also valid, has %u - %u = %u bytes of space left\n",
375330887Snp		  val("rx_ddp_buf1_len"),val("rx_ddp_buf1_offset"),
376330887Snp		  val("rx_ddp_buf1_len")-val("rx_ddp_buf1_offset")
377330887Snp		 );
378330887Snp    }
379330887Snp  } else if (1==val("ddp_buf1_valid") && 1==val("ddp_active_buf")) {
380330887Snp    PR("   Data being DDP'ed to buf 1, ");
381330887Snp    PR("which has %u - %u = %u bytes of space left\n",
382330887Snp		val("rx_ddp_buf1_len"),val("rx_ddp_buf1_offset"),
383330887Snp		val("rx_ddp_buf1_len")-val("rx_ddp_buf1_offset")
384330887Snp	       );
385330887Snp    if (1==val("ddp_buf0_valid")) {
386330887Snp      PR("   And buf0, which is also valid, has %u - %u = %u bytes of space left\n",
387330887Snp		  val("rx_ddp_buf0_len"),val("rx_ddp_buf0_offset"),
388330887Snp		  val("rx_ddp_buf0_len")-val("rx_ddp_buf0_offset")
389330887Snp		 );
390330887Snp    }
391330887Snp  } else if (0==val("ddp_buf0_valid") && 1==val("ddp_buf1_valid") && 0==val("ddp_active_buf")) {
392330887Snp    PR("   !!! Invalid DDP buf 1 valid, but buf 0 active.\n");
393330887Snp  } else if (1==val("ddp_buf0_valid") && 0==val("ddp_buf1_valid") && 1==val("ddp_active_buf")) {
394330887Snp    PR("   !!! Invalid DDP buf 0 valid, but buf 1 active.\n");
395330887Snp  } else {
396330887Snp    PR("   DDP is enabled, but no buffers are active && valid.\n");
397330887Snp
398330887Snp
399330887Snp
400330887Snp
401330887Snp    if (0==val("ddp_indicate_out")) {
402330887Snp      if (0==val("ddp_buf0_indicate") && 0==val("ddp_buf1_indicate")) {
403330887Snp	PR("   0 length Indicate buffers ");
404330887Snp	if (0==val("rx_hdr_offset")) {
405330887Snp	  PR("will cause new data to be held in PMRX.\n");
406330887Snp	} else {
407330887Snp	  PR("is causing %u bytes to be held in PMRX\n",
408330887Snp		      val("rx_hdr_offset"));
409330887Snp	}
410330887Snp      } else {
411330887Snp	PR("   Data being indicated to host\n");
412330887Snp      }
413330887Snp    } else if (1==val("ddp_indicate_out")) {
414330887Snp      PR("   Indicate is off, which ");
415330887Snp      if (0==val("rx_hdr_offset")) {
416330887Snp	PR("will cause new data to be held in PMRX.\n");
417330887Snp      } else {
418330887Snp	PR("is causing %u bytes to be held in PMRX\n",
419330887Snp		    val("rx_hdr_offset"));
420330887Snp      }
421330887Snp    }
422330887Snp  }
423330887Snp
424330887Snp
425330887Snp
426330887Snp
427330887Snp}
428