mlx5_core: Improve debugfs readability
authorEli Cohen <eli@dev.mellanox.co.il>
Tue, 14 Jan 2014 15:45:19 +0000 (17:45 +0200)
committerRoland Dreier <roland@purestorage.com>
Thu, 23 Jan 2014 07:23:50 +0000 (23:23 -0800)
Use strings to display transport service or state of QPs.  Use numeric
value for MTU of a QP.

Signed-off-by: Eli Cohen <eli@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/net/ethernet/mellanox/mlx5/core/debugfs.c
include/linux/mlx5/qp.h

index 80f6d12..10e1f1a 100644 (file)
@@ -275,7 +275,7 @@ void mlx5_cq_debugfs_cleanup(struct mlx5_core_dev *dev)
 }
 
 static u64 qp_read_field(struct mlx5_core_dev *dev, struct mlx5_core_qp *qp,
-                        int index)
+                        int index, int *is_str)
 {
        struct mlx5_query_qp_mbox_out *out;
        struct mlx5_qp_context *ctx;
@@ -293,19 +293,40 @@ static u64 qp_read_field(struct mlx5_core_dev *dev, struct mlx5_core_qp *qp,
                goto out;
        }
 
+       *is_str = 0;
        ctx = &out->ctx;
        switch (index) {
        case QP_PID:
                param = qp->pid;
                break;
        case QP_STATE:
-               param = be32_to_cpu(ctx->flags) >> 28;
+               param = (u64)mlx5_qp_state_str(be32_to_cpu(ctx->flags) >> 28);
+               *is_str = 1;
                break;
        case QP_XPORT:
-               param = (be32_to_cpu(ctx->flags) >> 16) & 0xff;
+               param = (u64)mlx5_qp_type_str((be32_to_cpu(ctx->flags) >> 16) & 0xff);
+               *is_str = 1;
                break;
        case QP_MTU:
-               param = ctx->mtu_msgmax >> 5;
+               switch (ctx->mtu_msgmax >> 5) {
+               case IB_MTU_256:
+                       param = 256;
+                       break;
+               case IB_MTU_512:
+                       param = 512;
+                       break;
+               case IB_MTU_1024:
+                       param = 1024;
+                       break;
+               case IB_MTU_2048:
+                       param = 2048;
+                       break;
+               case IB_MTU_4096:
+                       param = 4096;
+                       break;
+               default:
+                       param = 0;
+               }
                break;
        case QP_N_RECV:
                param = 1 << ((ctx->rq_size_stride >> 3) & 0xf);
@@ -414,6 +435,7 @@ static ssize_t dbg_read(struct file *filp, char __user *buf, size_t count,
        struct mlx5_field_desc *desc;
        struct mlx5_rsc_debug *d;
        char tbuf[18];
+       int is_str = 0;
        u64 field;
        int ret;
 
@@ -424,7 +446,7 @@ static ssize_t dbg_read(struct file *filp, char __user *buf, size_t count,
        d = (void *)(desc - desc->i) - sizeof(*d);
        switch (d->type) {
        case MLX5_DBG_RSC_QP:
-               field = qp_read_field(d->dev, d->object, desc->i);
+               field = qp_read_field(d->dev, d->object, desc->i, &is_str);
                break;
 
        case MLX5_DBG_RSC_EQ:
@@ -440,7 +462,12 @@ static ssize_t dbg_read(struct file *filp, char __user *buf, size_t count,
                return -EINVAL;
        }
 
-       ret = snprintf(tbuf, sizeof(tbuf), "0x%llx\n", field);
+
+       if (is_str)
+               ret = snprintf(tbuf, sizeof(tbuf), "%s\n", (const char *)field);
+       else
+               ret = snprintf(tbuf, sizeof(tbuf), "0x%llx\n", field);
+
        if (ret > 0) {
                if (copy_to_user(buf, tbuf, ret))
                        return -EFAULT;
index d9e3eac..d51eff7 100644 (file)
@@ -464,4 +464,49 @@ void mlx5_cleanup_qp_table(struct mlx5_core_dev *dev);
 int mlx5_debug_qp_add(struct mlx5_core_dev *dev, struct mlx5_core_qp *qp);
 void mlx5_debug_qp_remove(struct mlx5_core_dev *dev, struct mlx5_core_qp *qp);
 
+static inline const char *mlx5_qp_type_str(int type)
+{
+       switch (type) {
+       case MLX5_QP_ST_RC: return "RC";
+       case MLX5_QP_ST_UC: return "C";
+       case MLX5_QP_ST_UD: return "UD";
+       case MLX5_QP_ST_XRC: return "XRC";
+       case MLX5_QP_ST_MLX: return "MLX";
+       case MLX5_QP_ST_QP0: return "QP0";
+       case MLX5_QP_ST_QP1: return "QP1";
+       case MLX5_QP_ST_RAW_ETHERTYPE: return "RAW_ETHERTYPE";
+       case MLX5_QP_ST_RAW_IPV6: return "RAW_IPV6";
+       case MLX5_QP_ST_SNIFFER: return "SNIFFER";
+       case MLX5_QP_ST_SYNC_UMR: return "SYNC_UMR";
+       case MLX5_QP_ST_PTP_1588: return "PTP_1588";
+       case MLX5_QP_ST_REG_UMR: return "REG_UMR";
+       default: return "Invalid transport type";
+       }
+}
+
+static inline const char *mlx5_qp_state_str(int state)
+{
+       switch (state) {
+       case MLX5_QP_STATE_RST:
+       return "RST";
+       case MLX5_QP_STATE_INIT:
+       return "INIT";
+       case MLX5_QP_STATE_RTR:
+       return "RTR";
+       case MLX5_QP_STATE_RTS:
+       return "RTS";
+       case MLX5_QP_STATE_SQER:
+       return "SQER";
+       case MLX5_QP_STATE_SQD:
+       return "SQD";
+       case MLX5_QP_STATE_ERR:
+       return "ERR";
+       case MLX5_QP_STATE_SQ_DRAINING:
+       return "SQ_DRAINING";
+       case MLX5_QP_STATE_SUSPENDED:
+       return "SUSPENDED";
+       default: return "Invalid QP state";
+       }
+}
+
 #endif /* MLX5_QP_H */