From: Jiri Pirko <j...@mellanox.com>

Signed-off-by: Jiri Pirko <j...@mellanox.com>
Signed-off-by: Ido Schimmel <ido...@mellanox.com>
Signed-off-by: Elad Raz <el...@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlxsw/core.c | 51 ++++++++++++++++++++++++++++--
 1 file changed, 48 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c 
b/drivers/net/ethernet/mellanox/mlxsw/core.c
index 0415ff6..6ee3f45 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
@@ -98,6 +98,12 @@ struct mlxsw_core {
                bool trans_active;
                struct mutex lock; /* One EMAD transaction at a time. */
                bool use_emad;
+               struct {
+                       u64 trans;
+                       u32 fails;
+                       u32 retries;
+                       u32 timeouts;
+               } stats;
        } emad;
        struct mlxsw_core_pcpu_stats __percpu *pcpu_stats;
        struct dentry *dbg_dir;
@@ -390,6 +396,7 @@ static int __mlxsw_emad_transmit(struct mlxsw_core 
*mlxsw_core,
                dev_warn(mlxsw_core->bus_info->dev, "EMAD timed-out 
(tid=%llx)\n",
                         mlxsw_core->emad.tid);
                mlxsw_core->emad.trans_active = false;
+               mlxsw_core->emad.stats.timeouts++;
                return -EIO;
        }
 
@@ -463,8 +470,10 @@ retry:
                if (!err || err != -EAGAIN)
                        goto out;
        }
-       if (n_retry++ < MLXSW_EMAD_MAX_RETRY)
+       if (n_retry++ < MLXSW_EMAD_MAX_RETRY) {
+               mlxsw_core->emad.stats.retries++;
                goto retry;
+       }
 
 out:
        dev_kfree_skb(skb);
@@ -671,6 +680,35 @@ static const struct file_operations 
mlxsw_core_rx_stats_dbg_ops = {
        .llseek = seq_lseek
 };
 
+static int mlxsw_core_emad_stats_dbg_read(struct seq_file *file, void *data)
+{
+       struct mlxsw_core *mlxsw_core = file->private;
+
+       if (mutex_lock_interruptible(&mlxsw_core->emad.lock))
+               return -EINTR;
+       seq_printf(file, "transactions: %llu\n", mlxsw_core->emad.stats.trans);
+       seq_printf(file, "fails: %u\n", mlxsw_core->emad.stats.fails);
+       seq_printf(file, "retries: %u\n", mlxsw_core->emad.stats.retries);
+       seq_printf(file, "timeouts: %u\n", mlxsw_core->emad.stats.timeouts);
+       mutex_unlock(&mlxsw_core->emad.lock);
+       return 0;
+}
+
+static int mlxsw_core_emad_stats_dbg_open(struct inode *inode, struct file *f)
+{
+       struct mlxsw_core *mlxsw_core = inode->i_private;
+
+       return single_open(f, mlxsw_core_emad_stats_dbg_read, mlxsw_core);
+}
+
+static const struct file_operations mlxsw_core_emad_stats_dbg_ops = {
+       .owner = THIS_MODULE,
+       .open = mlxsw_core_emad_stats_dbg_open,
+       .release = single_release,
+       .read = seq_read,
+       .llseek = seq_lseek
+};
+
 static void mlxsw_core_buf_dump_dbg(struct mlxsw_core *mlxsw_core,
                                    const char *buf, size_t size)
 {
@@ -768,6 +806,8 @@ static int mlxsw_core_debugfs_init(struct mlxsw_core 
*mlxsw_core)
        mlxsw_core->dbg.psid_blob.size = sizeof(bus_info->psid);
        debugfs_create_blob("psid", S_IRUGO, mlxsw_core->dbg_dir,
                            &mlxsw_core->dbg.psid_blob);
+       debugfs_create_file("emad_stats", S_IRUGO, mlxsw_core->dbg_dir,
+                           mlxsw_core, &mlxsw_core_emad_stats_dbg_ops);
        return 0;
 }
 
@@ -1107,8 +1147,10 @@ retry:
        err = mlxsw_cmd_access_reg(mlxsw_core, in_mbox, out_mbox);
        if (!err) {
                err = mlxsw_emad_process_status(mlxsw_core, out_mbox);
-               if (err == -EAGAIN && n_retry++ < MLXSW_EMAD_MAX_RETRY)
+               if (err == -EAGAIN && n_retry++ < MLXSW_EMAD_MAX_RETRY) {
+                       mlxsw_core->emad.stats.retries++;
                        goto retry;
+               }
        }
 
        if (!err)
@@ -1137,6 +1179,7 @@ static int mlxsw_core_reg_access(struct mlxsw_core 
*mlxsw_core,
                return -EINTR;
        }
 
+       mlxsw_core->emad.stats.trans++;
        cur_tid = mlxsw_core->emad.tid;
        dev_dbg(mlxsw_core->bus_info->dev, "Reg access 
(tid=%llx,reg_id=%x(%s),type=%s)\n",
                cur_tid, reg->id, mlxsw_reg_id_str(reg->id),
@@ -1153,10 +1196,12 @@ static int mlxsw_core_reg_access(struct mlxsw_core 
*mlxsw_core,
                err = mlxsw_core_reg_access_emad(mlxsw_core, reg,
                                                 payload, type);
 
-       if (err)
+       if (err) {
                dev_err(mlxsw_core->bus_info->dev, "Reg access failed 
(tid=%llx,reg_id=%x(%s),type=%s)\n",
                        cur_tid, reg->id, mlxsw_reg_id_str(reg->id),
                        mlxsw_core_reg_access_type_str(type));
+               mlxsw_core->emad.stats.fails++;
+       }
 
        mutex_unlock(&mlxsw_core->emad.lock);
        return err;
-- 
1.9.3

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to