Commit 466c5ac8 authored by Mathieu Olivari's avatar Mathieu Olivari Committed by David S. Miller

net: stmmac: create one debugfs dir per net-device

stmmac DebugFS entries are currently global to the driver. As a result,
having more than one stmmac device in the system creates the following
error:
* ERROR stmmaceth, debugfs create directory failed
* stmmac_hw_setup: failed debugFS registration

This also results in being able to access the debugfs information for
the first registered device only.

This patch changes the debugfs structure to have one sub-directory per
net-device. Files under "/sys/kernel/debug/stmmaceth" will now show-up
under /sys/kernel/debug/stmmaceth/ethN/.
Signed-off-by: default avatarMathieu Olivari <mathieu@codeaurora.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5369c71f
...@@ -117,6 +117,12 @@ struct stmmac_priv { ...@@ -117,6 +117,12 @@ struct stmmac_priv {
int use_riwt; int use_riwt;
int irq_wake; int irq_wake;
spinlock_t ptp_lock; spinlock_t ptp_lock;
#ifdef CONFIG_DEBUG_FS
struct dentry *dbgfs_dir;
struct dentry *dbgfs_rings_status;
struct dentry *dbgfs_dma_cap;
#endif
}; };
int stmmac_mdio_unregister(struct net_device *ndev); int stmmac_mdio_unregister(struct net_device *ndev);
......
...@@ -118,7 +118,7 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id); ...@@ -118,7 +118,7 @@ static irqreturn_t stmmac_interrupt(int irq, void *dev_id);
#ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS
static int stmmac_init_fs(struct net_device *dev); static int stmmac_init_fs(struct net_device *dev);
static void stmmac_exit_fs(void); static void stmmac_exit_fs(struct net_device *dev);
#endif #endif
#define STMMAC_COAL_TIMER(x) (jiffies + usecs_to_jiffies(x)) #define STMMAC_COAL_TIMER(x) (jiffies + usecs_to_jiffies(x))
...@@ -1916,7 +1916,7 @@ static int stmmac_release(struct net_device *dev) ...@@ -1916,7 +1916,7 @@ static int stmmac_release(struct net_device *dev)
netif_carrier_off(dev); netif_carrier_off(dev);
#ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS
stmmac_exit_fs(); stmmac_exit_fs(dev);
#endif #endif
stmmac_release_ptp(priv); stmmac_release_ptp(priv);
...@@ -2508,8 +2508,6 @@ static int stmmac_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ...@@ -2508,8 +2508,6 @@ static int stmmac_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
#ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS
static struct dentry *stmmac_fs_dir; static struct dentry *stmmac_fs_dir;
static struct dentry *stmmac_rings_status;
static struct dentry *stmmac_dma_cap;
static void sysfs_display_ring(void *head, int size, int extend_desc, static void sysfs_display_ring(void *head, int size, int extend_desc,
struct seq_file *seq) struct seq_file *seq)
...@@ -2648,36 +2646,39 @@ static const struct file_operations stmmac_dma_cap_fops = { ...@@ -2648,36 +2646,39 @@ static const struct file_operations stmmac_dma_cap_fops = {
static int stmmac_init_fs(struct net_device *dev) static int stmmac_init_fs(struct net_device *dev)
{ {
/* Create debugfs entries */ struct stmmac_priv *priv = netdev_priv(dev);
stmmac_fs_dir = debugfs_create_dir(STMMAC_RESOURCE_NAME, NULL);
/* Create per netdev entries */
priv->dbgfs_dir = debugfs_create_dir(dev->name, stmmac_fs_dir);
if (!stmmac_fs_dir || IS_ERR(stmmac_fs_dir)) { if (!priv->dbgfs_dir || IS_ERR(priv->dbgfs_dir)) {
pr_err("ERROR %s, debugfs create directory failed\n", pr_err("ERROR %s/%s, debugfs create directory failed\n",
STMMAC_RESOURCE_NAME); STMMAC_RESOURCE_NAME, dev->name);
return -ENOMEM; return -ENOMEM;
} }
/* Entry to report DMA RX/TX rings */ /* Entry to report DMA RX/TX rings */
stmmac_rings_status = debugfs_create_file("descriptors_status", priv->dbgfs_rings_status =
S_IRUGO, stmmac_fs_dir, dev, debugfs_create_file("descriptors_status", S_IRUGO,
&stmmac_rings_status_fops); priv->dbgfs_dir, dev,
&stmmac_rings_status_fops);
if (!stmmac_rings_status || IS_ERR(stmmac_rings_status)) { if (!priv->dbgfs_rings_status || IS_ERR(priv->dbgfs_rings_status)) {
pr_info("ERROR creating stmmac ring debugfs file\n"); pr_info("ERROR creating stmmac ring debugfs file\n");
debugfs_remove(stmmac_fs_dir); debugfs_remove_recursive(priv->dbgfs_dir);
return -ENOMEM; return -ENOMEM;
} }
/* Entry to report the DMA HW features */ /* Entry to report the DMA HW features */
stmmac_dma_cap = debugfs_create_file("dma_cap", S_IRUGO, stmmac_fs_dir, priv->dbgfs_dma_cap = debugfs_create_file("dma_cap", S_IRUGO,
dev, &stmmac_dma_cap_fops); priv->dbgfs_dir,
dev, &stmmac_dma_cap_fops);
if (!stmmac_dma_cap || IS_ERR(stmmac_dma_cap)) { if (!priv->dbgfs_dma_cap || IS_ERR(priv->dbgfs_dma_cap)) {
pr_info("ERROR creating stmmac MMC debugfs file\n"); pr_info("ERROR creating stmmac MMC debugfs file\n");
debugfs_remove(stmmac_rings_status); debugfs_remove_recursive(priv->dbgfs_dir);
debugfs_remove(stmmac_fs_dir);
return -ENOMEM; return -ENOMEM;
} }
...@@ -2685,11 +2686,11 @@ static int stmmac_init_fs(struct net_device *dev) ...@@ -2685,11 +2686,11 @@ static int stmmac_init_fs(struct net_device *dev)
return 0; return 0;
} }
static void stmmac_exit_fs(void) static void stmmac_exit_fs(struct net_device *dev)
{ {
debugfs_remove(stmmac_rings_status); struct stmmac_priv *priv = netdev_priv(dev);
debugfs_remove(stmmac_dma_cap);
debugfs_remove(stmmac_fs_dir); debugfs_remove_recursive(priv->dbgfs_dir);
} }
#endif /* CONFIG_DEBUG_FS */ #endif /* CONFIG_DEBUG_FS */
...@@ -3149,6 +3150,35 @@ static int __init stmmac_cmdline_opt(char *str) ...@@ -3149,6 +3150,35 @@ static int __init stmmac_cmdline_opt(char *str)
__setup("stmmaceth=", stmmac_cmdline_opt); __setup("stmmaceth=", stmmac_cmdline_opt);
#endif /* MODULE */ #endif /* MODULE */
static int __init stmmac_init(void)
{
#ifdef CONFIG_DEBUG_FS
/* Create debugfs main directory if it doesn't exist yet */
if (!stmmac_fs_dir) {
stmmac_fs_dir = debugfs_create_dir(STMMAC_RESOURCE_NAME, NULL);
if (!stmmac_fs_dir || IS_ERR(stmmac_fs_dir)) {
pr_err("ERROR %s, debugfs create directory failed\n",
STMMAC_RESOURCE_NAME);
return -ENOMEM;
}
}
#endif
return 0;
}
static void __exit stmmac_exit(void)
{
#ifdef CONFIG_DEBUG_FS
debugfs_remove_recursive(stmmac_fs_dir);
#endif
}
module_init(stmmac_init)
module_exit(stmmac_exit)
MODULE_DESCRIPTION("STMMAC 10/100/1000 Ethernet device driver"); MODULE_DESCRIPTION("STMMAC 10/100/1000 Ethernet device driver");
MODULE_AUTHOR("Giuseppe Cavallaro <peppe.cavallaro@st.com>"); MODULE_AUTHOR("Giuseppe Cavallaro <peppe.cavallaro@st.com>");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment