From c6b2d05d26a25fc9ba85de3aec69b0e54e2b67b7 Mon Sep 17 00:00:00 2001 From: rakesh goyal Date: Sun, 26 Apr 2020 14:50:12 +0530 Subject: [PATCH] nvethernet: dump all registers Dump all valid ethernet IP registers Bug 200563382 Change-Id: I34ce3c1dc5c2c4e12040d2d349e2ad63ec8bca8b Signed-off-by: rakesh goyal Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2338198 Reviewed-by: automaticguardword Reviewed-by: Bhadram Varka Reviewed-by: Bitan Biswas Reviewed-by: mobile promotions Tested-by: mobile promotions GVS: Gerrit_Virtual_Submit --- .../ethernet/nvidia/nvethernet/ether_linux.h | 2 + .../net/ethernet/nvidia/nvethernet/sysfs.c | 60 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h index 9bafd6e8..aaca3590 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h +++ b/drivers/net/ethernet/nvidia/nvethernet/ether_linux.h @@ -380,6 +380,8 @@ struct ether_priv_data { struct dentry *dbgfs_hw_feat; /** Descriptor dump debug fs pointer */ struct dentry *dbgfs_desc_dump; + /** Register dump debug fs pointer */ + struct dentry *dbgfs_reg_dump; #endif }; diff --git a/drivers/net/ethernet/nvidia/nvethernet/sysfs.c b/drivers/net/ethernet/nvidia/nvethernet/sysfs.c index 8f7175aa..8ceca1e0 100644 --- a/drivers/net/ethernet/nvidia/nvethernet/sysfs.c +++ b/drivers/net/ethernet/nvidia/nvethernet/sysfs.c @@ -16,6 +16,11 @@ #include "ether_linux.h" +#ifdef CONFIG_DEBUG_FS +/* As per IAS Docs */ +#define EOQS_MAX_REGISTER_ADDRESS 0x12FC +#endif + /** * @brief Shows the current setting of MAC loopback * @@ -590,6 +595,49 @@ static const struct file_operations ether_desc_dump_fops = { .release = single_release, }; +static int ether_register_dump_read(struct seq_file *seq, void *v) +{ + struct net_device *ndev = seq->private; + struct ether_priv_data *pdata = netdev_priv(ndev); + struct osi_core_priv_data *osi_core = pdata->osi_core; + int max_address = 0x0; + int start_addr = 0x0; + + max_address = EOQS_MAX_REGISTER_ADDRESS; + + /* Interface is not up so register dump not allowed */ + if (!netif_running(ndev)) { + dev_err(pdata->dev, "Not Allowed. Ether interface is not up\n"); + return -EBUSY; + } + + while (1) { + seq_printf(seq, + "\t Register offset 0x%x value 0x%x\n", + start_addr, + ioread32((void *)osi_core->base + start_addr)); + start_addr += 4; + + if (start_addr > max_address) + break; + } + + return 0; +} + +static int ether_register_dump_open(struct inode *inode, struct file *file) +{ + return single_open(file, ether_register_dump_read, inode->i_private); +} + +static const struct file_operations ether_register_dump_fops = { + .owner = THIS_MODULE, + .open = ether_register_dump_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + static int ether_create_debugfs(struct ether_priv_data *pdata) { char *buf; @@ -632,6 +680,18 @@ static int ether_create_debugfs(struct ether_priv_data *pdata) goto exit; } + pdata->dbgfs_reg_dump = debugfs_create_file("register_dump", S_IRUGO, + pdata->dbgfs_dir, + pdata->ndev, + ðer_register_dump_fops); + if (!pdata->dbgfs_reg_dump) { + netdev_err(pdata->ndev, + "failed to create rgister dump debugfs\n"); + debugfs_remove_recursive(pdata->dbgfs_dir); + ret = -ENOMEM; + goto exit; + } + exit: kfree(buf); return ret;