Commit d319a7cf authored by Arend van Spriel's avatar Arend van Spriel Committed by John W. Linville

brcmfmac: add debugfs helper functions

This patch adds debugfs support to brcmfmac. It provide helper functions
to setup the debugfs folder structure for the driver, which has following
hierarchy:

<debugfs_mount>/brcmfmac/<dev_name>/

ie.: /sys/kernel/debug/brcmfmac/mmc0:0001:2/

The new source file provides functions to create and remove the two
folders and a function to retrieve the device-specific folder so files
can be created in it.
Reviewed-by: default avatarPieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: default avatarFranky (Zhenhui) Lin <frankyl@broadcom.com>
Signed-off-by: default avatarArend van Spriel <arend@broadcom.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 5e16e8ee
...@@ -34,3 +34,5 @@ brcmfmac-$(CONFIG_BRCMFMAC_SDIO) += \ ...@@ -34,3 +34,5 @@ brcmfmac-$(CONFIG_BRCMFMAC_SDIO) += \
sdio_chip.o sdio_chip.o
brcmfmac-$(CONFIG_BRCMFMAC_USB) += \ brcmfmac-$(CONFIG_BRCMFMAC_USB) += \
usb.o usb.o
brcmfmac-$(CONFIG_BRCMDBG) += \
dhd_dbg.o
\ No newline at end of file
...@@ -613,6 +613,9 @@ struct brcmf_pub { ...@@ -613,6 +613,9 @@ struct brcmf_pub {
struct work_struct multicast_work; struct work_struct multicast_work;
u8 macvalue[ETH_ALEN]; u8 macvalue[ETH_ALEN];
atomic_t pend_8021x_cnt; atomic_t pend_8021x_cnt;
#ifdef DEBUG
struct dentry *dbgfs_dir;
#endif
}; };
struct brcmf_if_event { struct brcmf_if_event {
......
/*
* Copyright (c) 2012 Broadcom Corporation
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <linux/debugfs.h>
#include <linux/if_ether.h>
#include <linux/if.h>
#include <linux/ieee80211.h>
#include <defs.h>
#include <brcmu_wifi.h>
#include <brcmu_utils.h>
#include "dhd.h"
#include "dhd_bus.h"
static struct dentry *root_folder;
void brcmf_debugfs_init(void)
{
root_folder = debugfs_create_dir(KBUILD_MODNAME, NULL);
if (IS_ERR(root_folder))
root_folder = NULL;
}
void brcmf_debugfs_exit(void)
{
if (!root_folder)
return;
debugfs_remove_recursive(root_folder);
root_folder = NULL;
}
int brcmf_debugfs_attach(struct brcmf_pub *drvr)
{
if (!root_folder)
return -ENODEV;
drvr->dbgfs_dir = debugfs_create_dir(dev_name(drvr->dev), root_folder);
return PTR_RET(drvr->dbgfs_dir);
}
void brcmf_debugfs_detach(struct brcmf_pub *drvr)
{
if (!IS_ERR_OR_NULL(drvr->dbgfs_dir))
debugfs_remove_recursive(drvr->dbgfs_dir);
}
struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr)
{
return drvr->dbgfs_dir;
}
...@@ -76,4 +76,27 @@ do { \ ...@@ -76,4 +76,27 @@ do { \
extern int brcmf_msg_level; extern int brcmf_msg_level;
struct brcmf_pub;
#ifdef DEBUG
void brcmf_debugfs_init(void);
void brcmf_debugfs_exit(void);
int brcmf_debugfs_attach(struct brcmf_pub *drvr);
void brcmf_debugfs_detach(struct brcmf_pub *drvr);
struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr);
#else
static inline void brcmf_debugfs_init(void)
{
}
static inline void brcmf_debugfs_exit(void)
{
}
static inline int brcmf_debugfs_attach(struct brcmf_pub *drvr)
{
return 0;
}
static inline void brcmf_debugfs_detach(struct brcmf_pub *drvr)
{
}
#endif
#endif /* _BRCMF_DBG_H_ */ #endif /* _BRCMF_DBG_H_ */
...@@ -1007,6 +1007,9 @@ int brcmf_attach(uint bus_hdrlen, struct device *dev) ...@@ -1007,6 +1007,9 @@ int brcmf_attach(uint bus_hdrlen, struct device *dev)
drvr->bus_if->drvr = drvr; drvr->bus_if->drvr = drvr;
drvr->dev = dev; drvr->dev = dev;
/* create device debugfs folder */
brcmf_debugfs_attach(drvr);
/* Attach and link in the protocol */ /* Attach and link in the protocol */
ret = brcmf_proto_attach(drvr); ret = brcmf_proto_attach(drvr);
if (ret != 0) { if (ret != 0) {
...@@ -1123,6 +1126,7 @@ void brcmf_detach(struct device *dev) ...@@ -1123,6 +1126,7 @@ void brcmf_detach(struct device *dev)
brcmf_proto_detach(drvr); brcmf_proto_detach(drvr);
} }
brcmf_debugfs_detach(drvr);
bus_if->drvr = NULL; bus_if->drvr = NULL;
kfree(drvr); kfree(drvr);
} }
...@@ -1192,6 +1196,8 @@ int brcmf_write_to_file(struct brcmf_pub *drvr, const u8 *buf, int size) ...@@ -1192,6 +1196,8 @@ int brcmf_write_to_file(struct brcmf_pub *drvr, const u8 *buf, int size)
static void brcmf_driver_init(struct work_struct *work) static void brcmf_driver_init(struct work_struct *work)
{ {
brcmf_debugfs_init();
#ifdef CONFIG_BRCMFMAC_SDIO #ifdef CONFIG_BRCMFMAC_SDIO
brcmf_sdio_init(); brcmf_sdio_init();
#endif #endif
...@@ -1219,6 +1225,7 @@ static void __exit brcmfmac_module_exit(void) ...@@ -1219,6 +1225,7 @@ static void __exit brcmfmac_module_exit(void)
#ifdef CONFIG_BRCMFMAC_USB #ifdef CONFIG_BRCMFMAC_USB
brcmf_usb_exit(); brcmf_usb_exit();
#endif #endif
brcmf_debugfs_exit();
} }
module_init(brcmfmac_module_init); module_init(brcmfmac_module_init);
......
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