aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHariprasad Shenai <hariprasad@chelsio.com>2015-01-27 03:17:49 -0500
committerDavid S. Miller <davem@davemloft.net>2015-01-27 03:15:02 -0500
commitb58b667687b71e1f07190ba5faa66e80013eaac6 (patch)
tree942f6246951b450195861964c2b7bdfe4a71db8d
parentb3bbe36a26d056cc0b64bb2ee72c9e34c4e8683a (diff)
cxgb4: Added support in debugfs to dump different timer and clock values of the adapter
Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c63
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/t4_regs.h23
2 files changed, 86 insertions, 0 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
index df90c78fb6cc..47c0869f34ca 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
@@ -380,6 +380,68 @@ static const struct file_operations pm_stats_debugfs_fops = {
380 .write = pm_stats_clear 380 .write = pm_stats_clear
381}; 381};
382 382
383/* Format a value in a unit that differs from the value's native unit by the
384 * given factor.
385 */
386static char *unit_conv(char *buf, size_t len, unsigned int val,
387 unsigned int factor)
388{
389 unsigned int rem = val % factor;
390
391 if (rem == 0) {
392 snprintf(buf, len, "%u", val / factor);
393 } else {
394 while (rem % 10 == 0)
395 rem /= 10;
396 snprintf(buf, len, "%u.%u", val / factor, rem);
397 }
398 return buf;
399}
400
401static int clk_show(struct seq_file *seq, void *v)
402{
403 char buf[32];
404 struct adapter *adap = seq->private;
405 unsigned int cclk_ps = 1000000000 / adap->params.vpd.cclk; /* in ps */
406 u32 res = t4_read_reg(adap, TP_TIMER_RESOLUTION_A);
407 unsigned int tre = TIMERRESOLUTION_G(res);
408 unsigned int dack_re = DELAYEDACKRESOLUTION_G(res);
409 unsigned long long tp_tick_us = (cclk_ps << tre) / 1000000; /* in us */
410
411 seq_printf(seq, "Core clock period: %s ns\n",
412 unit_conv(buf, sizeof(buf), cclk_ps, 1000));
413 seq_printf(seq, "TP timer tick: %s us\n",
414 unit_conv(buf, sizeof(buf), (cclk_ps << tre), 1000000));
415 seq_printf(seq, "TCP timestamp tick: %s us\n",
416 unit_conv(buf, sizeof(buf),
417 (cclk_ps << TIMESTAMPRESOLUTION_G(res)), 1000000));
418 seq_printf(seq, "DACK tick: %s us\n",
419 unit_conv(buf, sizeof(buf), (cclk_ps << dack_re), 1000000));
420 seq_printf(seq, "DACK timer: %u us\n",
421 ((cclk_ps << dack_re) / 1000000) *
422 t4_read_reg(adap, TP_DACK_TIMER_A));
423 seq_printf(seq, "Retransmit min: %llu us\n",
424 tp_tick_us * t4_read_reg(adap, TP_RXT_MIN_A));
425 seq_printf(seq, "Retransmit max: %llu us\n",
426 tp_tick_us * t4_read_reg(adap, TP_RXT_MAX_A));
427 seq_printf(seq, "Persist timer min: %llu us\n",
428 tp_tick_us * t4_read_reg(adap, TP_PERS_MIN_A));
429 seq_printf(seq, "Persist timer max: %llu us\n",
430 tp_tick_us * t4_read_reg(adap, TP_PERS_MAX_A));
431 seq_printf(seq, "Keepalive idle timer: %llu us\n",
432 tp_tick_us * t4_read_reg(adap, TP_KEEP_IDLE_A));
433 seq_printf(seq, "Keepalive interval: %llu us\n",
434 tp_tick_us * t4_read_reg(adap, TP_KEEP_INTVL_A));
435 seq_printf(seq, "Initial SRTT: %llu us\n",
436 tp_tick_us * INITSRTT_G(t4_read_reg(adap, TP_INIT_SRTT_A)));
437 seq_printf(seq, "FINWAIT2 timer: %llu us\n",
438 tp_tick_us * t4_read_reg(adap, TP_FINWAIT2_TIMER_A));
439
440 return 0;
441}
442
443DEFINE_SIMPLE_DEBUGFS_FILE(clk);
444
383/* Firmware Device Log dump. */ 445/* Firmware Device Log dump. */
384static const char * const devlog_level_strings[] = { 446static const char * const devlog_level_strings[] = {
385 [FW_DEVLOG_LEVEL_EMERG] = "EMERG", 447 [FW_DEVLOG_LEVEL_EMERG] = "EMERG",
@@ -1478,6 +1540,7 @@ int t4_setup_debugfs(struct adapter *adap)
1478 static struct t4_debugfs_entry t4_debugfs_files[] = { 1540 static struct t4_debugfs_entry t4_debugfs_files[] = {
1479 { "cim_la", &cim_la_fops, S_IRUSR, 0 }, 1541 { "cim_la", &cim_la_fops, S_IRUSR, 0 },
1480 { "cim_qcfg", &cim_qcfg_fops, S_IRUSR, 0 }, 1542 { "cim_qcfg", &cim_qcfg_fops, S_IRUSR, 0 },
1543 { "clk", &clk_debugfs_fops, S_IRUSR, 0 },
1481 { "devlog", &devlog_fops, S_IRUSR, 0 }, 1544 { "devlog", &devlog_fops, S_IRUSR, 0 },
1482 { "l2t", &t4_l2t_fops, S_IRUSR, 0}, 1545 { "l2t", &t4_l2t_fops, S_IRUSR, 0},
1483 { "mps_tcam", &mps_tcam_debugfs_fops, S_IRUSR, 0 }, 1546 { "mps_tcam", &mps_tcam_debugfs_fops, S_IRUSR, 0 },
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_regs.h b/drivers/net/ethernet/chelsio/cxgb4/t4_regs.h
index 7aa0db137df6..940b56cd5caa 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/t4_regs.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/t4_regs.h
@@ -1203,12 +1203,35 @@
1203#define TIMERRESOLUTION_M 0xffU 1203#define TIMERRESOLUTION_M 0xffU
1204#define TIMERRESOLUTION_G(x) (((x) >> TIMERRESOLUTION_S) & TIMERRESOLUTION_M) 1204#define TIMERRESOLUTION_G(x) (((x) >> TIMERRESOLUTION_S) & TIMERRESOLUTION_M)
1205 1205
1206#define TIMESTAMPRESOLUTION_S 8
1207#define TIMESTAMPRESOLUTION_M 0xffU
1208#define TIMESTAMPRESOLUTION_G(x) \
1209 (((x) >> TIMESTAMPRESOLUTION_S) & TIMESTAMPRESOLUTION_M)
1210
1206#define DELAYEDACKRESOLUTION_S 0 1211#define DELAYEDACKRESOLUTION_S 0
1207#define DELAYEDACKRESOLUTION_M 0xffU 1212#define DELAYEDACKRESOLUTION_M 0xffU
1208#define DELAYEDACKRESOLUTION_G(x) \ 1213#define DELAYEDACKRESOLUTION_G(x) \
1209 (((x) >> DELAYEDACKRESOLUTION_S) & DELAYEDACKRESOLUTION_M) 1214 (((x) >> DELAYEDACKRESOLUTION_S) & DELAYEDACKRESOLUTION_M)
1210 1215
1211#define TP_SHIFT_CNT_A 0x7dc0 1216#define TP_SHIFT_CNT_A 0x7dc0
1217#define TP_RXT_MIN_A 0x7d98
1218#define TP_RXT_MAX_A 0x7d9c
1219#define TP_PERS_MIN_A 0x7da0
1220#define TP_PERS_MAX_A 0x7da4
1221#define TP_KEEP_IDLE_A 0x7da8
1222#define TP_KEEP_INTVL_A 0x7dac
1223#define TP_INIT_SRTT_A 0x7db0
1224#define TP_DACK_TIMER_A 0x7db4
1225#define TP_FINWAIT2_TIMER_A 0x7db8
1226
1227#define INITSRTT_S 0
1228#define INITSRTT_M 0xffffU
1229#define INITSRTT_G(x) (((x) >> INITSRTT_S) & INITSRTT_M)
1230
1231#define PERSMAX_S 0
1232#define PERSMAX_M 0x3fffffffU
1233#define PERSMAX_V(x) ((x) << PERSMAX_S)
1234#define PERSMAX_G(x) (((x) >> PERSMAX_S) & PERSMAX_M)
1212 1235
1213#define SYNSHIFTMAX_S 24 1236#define SYNSHIFTMAX_S 24
1214#define SYNSHIFTMAX_M 0xffU 1237#define SYNSHIFTMAX_M 0xffU